+{-# LANGUAGE
+ FlexibleContexts
+ , FlexibleInstances
+ , KindSignatures
+ , MultiParamTypeClasses
+ , UnicodeSyntax
+ , ScopedTypeVariables
+ , TypeFamilies
+ #-}
-- | 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
-- can't, because safer-file-handles currently provides no ways
- -- to wrap ordinary handles.
+ -- to wrap ordinary handles into safer handles.
, plHandle ∷ !Handle
- , plCloseH ∷ !(CloseHandle r)
+ , plCloseH ∷ !(FinalizerHandle r)
}
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)
+
-- | Open an ESD handle for playing a stream.
openPlayer ∷ ∀fr ch s pr.
( Frame fr