module Reactive.Banana.ALSA.Time where
import qualified Reactive.Banana.MIDI.Time as Time
import Reactive.Banana.ALSA.Private (Reactor, )
import qualified Sound.ALSA.Sequencer.Event as Event
import qualified Sound.ALSA.Sequencer.RealTime as RealTime
import qualified Sound.ALSA.Sequencer.Time as ATime
import Prelude hiding (div, )
type AbsoluteTicks = Time.T Reactor Time.Absolute Time.Ticks
type RelativeTicks = Time.T Reactor Time.Relative Time.Ticks
type AbsoluteSeconds = Time.T Reactor Time.Absolute Time.Seconds
type RelativeSeconds = Time.T Reactor Time.Relative Time.Seconds
fromStamp :: ATime.Stamp -> AbsoluteTicks
fromStamp t =
case t of
ATime.Real rt ->
Time.cons $ Time.Ticks $ RealTime.toInteger rt
_ -> error "unsupported time stamp type"
toStamp :: AbsoluteTicks -> ATime.Stamp
toStamp t =
ATime.Real $ RealTime.fromInteger $ Time.unTicks $ Time.decons t
fromEvent :: Event.T -> AbsoluteTicks
fromEvent ev =
case Event.time ev of
ATime.Cons ATime.Absolute stamp -> fromStamp stamp
_ -> error "Time.fromEvent: we can only handle absolute time stamps"