-- | Type-safe bindings to EsounD with monadic regions.
module Sound.EsounD
- ( Player
+ ( Frame
+
+ , Channels
+ , Mono
+ , Stereo
+
+ , Player
, openPlayer
)
where
+import Bindings.EsounD
import Control.Monad.CatchIO
import Control.Monad.Trans.Region
+import Data.Int
import Network
import System.IO.SaferFileHandles
-{-
+class Frame fr where
+ frameFmt ∷ fr → C'esd_format_t
+
+instance Frame Int8 where
+ frameFmt _ = c'ESD_BITS8
+
+instance Frame Int16 where
+ frameFmt _ = c'ESD_BITS16
+
+class Channels ch where
+ channelFmt ∷ ch → C'esd_format_t
+
data Mono
+instance Channels Mono where
+ channelFmt _ = c'ESD_MONO
+
data Stereo
+instance Channels Stereo where
+ channelFmt _ = c'ESD_STEREO
-data Recorder frame channels
-data Filter frame channels
-data Sampler
--}
-- ^ An ESD handle for playing a stream.
-data Player frame channels (r ∷ * → *)
+data Player fr ch (r ∷ * → *)
= Player {
plRate ∷ Int
, plHandle ∷ RegionalFileHandle WriteMode r
}
-instance Dup (Player frame channels) where
+instance Dup (Player fr ch) where
dup pl
= do h' ← dup (plHandle pl)
return pl { plHandle = h' }
--- ^ Open an ESD handle for playing a stream.
-openPlayer ∷ MonadCatchIO pr
+-- | Open an ESD handle for playing a stream.
+openPlayer ∷ ( Frame fr
+ , Channels ch
+ , MonadCatchIO pr
+ )
⇒ Int -- ^ sample rate for the stream.
→ HostName -- ^ host to connect to.
→ Maybe String -- ^ name used to identify this stream to
-- ESD (if any).
- → RegionT s pr (Player frame channels (RegionT s pr))
+ → RegionT s pr (Player fr ch (RegionT s pr))
openPlayer rate host name
= return Player {
plRate = rate