-- -*-haskell-*- -- Vision (for the Voice): an XMMS2 client. -- -- Author: Oleg Belozeorov -- Created: 22 Jun. 2010 -- -- Copyright (C) 2010 Oleg Belozeorov -- -- This program is free software; you can redistribute it and/or -- modify it under the terms of the GNU General Public License as -- published by the Free Software Foundation; either version 3 of -- the License, or (at your option) any later version. -- -- This program is distributed in the hope that it will be useful, -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -- General Public License for more details. -- module Volume ( initVolume , makeVolumeControl ) where import Control.Monad.Trans import qualified Data.Map as Map import Graphics.UI.Gtk hiding (add, remove) import XMMS2.Client import XMMS import Handler import Utils import Context data Volume = Volume { vAdj :: Adjustment , vCid :: ConnectId Adjustment } adj = vAdj context cId = vCid context initVolume = do context <- initContext let ?context = context onServerConnectionAdd . ever $ \conn -> if conn then do playbackVolumeGet xmms >>* do handleVolume liftIO $ broadcastPlaybackVolumeChanged xmms >>* do handleVolume persist signalUnblock cId else do signalBlock cId withoutVolumeChange $ adjustmentSetValue adj 0 return ?context initContext = do adj <- adjustmentNew 0 0 100 5 5 0 cId <- adj `onValueChanged` do vol <- adjustmentGetValue adj setVolume $ round vol return $ augmentContext Volume { vAdj = adj, vCid = cId } makeVolumeControl = do view <- hScaleNew adj scaleSetDrawValue view False rangeSetUpdatePolicy view UpdateContinuous widgetSetCanFocus view False id <- onServerConnectionAdd . ever $ widgetSetSensitive view view `onDestroy` onServerConnection (remove id) return view handleVolume = do vol <- catchResult 0 (maximum . Map.elems) liftIO $ withoutVolumeChange $ adjustmentSetValue adj $ fromIntegral vol setVolume vol = playbackVolumeGet xmms >>* do vols <- catchResult Map.empty id liftIO $ mapM_ (flip (playbackVolumeSet xmms) vol) $ Map.keys vols withoutVolumeChange = bracket_ (signalBlock cId) (signalUnblock cId)