vision-0.0.2.4: src/Volume.hs
-- -*-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)