diff options
Diffstat (limited to 'src/Plugins')
| -rw-r--r-- | src/Plugins/Monitors.hs | 12 | ||||
| -rw-r--r-- | src/Plugins/Monitors/Volume.hs | 36 | 
2 files changed, 48 insertions, 0 deletions
diff --git a/src/Plugins/Monitors.hs b/src/Plugins/Monitors.hs index 9887d74..14d97a2 100644 --- a/src/Plugins/Monitors.hs +++ b/src/Plugins/Monitors.hs @@ -38,6 +38,9 @@ import Plugins.Monitors.Wireless  #ifdef LIBMPD  import Plugins.Monitors.MPD  #endif +#ifdef ALSA +import Plugins.Monitors.Volume +#endif  data Monitors = Weather  Station    Args Rate                | Network  Interface  Args Rate @@ -61,6 +64,9 @@ data Monitors = Weather  Station    Args Rate  #ifdef LIBMPD                | MPD      Args       Rate  #endif +#ifdef ALSA +              | Volume   String     String Args Rate +#endif                  deriving (Show,Read,Eq)  type Args      = [String] @@ -95,6 +101,9 @@ instance Exec Monitors where  #ifdef LIBMPD      alias (MPD        _ _) = "mpd"  #endif +#ifdef ALSA +    alias (Volume m c _ _) = m ++ ":" ++ c +#endif      start (Weather  s a r) = runM (a ++ [s]) weatherConfig  runWeather    r      start (Network  i a r) = runM (a ++ [i]) netConfig      runNet        r      start (Thermal  z a r) = runM (a ++ [z]) thermalConfig  runThermal    r @@ -117,3 +126,6 @@ instance Exec Monitors where  #ifdef LIBMPD      start (MPD        a r) = runM a          mpdConfig      runMPD        r  #endif +#ifdef ALSA +    start (Volume m c a r) = runM a          volumeConfig  (runVolume m c) r +#endif 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]" +                         ]  | 
