{- Copyright 2016 Markus Ongyerth This file is part of pulseaudio-hs. Monky is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Monky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with pulseaudio-hs. If not, see . -} {-# LANGUAGE ScopedTypeVariables #-} {-| Module : Sound.Pulse.volume Description : provides the types for volume Maintianer : ongy Stability : experimental -} module Sound.Pulse.Volume ( Volume , CVolume(..) , volumeToLinear , cVolumeToLinear ) where #if __GLASGOW_HASKELL__ < 800 #let alignment t = "%lu", (unsigned long)offsetof(struct {char x__; t (y__); }, y__) #endif #include import Data.Word (Word32, Word8, Word) import Data.List (genericLength) import Foreign.Storable (Storable(..)) import Foreign.Ptr (plusPtr) -- |type for pa_volume_t type Volume = Word32 -- |type for pa_cvolume. This contains a 'Volume' for each channel. newtype CVolume = CVolume [Volume] deriving (Eq, Show) instance Storable CVolume where sizeOf _ = #{size struct pa_cvolume} alignment _ = #{alignment struct pa_cvolume} peek p = do size :: Word8 <- #{peek struct pa_cvolume, channels} p ints <- mapM (peekElemOff (#{ptr struct pa_cvolume, values} p) . fromIntegral) [0 .. size - 1] return $ CVolume ints poke p (CVolume vols) = do #{poke struct pa_cvolume, channels} p $ (genericLength vols :: Word8) let indexed = zip [0..] vols mapM_ (uncurry (pokeElemOff (#{ptr struct pa_cvolume, values} p))) indexed foreign import ccall "pa_sw_volume_to_linear" pa_sw_volume_to_linear :: Word32 -> Double -- |Convert a single 'Volume' to a linear scale volumeToLinear :: Word32 -> Double volumeToLinear = pa_sw_volume_to_linear -- |Convert a 'CVolume' to a list of linearly scaled values. cVolumeToLinear :: CVolume -> [Double] cVolumeToLinear (CVolume vols) = map volumeToLinear vols