summaryrefslogtreecommitdiffhomepage
path: root/src/Plugins/Monitors/Volume.hs
diff options
context:
space:
mode:
authorThomas Tuegel <ttuegel@gmail.com>2011-01-13 10:34:09 -0600
committerThomas Tuegel <ttuegel@gmail.com>2011-01-13 10:36:41 -0600
commite3c9b33170f1064077aa8578342369657b9e059c (patch)
tree8478ba072b620a8da621828ce117139458c216d5 /src/Plugins/Monitors/Volume.hs
parentbfbbe753e83efa25bc3408e61fe86c6223e6c695 (diff)
downloadxmobar-e3c9b33170f1064077aa8578342369657b9e059c.tar.gz
xmobar-e3c9b33170f1064077aa8578342369657b9e059c.tar.bz2
Added volume monitor based on alsa-mixer.
Diffstat (limited to 'src/Plugins/Monitors/Volume.hs')
-rw-r--r--src/Plugins/Monitors/Volume.hs36
1 files changed, 36 insertions, 0 deletions
diff --git a/src/Plugins/Monitors/Volume.hs b/src/Plugins/Monitors/Volume.hs
new file mode 100644
index 0000000..c7814a8
--- /dev/null
+++ b/src/Plugins/Monitors/Volume.hs
@@ -0,0 +1,36 @@
+module Plugins.Monitors.Volume (runVolume, volumeConfig) where
+
+import Control.Monad ( liftM )
+import Data.Maybe
+import Plugins.Monitors.Common
+import Sound.ALSA.Mixer
+
+percent :: Integer -> Integer -> Integer -> Float
+percent v' lo' hi' = (v - lo) / (hi - lo)
+ where v = fromIntegral v'
+ lo = fromIntegral lo'
+ hi = fromIntegral hi'
+
+volumeConfig :: IO MConfig
+volumeConfig = mkMConfig "Vol: <volume>% <fc=green><on></fc><fc=red><off></fc>"
+ ["volume","dB","on","off"]
+
+runVolume :: String -> String -> [String] -> Monitor String
+runVolume mixerName controlName _ = do
+ control <- liftM fromJust $ io $ getControlByName mixerName controlName
+ let volumeControl = fromJust $ maybe (playback $ volume control) Just
+ (common $ volume control)
+ switchControl = fromJust $ maybe (playback $ switch control) Just
+ (common $ switch control)
+ (lo, hi) <- io $ getRange volumeControl
+ val <- liftM fromJust $ io $ getChannel FrontLeft $ value volumeControl
+ db <- liftM fromJust $ io $ getChannel FrontLeft $ dB volumeControl
+ sw <- liftM fromJust $ io $ getChannel FrontLeft $ switchControl
+ p <- showPercentsWithColors [ percent val lo hi ]
+ let d :: Double
+ d = fromIntegral db / 100.0
+ dStr = showDigits 2 d
+ parseTemplate $ p ++ [ dStr ]
+ ++ [ if sw then "[on] " else ""
+ , if sw then "" else "[off]"
+ ]