1 {-# LANGUAGE Arrows #-}
3 module Reactimation where
8 import qualified Data.Map as M
10 import Control.Concurrent.MVar
11 import Sound.JACK ( NFrames(NFrames)
18 mainReact :: MVar EventQueue
22 mainReact inRef outRef clientRef =
23 reactimate (initialize inRef) (sensing clientRef inRef) (actuation outRef) mainSF
25 initialize :: MVar EventQueue -> IO EventQueue
26 initialize inRef = readMVar inRef
28 sensing :: MVar ClientState
31 -> IO (DTime, Maybe EventQueue)
32 sensing clientRef inRef _ = do
33 client <- readMVar clientRef
34 input <- takeMVar inRef
35 let (NFrames buff) = buffSize client
36 dt = (fromIntegral $ rate client)/(fromIntegral buff)
37 return (dt, Just input)
39 actuation :: MVar EventQueue
43 actuation outRef _ output = do
44 out <- takeMVar outRef
45 putMVar outRef $ M.union output out
48 mainSF :: SF EventQueue EventQueue