module Sound.ALSA.Sequencer.Subscribe
( subscribe
, unsubscribe
) where
import qualified Sound.ALSA.Sequencer.Marshal.Sequencer as Seq
import qualified Sound.ALSA.Sequencer.Area as Area
import qualified Sound.ALSA.Sequencer.Marshal.Address as Addr
import qualified Sound.ALSA.Sequencer.Marshal.Queue as Queue
import qualified Sound.ALSA.Exception as Exc
import Foreign.C.Types (CInt, )
import Foreign.Ptr (Ptr, )
import Foreign.Marshal.Alloc (alloca, )
import Foreign.Storable (peek, poke, )
type T = Area.PortSubscribe
type T_ = Area.PortSubscribe_
alloc :: IO T
_copy :: T -> T -> IO ()
_clone :: T -> IO T
_getQueue :: T -> IO Queue.T
_getExclusive :: T -> IO Bool
_getTimeUpdate:: T -> IO Bool
_getTimeReal :: T -> IO Bool
setQueue :: T -> Queue.T -> IO ()
setExclusive :: T -> Bool -> IO ()
setTimeUpdate :: T -> Bool -> IO ()
setTimeReal :: T -> Bool -> IO ()
alloc = Area.port_subscribe_malloc
_copy = Area.port_subscribe_copy
_clone = Area.port_subscribe_clone
_getQueue = Area.port_subscribe_get_queue
_getExclusive = Area.port_subscribe_get_exclusive
_getTimeUpdate= Area.port_subscribe_get_time_update
_getTimeReal = Area.port_subscribe_get_time_real
setQueue = Area.port_subscribe_set_queue
setExclusive = Area.port_subscribe_set_exclusive
setTimeUpdate = Area.port_subscribe_set_time_update
setTimeReal = Area.port_subscribe_set_time_real
_getSender :: T -> IO Addr.T
_getSender s =
peek =<< Area.with_port_subscribe s snd_seq_port_subscribe_get_sender
foreign import ccall unsafe "alsa/asoundlib.h snd_seq_port_subscribe_get_sender"
snd_seq_port_subscribe_get_sender :: Ptr T_ -> IO (Ptr Addr.T)
_getDest :: T -> IO Addr.T
_getDest s =
peek =<< Area.with_port_subscribe s snd_seq_port_subscribe_get_dest
foreign import ccall unsafe "alsa/asoundlib.h snd_seq_port_subscribe_get_dest"
snd_seq_port_subscribe_get_dest :: Ptr T_ -> IO (Ptr Addr.T)
setSender :: T -> Addr.T -> IO ()
setSender s c =
alloca $ \p -> poke p c >> Area.with_port_subscribe s (`snd_seq_port_subscribe_set_sender` p)
foreign import ccall unsafe "alsa/asoundlib.h snd_seq_port_subscribe_set_sender"
snd_seq_port_subscribe_set_sender :: Ptr T_ -> Ptr Addr.T -> IO ()
setDest :: T -> Addr.T -> IO ()
setDest s c =
alloca $ \p -> poke p c >> Area.with_port_subscribe s (`snd_seq_port_subscribe_set_dest` p)
foreign import ccall unsafe "alsa/asoundlib.h snd_seq_port_subscribe_set_dest"
snd_seq_port_subscribe_set_dest :: Ptr T_ -> Ptr Addr.T -> IO ()
subscribePort :: Seq.T mode -> T -> IO ()
subscribePort (Seq.Cons h) s =
Exc.checkResult_ "subscribe_port" =<< Area.with_port_subscribe s (snd_seq_subscribe_port h)
foreign import ccall unsafe "alsa/asoundlib.h snd_seq_subscribe_port"
snd_seq_subscribe_port :: Ptr Seq.Core -> Ptr T_ -> IO CInt
unsubscribePort :: Seq.T mode -> T -> IO ()
unsubscribePort (Seq.Cons h) s =
Exc.checkResult_ "unsubscribe_port" =<< Area.with_port_subscribe s (snd_seq_unsubscribe_port h)
foreign import ccall unsafe "alsa/asoundlib.h snd_seq_unsubscribe_port"
snd_seq_unsubscribe_port :: Ptr Seq.Core -> Ptr T_ -> IO CInt
create :: Addr.T -> Addr.T -> Bool -> Maybe (Queue.T, Bool) -> IO T
create sender dest excl time = do
s <- alloc
setSender s sender
setDest s dest
setExclusive s excl
maybe (return ()) (\(queue, realtime) -> do
setTimeUpdate s True
setQueue s queue
setTimeReal s realtime) time
return s
subscribe :: Seq.T mode -> Addr.T -> Addr.T -> Bool -> Maybe (Queue.T, Bool) -> IO ()
subscribe ss sender dest excl time = subscribePort ss =<< create sender dest excl time
unsubscribe :: Seq.T mode -> Addr.T -> Addr.T -> IO ()
unsubscribe ss sender dest = unsubscribePort ss =<< create sender dest False Nothing