packages feed

alsa-seq-0.6.0.4: examples/list-subscribers.hs

import Common (handleExceptionCont, )

import qualified Sound.ALSA.Sequencer.Address as Addr
import qualified Sound.ALSA.Sequencer.Subscribe.Query as Query
import qualified Sound.ALSA.Sequencer as SndSeq
import Control.Monad.Trans.Cont (ContT(ContT), )
import Control.Monad.IO.Class (liftIO, )
import Control.Monad (forM_, )
import System.Environment (getArgs, )


showQ :: Query.T -> IO String
showQ q = do
   ad <- Query.getAddr q
   qq <- Query.getQueue q
   ex <- Query.getExclusive q
   tu <- Query.getTimeUpdate q
   tr <- Query.getTimeReal q
   return (show ad ++ ":" ++ show qq 
     ++ (if tu then " update" else "")
     ++ (if tr then " realtime" else "")
     ++ (if ex then " exclusive" else ""))

main :: IO ()
main = handleExceptionCont $ do
   args <- liftIO getArgs
   h <- ContT $ SndSeq.withDefault SndSeq.Block
   arg <- ContT $ forM_ args
   a <- liftIO $ Addr.parse (h :: SndSeq.T SndSeq.InputMode) arg
   t <- ContT $ forM_ [Query.Read, Query.Write]
   liftIO $ putStrLn ("subscribers of " ++ show a ++ " for " ++ show t ++ ":")
   answers <- liftIO $ Query.queryAll h a t
   answer <- ContT $ forM_ answers
   liftIO $ putStrLn . (' ':) =<< showQ answer