sox-0.1: src/Sound/Sox/Frame.hs
module Sound.Sox.Frame (C(..), Frame.withSignal, Frame.numberOfChannels, ) where
import qualified Sound.Frame as Frame
import qualified Sound.Frame.Stereo as Stereo
import qualified Sound.Frame.MuLaw as MuLaw
import qualified Sound.Sox.Format as Format
import Data.Word (Word8, Word16, Word32, )
import Data.Int (Int8, Int16, Int32, )
class Frame.C y => C y where
format :: y -> Format.T
instance C Word8 where
format _ = Format.unsignedByte
instance C Int8 where
format _ = Format.signedByte
instance C Word16 where
format _ = Format.unsignedWord
instance C Int16 where
format _ = Format.signedWord
instance C Word32 where
format _ = Format.unsignedLong
instance C Int32 where
format _ = Format.signedLong
{- |
The floating point instances are dangerous,
because Storable Float may not use IEEE format
that sox uses according to its man page.
This is strange since sox uses the host's endianess for multi-byte values.
So, why does it not use the machine's floating point format?
-}
instance C Float where
format _ = Format.ieeeSinglePrecision
instance C Double where
format _ = Format.ieeeDoublePrecision
instance C MuLaw.T where
format _ = Format.muLaw
{-
Shall we add instances for Float and Double?
Sox requires floating point numbers in IEEE formats,
but we cannot warrant that the Storable instances uses those formats.
-}
instance C a => C (Stereo.T a) where
format y = format (Stereo.left y)