From d444ebca849d77eec58243f800f0f675e1469dc8 Mon Sep 17 00:00:00 2001 From: Thomas Tuegel Date: Thu, 13 Jan 2011 12:57:24 -0600 Subject: Improved volume monitor. Featuring: configurable status strings, status colors, and dB thresholds. --- src/Plugins/Monitors/Volume.hs | 88 ++++++++++++++++++++++++++++++++++++------ 1 file changed, 77 insertions(+), 11 deletions(-) diff --git a/src/Plugins/Monitors/Volume.hs b/src/Plugins/Monitors/Volume.hs index c7814a8..960b5e4 100644 --- a/src/Plugins/Monitors/Volume.hs +++ b/src/Plugins/Monitors/Volume.hs @@ -4,6 +4,42 @@ import Control.Monad ( liftM ) import Data.Maybe import Plugins.Monitors.Common import Sound.ALSA.Mixer +import System.Console.GetOpt + +data VolumeOpts = VolumeOpts + { onString :: String + , offString :: String + , onColor :: Maybe String + , offColor :: Maybe String + , highDbThresh :: Float + , lowDbThresh :: Float + } + +defaultOpts :: VolumeOpts +defaultOpts = VolumeOpts + { onString = "[on] " + , offString = "[off]" + , onColor = Just "green" + , offColor = Just "red" + , highDbThresh = -5.0 + , lowDbThresh = -30.0 + } + +options :: [OptDescr (VolumeOpts -> VolumeOpts)] +options = + [ Option "O" ["on"] (ReqArg (\x o -> o { onString = x }) "") "" + , Option "o" ["off"] (ReqArg (\x o -> o { offString = x }) "") "" + , Option "" ["lowd"] (ReqArg (\x o -> o { lowDbThresh = read x }) "") "" + , Option "" ["highd"] (ReqArg (\x o -> o { highDbThresh = read x }) "") "" + , Option "C" ["onc"] (ReqArg (\x o -> o { onColor = Just x }) "") "" + , Option "c" ["offc"] (ReqArg (\x o -> o { offColor = Just x }) "") "" + ] + +parseOpts :: [String] -> IO VolumeOpts +parseOpts argv = + case getOpt Permute options argv of + (o, _, []) -> return $ foldr id defaultOpts o + (_, _, errs) -> ioError . userError $ concat errs percent :: Integer -> Integer -> Integer -> Float percent v' lo' hi' = (v - lo) / (hi - lo) @@ -12,11 +48,45 @@ percent v' lo' hi' = (v - lo) / (hi - lo) hi = fromIntegral hi' volumeConfig :: IO MConfig -volumeConfig = mkMConfig "Vol: % " - ["volume","dB","on","off"] +volumeConfig = mkMConfig "Vol: % " + ["volume","dB","status"] + +formatVol :: Integer -> Integer -> Integer -> Monitor String +formatVol v lo hi = + showPercentWithColors $ percent v lo hi + +switchHelper :: VolumeOpts + -> (VolumeOpts -> Maybe String) + -> (VolumeOpts -> String) + -> Monitor String +switchHelper opts cHelp strHelp = return $ + (colorHelper $ cHelp opts) + ++ strHelp opts + ++ (maybe "" (const "") $ cHelp opts) + +formatSwitch :: VolumeOpts -> Bool -> Monitor String +formatSwitch opts True = switchHelper opts onColor onString +formatSwitch opts False = switchHelper opts offColor offString + +colorHelper :: Maybe String -> String +colorHelper = maybe "" (\c -> "") + +formatDb :: VolumeOpts -> Float -> Monitor String +formatDb opts db = do + h <- getConfigValue highColor + m <- getConfigValue normalColor + l <- getConfigValue lowColor + let digits = showDigits 0 db + startColor | db >= highDbThresh opts = colorHelper h + | db < lowDbThresh opts = colorHelper l + | otherwise = colorHelper m + stopColor | null startColor = "" + | otherwise = "" + return $ startColor ++ digits ++ stopColor runVolume :: String -> String -> [String] -> Monitor String -runVolume mixerName controlName _ = do +runVolume mixerName controlName argv = do + opts <- io $ parseOpts argv control <- liftM fromJust $ io $ getControlByName mixerName controlName let volumeControl = fromJust $ maybe (playback $ volume control) Just (common $ volume control) @@ -26,11 +96,7 @@ runVolume mixerName controlName _ = do 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]" - ] + p <- formatVol val lo hi + d <- formatDb opts $ fromIntegral db / 100.0 + s <- formatSwitch opts sw + parseTemplate $ [ p, d, s ] -- cgit v1.2.3