From 23a3b81bfd480e5a1d63bbad91e2b611b99758e1 Mon Sep 17 00:00:00 2001 From: Martin Perner Date: Tue, 30 Aug 2011 16:38:04 +0200 Subject: catch alsa exception on decibel acquire This closes #17. For some reasons the alsa interface does not provide a dB value on all systems. Instead an error is returned. The alsa-mixer library checks for such return values and throws an exception if one is detected. This patch catches the exception and returns 0 as dB value. --- README | 8 +++++--- src/Plugins/Monitors/Volume.hs | 5 ++++- xmobar.cabal | 1 + 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/README b/README index caaa882..7acb0c8 100644 --- a/README +++ b/README @@ -603,10 +603,12 @@ Monitors have default aliases. - `--lowd` _number_ Low threshold for dB. Defaults to -30.0. - Variables that can be used with the `-t`/`--template` argument: `volume`, `volumebar`, `dB`, `status` +- Note that `dB` might only return 0 on your system. This is known + to happen on systems with a pulseaudio backend. - Default template: `Vol: % ` -- Requires the package [alsa-mixer] installed in your system. In addition, - to activate this plugin you must pass `--flags="with_alsa"` during - compilation. +- Requires the package [alsa-core] and [alsa-mixer] installed in your + system. In addition, to activate this plugin you must pass + `--flags="with_alsa"` during compilation. `MPD Args RefreshRate` diff --git a/src/Plugins/Monitors/Volume.hs b/src/Plugins/Monitors/Volume.hs index 50a6ed4..3e3a8b9 100644 --- a/src/Plugins/Monitors/Volume.hs +++ b/src/Plugins/Monitors/Volume.hs @@ -14,10 +14,12 @@ module Plugins.Monitors.Volume (runVolume, volumeConfig) where +import Prelude hiding ( catch ) import Control.Monad ( liftM, mplus ) import Data.Maybe import Plugins.Monitors.Common import Sound.ALSA.Mixer +import Sound.ALSA.Exception ( catch ) import System.Console.GetOpt volumeConfig :: IO MConfig @@ -115,7 +117,8 @@ runVolume mixerName controlName argv = do maybeNA = maybe (return "N/A") (lo, hi) <- io $ getRange volumeControl val <- io $ getChannel FrontLeft $ value volumeControl - db <- io $ getChannel FrontLeft $ dB volumeControl + db <- io $ catch (getChannel FrontLeft $ dB volumeControl) + (\_ -> return $ Just 0) sw <- io $ getChannel FrontLeft switchControl p <- maybeNA (formatVol lo hi) val b <- maybeNA (formatVolBar lo hi) val diff --git a/xmobar.cabal b/xmobar.cabal index ecafe1d..5d77997 100644 --- a/xmobar.cabal +++ b/xmobar.cabal @@ -122,6 +122,7 @@ executable xmobar if flag(with_alsa) || flag(all_extensions) build-depends: alsa-mixer == 0.1.* + build-depends: alsa-core == 0.5.* other-modules: Plugins.Monitors.Volume cpp-options: -DALSA -- cgit v1.2.3