]> gitweb @ CieloNegro.org - EsounD.git/blobdiff - Sound/EsounD/Player.hs
Give up using type families for stream muxing
[EsounD.git] / Sound / EsounD / Player.hs
index b60eda08a87213b3bd7f5be2c1ecadd4f8454194..cfb4e31edb9b9f3f70d5c1dcf04f071860b90426 100644 (file)
@@ -1,26 +1,35 @@
+{-# LANGUAGE
+    FlexibleContexts
+  , FlexibleInstances
+  , KindSignatures
+  , MultiParamTypeClasses
+  , UnicodeSyntax
+  , ScopedTypeVariables
+  #-}
 -- | EsounD player streams.
 module Sound.EsounD.Player
     ( Player
     , openPlayer
     )
     where
-
 import Bindings.EsounD
 import Control.Monad.IO.Class
 import Control.Monad.Trans.Region
 import Control.Monad.Trans.Region.OnExit
 import Control.Monad.Unicode
 import Data.Bits
+import Data.StorableVector.Lazy as L
 import Foreign.C.String
 import Network
 import Prelude.Unicode
+import Sound.EsounD.Streams
 import Sound.EsounD.Internals
 import System.IO
 import System.IO.SaferFileHandles.Unsafe
 
 
 -- ^ An opaque ESD handle for playing a stream.
-data Player fr ch (r ∷ * → *)
+data Player fr ch (r ∷ ★ → ★)
     = Player {
         plRate   ∷ !Int
       -- THINKME: We really want to use RegionalFileHandle but we
@@ -34,6 +43,14 @@ instance Dup (Player fr ch) where
     dup pl = do ch' ← dup (plCloseH pl)
                 return pl { plCloseH = ch' }
 
+instance Frame fr ⇒ Writable (Player fr Mono) (L.Vector fr) where 
+    write pl v
+        = liftIO $ sanitizeIOError $ L.hPut (plHandle pl) v
+
+instance Frame fr ⇒ Writable (Player fr Stereo) (L.Vector fr, L.Vector fr) where
+    write pl (l, r)
+        = liftIO $ sanitizeIOError $ L.hPut (plHandle pl) (interleave l r)
+
 -- | Open an ESD handle for playing a stream.
 openPlayer ∷ ∀fr ch s pr.
                ( Frame fr