X-Git-Url: http://git.cielonegro.org/gitweb.cgi?a=blobdiff_plain;f=Sound%2FEsounD%2FPlayer.hs;h=7691672c24d5dd26a5a5139ef63f4560ba948a19;hb=8af725c0cc839ad2493fa17d29ca6becaeb9f600;hp=0d2b209c32b20fb9ba2ae72a2e518cac83ec8bf7;hpb=d2396e7b6183bb033861069aaeb52be53a90bfdf;p=EsounD.git diff --git a/Sound/EsounD/Player.hs b/Sound/EsounD/Player.hs index 0d2b209..7691672 100644 --- a/Sound/EsounD/Player.hs +++ b/Sound/EsounD/Player.hs @@ -1,39 +1,53 @@ +{-# 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