packages feed

portmidi-utility-0.0: src/ListDevices.hs

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