module System.Information.Volume (
getVolume,
setVolume
) where
import Sound.ALSA.Mixer
getVolume :: String -> String -> IO Integer
getVolume mix channel = withMixer mix $ \mixer -> do
Just control <- getControlByName mixer channel
let Just playbackVolume = playback $ volume control
(lo, hi) <- getRange playbackVolume
Just vol <- getChannel FrontLeft $ value playbackVolume
return $ toPercent vol lo hi
setVolume :: String -> String -> Double -> IO ()
setVolume mix channel vol = withMixer mix $ \mixer -> do
Just control <- getControlByName mixer channel
let Just playbackVolume = playback $ volume control
(lo, hi) <- getRange playbackVolume
setChannel FrontLeft (value playbackVolume) $ fromPercent vol lo hi
setChannel FrontRight (value playbackVolume) $ fromPercent vol lo hi
setChannel RearLeft (value playbackVolume) $ fromPercent vol lo hi
setChannel RearRight (value playbackVolume) $ fromPercent vol lo hi
setChannel FrontCenter (value playbackVolume) $ fromPercent vol lo hi
toPercent :: Integer -> Integer -> Integer -> Integer
toPercent v lo hi = ceiling $ (v' - lo') / (hi' - lo') * 100
where v' = fromIntegral v
lo' = fromIntegral lo
hi' = fromIntegral hi
fromPercent :: Double -> Integer -> Integer -> Integer
fromPercent v lo hi = ceiling $ lo' + (hi' - lo') * v / 100
where lo' = fromIntegral lo
hi' = fromIntegral hi