module Sound.SC3.Server.Status ( serverStatus
, serverSampleRateNominal
, serverSampleRateActual ) where
import Control.Monad
import Sound.OpenSoundControl
import Sound.SC3.Server.Command
serverStatus :: Transport t => t -> IO [String]
serverStatus = liftM statusFormat . serverStatusData
serverSampleRateNominal :: (Transport t) => t -> IO Double
serverSampleRateNominal = liftM (extractDouble . (!! 7)) . serverStatusData
serverSampleRateActual :: (Transport t) => t -> IO Double
serverSampleRateActual = liftM (extractDouble . (!! 8)) . serverStatusData
extractDouble :: Datum -> Double
extractDouble (Float f) = f
extractDouble (Double f) = f
extractDouble _ = error "extractDouble"
serverStatusData :: Transport t => t -> IO [Datum]
serverStatusData fd = do send fd status
(Message _ d) <- wait fd "status.reply"
return d
statusFields :: [String]
statusFields = ["Unused ",
"# UGens ",
"# Synths ",
"# Groups ",
"# Instruments ",
"% CPU (Average) ",
"% CPU (Peak) ",
"Sample Rate (Nominal) ",
"Sample Rate (Actual) "]
statusFormat :: [Datum] -> [String]
statusFormat d = s : zipWith (++)
(tail statusFields)
(map show (tail d))
where s = "***** SuperCollider Server Status *****"