module Main where
import qualified Sound.PortMidi as PM
import qualified Data.List as List
import Data.Foldable (for_)
import Control.Exception (bracket_)
import Text.Printf (printf)
pmio :: IO (Either PM.PMError a) -> IO ()
pmio act =
either (fail . show) (const $ return ()) =<< act
main :: IO ()
main =
bracket_ (pmio PM.initialize) (pmio PM.terminate) $ do
numDev <- PM.countDevices
for_ (take numDev [0..]) $ \devId -> do
info <- PM.getDeviceInfo devId
let flags =
("input", PM.input) :
("output", PM.output) :
("opened", PM.opened) :
[]
printf "%3d. %s: %s - %s\n" devId (PM.interface info) (PM.name info) $
List.intercalate ", " $
map fst $ filter (\(_,access) -> access info) flags