alsa-pcm-0.6: src/Sound/ALSA/PCM/Node/File.hs
module Sound.ALSA.PCM.Node.File (
-- * Types
Handle,
Time, SampleFreq, Size,
-- * Classes
Class.SampleFmt,
-- * Management of streams
open, close,
-- * Data transfer
read, write,
) where
import qualified Sound.ALSA.PCM.Core.Class as Class
import Sound.ALSA.PCM.Parameters.Hardware (Time, SampleFreq, Size, )
import Sound.ALSA.PCM.Core.Handle (arraySize, )
import Control.Monad (liftM, )
import Foreign.Ptr (Ptr, )
import qualified System.IO as IO
import System.IO (IOMode, openBinaryFile, )
import Prelude hiding (read, )
newtype Handle y = Handle IO.Handle
open ::
(Class.SampleFmt y) =>
IOMode -> FilePath -> IO (Handle y)
open mode path =
fmap Handle $ openBinaryFile path mode
close ::
(Class.SampleFmt y) =>
Handle y -> IO ()
close (Handle h) =
IO.hClose h
{- |
This expects pad bytes that are needed in memory
in order to satisfy aligment constraints.
This is only a problem for samples sizes like 24 bit.
-}
read ::
(Class.SampleFmt y) =>
Handle y -> Ptr y -> Size -> IO Size
read (Handle h) buf n =
liftM fromIntegral $
liftM (`div` arraySize buf 1) $
IO.hGetBuf h buf (arraySize buf (fromIntegral n))
{- |
Same restrictions as for 'fileRead'.
-}
write ::
(Class.SampleFmt y) =>
Handle y -> Ptr y -> Size -> IO ()
write (Handle h) buf n =
IO.hPutBuf h buf (arraySize buf (fromIntegral n))