]> gitweb @ CieloNegro.org - EsounD.git/commitdiff
Frame class and Channels class
authorPHO <pho@cielonegro.org>
Wed, 3 Nov 2010 06:49:50 +0000 (15:49 +0900)
committerPHO <pho@cielonegro.org>
Wed, 3 Nov 2010 06:49:50 +0000 (15:49 +0900)
EsounD.cabal
Sound/EsounD.hs

index 60e1e5b745291a90d3e26e3b66881f54c13d952b..4df52be81a416f5be45e7c173d410761501f9f4b 100644 (file)
@@ -34,6 +34,7 @@ Library
         Sound.EsounD
 
     Extensions:
+        EmptyDataDecls
         KindSignatures
         UnicodeSyntax
 
index ba46305e0af46eaaf354d81d9d16931e29d8a467..6adeddf31fcd9128694a176b6621083113a132b3 100644 (file)
@@ -1,43 +1,66 @@
 -- | 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