5 , MultiParamTypeClasses
9 -- | EsounD monitoring streams.
10 module Sound.EsounD.Monitor
15 import Bindings.EsounD
16 import Control.Exception.Peel
17 import Control.Monad.IO.Class
18 import Control.Monad.IO.Peel
19 import Control.Monad.Trans.Region
20 import Control.Monad.Trans.Region.OnExit
21 import Control.Monad.Unicode
23 import Data.StorableVector as S
24 import Data.StorableVector.Lazy as L
25 import Foreign.Storable
27 import Prelude.Unicode
28 import Sound.EsounD.Streams
29 import Sound.EsounD.Internals
31 import System.IO.SaferFileHandles.Unsafe
34 -- ^ An opaque ESD handle for monitoring the output from the ESD.
35 data Monitor fr ch (r ∷ ★ → ★)
39 , moCloseH ∷ !(FinalizerHandle r)
42 instance Dup (Monitor fr ch) where
43 dup mo = do ch' ← dup (moCloseH mo)
44 return mo { moCloseH = ch' }
46 instance Stream (Monitor fr ch) where
47 streamSampleRate = moRate
49 toLSV ∷ Storable α ⇒ S.Vector α → L.Vector α
50 toLSV v = L.fromChunks [v]
52 instance Frame fr ⇒ ReadableStream (Monitor fr Mono) (L.Vector fr) where
57 S.hGet (moHandle mo) nFrames
59 instance Frame fr ⇒ ReadableStream (Monitor fr Stereo) (L.Vector fr, L.Vector fr) where
63 fmap (deinterleave ∘ toLSV) $
64 S.hGet (moHandle mo) nFrames
66 -- | Open an ESD handle for monitoring the output from the ESD.
67 openMonitor ∷ ∀fr ch s pr.
72 ⇒ Int -- ^ sample rate for the stream.
73 → Maybe HostName -- ^ host to connect to.
74 → Maybe String -- ^ name used to identify this stream
76 → RegionT s pr (Monitor fr ch (RegionT s pr))
77 openMonitor rate host name
79 do h ← liftIO openSocket
80 ch ← onExit $ sanitizeIOError $ closeSocket h
88 fmt = frameFmt ((⊥) ∷ fr) .|.
89 channelFmt ((⊥) ∷ ch) .|.
93 openSocket ∷ IO Handle
94 openSocket = withCStrOrNull host $ \hostPtr →
95 withCStrOrNull name $ \namePtr →
102 ( printf "esd_monitor_stream(%s, %s, %s, %s) returned an error"