module Sound.ALSA.PCM.Core.Class where
import qualified Sound.ALSA.PCM.Core.Handle as Core
import qualified Sound.ALSA.PCM.Core.HwParams as HwParams
import qualified Sound.ALSA.PCM.Core.SwParams as SwParams
import qualified Sound.Frame as Frame
import qualified Sound.Frame.Stereo as Stereo
import qualified Sound.Frame.MuLaw as MuLaw
import Data.Word (Word8, Word16, Word32, )
import Data.Int (Int8, Int16, Int32, )
import Foreign (Storable, )
class Access i where
access :: HwParams.T i y HwParams.Access
setChannels :: (Frame.C y) => HwParams.T i y ()
instance Access Core.Interleaved where
access = return HwParams.accessRwInterleaved
setChannels =
HwParams.setChannels . fromIntegral =<<
withSampleFmt Frame.numberOfChannels
instance Access Core.Noninterleaved where
access = return HwParams.accessRwNoninterleaved
setChannels = return ()
class (Storable y, Frame.C y) => SampleFmt y where
sampleFmtToPcmFormat :: y -> HwParams.Format
instance SampleFmt Word8 where
sampleFmtToPcmFormat _ = HwParams.formatU8
instance SampleFmt Int8 where
sampleFmtToPcmFormat _ = HwParams.formatS8
instance SampleFmt Word16 where
sampleFmtToPcmFormat _ = HwParams.formatU16
instance SampleFmt Int16 where
sampleFmtToPcmFormat _ = HwParams.formatS16
instance SampleFmt Word32 where
sampleFmtToPcmFormat _ = HwParams.formatU32
instance SampleFmt Int32 where
sampleFmtToPcmFormat _ = HwParams.formatS32
instance SampleFmt Float where
sampleFmtToPcmFormat _ = HwParams.formatFloat
instance SampleFmt Double where
sampleFmtToPcmFormat _ = HwParams.formatFloat64
instance SampleFmt MuLaw.T where
sampleFmtToPcmFormat _ = HwParams.formatMuLaw
instance SampleFmt a => SampleFmt (Stereo.T a) where
sampleFmtToPcmFormat y =
sampleFmtToPcmFormat (Stereo.left y)
class (SampleFmt y) => MonoSampleFmt y where
instance MonoSampleFmt Word8 where
instance MonoSampleFmt Int8 where
instance MonoSampleFmt Word16 where
instance MonoSampleFmt Int16 where
instance MonoSampleFmt Word32 where
instance MonoSampleFmt Int32 where
instance MonoSampleFmt Float where
instance MonoSampleFmt Double where
instance MonoSampleFmt MuLaw.T where
withSampleFmt :: (y -> a) -> HwParams.T i y a
withSampleFmt f = return $ f undefined
withHwParams ::
(Access i, SampleFmt y) =>
Core.Handle i y -> HwParams.T i y a -> IO a
withHwParams h f =
HwParams.withIO h $ (\(HwParams.Cons act) -> act h) $ do
HwParams.setAccess =<< access
HwParams.setFormat =<< withSampleFmt sampleFmtToPcmFormat
setChannels
f
withSwParams ::
(Access i, SampleFmt y) =>
Core.Handle i y -> SwParams.T i y a -> IO a
withSwParams h (SwParams.Cons f) =
SwParams.withIO h $ f h