module Main where import qualified Sound.JACK.Audio as Audio import qualified Sound.JACK as JACK import qualified Control.Monad.Exception.Synchronous as Sync import qualified Control.Monad.Trans.Class as Trans import qualified Foreign.C.Error as E import System.Environment (getProgName) import Data.Array.Storable (writeArray, ) main :: IO () main = do name <- getProgName JACK.handleExceptions $ JACK.withClientDefault name $ \client -> JACK.withPort client "output" $ \output -> JACK.withProcess client (process output) $ JACK.withActivation client $ Trans.lift $ do putStrLn $ "started " ++ name ++ "..." JACK.waitForBreak process :: Audio.Port JACK.Output -> JACK.NFrames -> Sync.ExceptionalT E.Errno IO () process output nframes = Trans.lift $ do outArr <- Audio.getBufferArray output nframes case JACK.nframesIndices nframes of [] -> return () zero:rest -> do writeArray outArr zero 1 mapM_ (\i -> writeArray outArr i 0) rest