jack-0.7: examples/ImpulseTrain.hs
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