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