]> gitweb @ CieloNegro.org - EsounD.git/commitdiff
Give up using type families for stream muxing
authorPHO <pho@cielonegro.org>
Sat, 1 Jan 2011 07:45:33 +0000 (16:45 +0900)
committerPHO <pho@cielonegro.org>
Sat, 1 Jan 2011 07:45:33 +0000 (16:45 +0900)
Sound/EsounD/Internals.hs
Sound/EsounD/Player.hs
Sound/EsounD/Streams.hs

index 4c450361571e15fd54e7c14ce562f056c0d84b08..ef8c659ddd104d0646b9ca770800b6fcf2ab3f48 100644 (file)
@@ -2,7 +2,6 @@
     EmptyDataDecls
   , FlexibleInstances
   , MultiParamTypeClasses
-  , TypeFamilies
   , UnicodeSyntax
   #-}
 module Sound.EsounD.Internals
@@ -11,8 +10,7 @@ module Sound.EsounD.Internals
     , Channels(..)
     , Mono
     , Stereo
-
-    , Mux(..)
+    , interleave
 
     , wrapSocket
     , closeSocket
@@ -42,37 +40,26 @@ instance Frame Int16 where
 class Channels ch where
     channelFmt ∷ ch → C'esd_format_t
 
-class (Frame fr, Channels ch) ⇒ Mux (vec ∷ ★ → ★) fr ch where
-    type DemuxedVec vec fr ch
-    mux ∷ DemuxedVec vec fr ch → vec fr
-
 -- Mono
 data Mono
 
 instance Channels Mono where
     channelFmt _ = c'ESD_MONO
 
-instance Frame fr ⇒ Mux vec fr Mono where
-    type DemuxedVec vec fr Mono = vec fr
-    mux = id
-
 -- Stereo
 data Stereo
 
 instance Channels Stereo where
     channelFmt _ = c'ESD_STEREO
 
-instance Frame fr ⇒ Mux L.Vector fr Stereo where
-    type DemuxedVec L.Vector fr Stereo = (L.Vector fr, L.Vector fr)
-    mux (left, right) = loop left right
-        where
-          -- THINKME: consider using storablevector-streamfusion
-          loop l r
-              = let Just (lFr, l') = L.viewL l
-                    Just (rFr, r') = L.viewL r
-                    lr' = loop l' r'
-                in
-                  L.cons lFr (L.cons rFr lr')
+interleave ∷ Frame fr ⇒ L.Vector fr → L.Vector fr → L.Vector fr
+interleave l r
+    -- THINKME: consider using storablevector-streamfusion
+    = let Just (lFr, l') = L.viewL l
+          Just (rFr, r') = L.viewL r
+          lr' = interleave l' r'
+      in
+        L.cons lFr (L.cons rFr lr')
 
 -- Utility functions
 wrapSocket ∷ String → CInt → IO Handle
index 7691672c24d5dd26a5a5139ef63f4560ba948a19..cfb4e31edb9b9f3f70d5c1dcf04f071860b90426 100644 (file)
@@ -5,7 +5,6 @@
   , MultiParamTypeClasses
   , UnicodeSyntax
   , ScopedTypeVariables
-  , TypeFamilies
   #-}
 -- | EsounD player streams.
 module Sound.EsounD.Player
@@ -44,9 +43,13 @@ instance Dup (Player fr ch) where
     dup pl = do ch' ← dup (plCloseH pl)
                 return pl { plCloseH = ch' }
 
-instance (Mux L.Vector fr ch, dvec ~ DemuxedVec L.Vector fr ch) ⇒ Writable (Player fr ch) dvec where
-      write pl dvec
-          = liftIO $ sanitizeIOError $ L.hPut (plHandle pl) (mux dvec)
+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.
index b379afb0e9f6724fc097e342e1b3220eabc4abe4..4f0a1000371da64874c756f1b46f679644e0a3a2 100644 (file)
@@ -5,12 +5,10 @@
 -- | EsounD stream I/O
 module Sound.EsounD.Streams
     ( Writable(..)
-    , Mux(..) -- defined by Internals
     )
     where
 import Control.Monad.IO.Class
 import Control.Monad.Trans.Region
-import Sound.EsounD.Internals
 
 class Writable ws dvec where
     write ∷ ( AncestorRegion pr cr