module Vivid.Actions.Scheduled (
Scheduled
, doScheduledIn
, doScheduledAt
, doScheduledNow
) where
import Vivid.Actions.Class
import Vivid.Actions.IO ()
import Vivid.OSC
import Vivid.SCServer
import Vivid.SynthDef (SynthDef)
import Control.Concurrent
import Control.Monad
import Control.Monad.IO.Class (liftIO)
import Control.Monad.State (evalStateT, put, get, modify, StateT)
import Data.ByteString (ByteString)
import Prelude
type Scheduled = StateT Timestamp IO
instance VividAction Scheduled where
callOSC :: OSC -> Scheduled ()
callOSC message = do
now <- getTime
liftIO . callBS . encodeOSCBundle $ OSCBundle now [Right message]
callBS :: ByteString -> Scheduled ()
callBS message = do
now <- getTime
liftIO . callBS . encodeOSCBundle $ OSCBundle now [Left message]
sync :: Scheduled ()
sync = return ()
waitForSync :: SyncId -> Scheduled ()
waitForSync _ = return ()
wait :: (RealFrac n) => n -> Scheduled ()
wait t = modify (`addSecs` realToFrac t)
getTime :: Scheduled Timestamp
getTime = get
newBufferId :: Scheduled BufferId
newBufferId = liftIO newBufferId
newNodeId :: Scheduled NodeId
newNodeId = liftIO newNodeId
newSyncId :: Scheduled SyncId
newSyncId = liftIO newSyncId
fork :: Scheduled () -> Scheduled ()
fork action = do
timeOfFork <- get
action
put timeOfFork
defineSD :: SynthDef a -> Scheduled ()
defineSD = liftIO . void . forkIO . defineSD
doScheduledAt :: Timestamp -> Scheduled a -> IO a
doScheduledAt startTime action =
evalStateT action startTime
doScheduledIn :: Double -> Scheduled a -> IO a
doScheduledIn numSecs action = do
now <- getTime
doScheduledAt (addSecs now numSecs) action
doScheduledNow :: Scheduled a -> IO a
doScheduledNow action = do
now <- getTime
doScheduledAt now action