, loopSample
, stopSample
, killSample
+
+ , ServerInfo(..)
+ , FrameType(..)
+ , NumChannels(..)
+ , getServerInfo
)
where
import Bindings.EsounD
import Data.Bits
import Data.StorableVector.Lazy as L
import Foreign.C.Types
+import Foreign.Ptr
+import Foreign.Storable
import Network
import Prelude.Unicode
import Sound.EsounD.Internals
co
name
rate
- ((⊥) ∷ fr )
- ((⊥) ∷ Mono)
+ ((⊥) ∷ fr )
+ ((⊥) ∷ Stereo)
(L.length l)
_ ← liftIO $
sanitizeIOError $
(show $ saID sa)
) (≤ 0)
≫ return ()
+
+
+
+-- | A data type to represent the server info.
+data ServerInfo
+ = ServerInfo {
+ serverVersion ∷ !Int
+ , serverFrameType ∷ !FrameType
+ , serverChannels ∷ !NumChannels
+ , serverSampleRate ∷ !Int
+ }
+ deriving (Show, Eq)
+
+data FrameType
+ = Int8 | Int16
+ deriving (Show, Eq)
+
+data NumChannels
+ = Mono | Stereo
+ deriving (Show, Eq)
+
+-- | Retrieve server properties.
+getServerInfo ∷ ( AncestorRegion pr cr
+ , MonadIO cr
+ )
+ ⇒ Controller pr
+ → cr ServerInfo
+getServerInfo co
+ = liftIO $
+ sanitizeIOError $
+ bracket retrieve dispose extract
+ where
+ retrieve ∷ IO (Ptr C'esd_server_info)
+ retrieve = do siPtr ← c'esd_get_server_info (fdToCInt $ coSocket co)
+ if siPtr ≡ nullPtr then
+ fail "esd_resume(fd) returned an error"
+ else
+ return siPtr
+
+ dispose ∷ Ptr C'esd_server_info → IO ()
+ dispose = c'esd_free_server_info
+
+ extract ∷ Ptr C'esd_server_info → IO ServerInfo
+ extract siPtr
+ = do si ← peek siPtr
+ return ServerInfo {
+ serverVersion
+ = fromIntegral $
+ c'esd_server_info'version si
+ , serverFrameType
+ = case c'esd_server_info'format si of
+ fmt | fmt .&. c'ESD_BITS8 ≡ 1 → Int8
+ | fmt .&. c'ESD_BITS16 ≡ 1 → Int16
+ | otherwise → error ("Unknown format: " ⧺ show fmt)
+ , serverChannels
+ = case c'esd_server_info'format si of
+ fmt | fmt .&. c'ESD_MONO ≡ 1 → Mono
+ | fmt .&. c'ESD_STEREO ≡ 1 → Stereo
+ | otherwise → error ("Unknown format: " ⧺ show fmt)
+ , serverSampleRate
+ = fromIntegral $
+ c'esd_server_info'rate si
+ }