packages feed

jack-0.6: examples/ImpulseTrain.hs

module Main where

import qualified Sound.JACK.Audio as Audio
import qualified Sound.JACK as JACK

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 -> do
            JACK.setProcess client =<<
                (Trans.lift $ JACK.mkProcess $ process output)
            JACK.withActivation client $ Trans.lift $ do
                putStrLn $ "started " ++ name ++ "..."
                JACK.waitForBreak

process ::
    Audio.Port JACK.Output -> JACK.Process
process output nframes _buffer = 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
    return E.eOK