module Data.MediaBus.Conduit.Timing
( convertTicksC'
, deriveFrameTimestamp
) where
import Conduit
import Control.DeepSeq (NFData)
import Control.Lens
import Control.Monad.State.Strict
import Data.MediaBus.Basics.Ticks
import Data.MediaBus.Media.Stream
import Data.MediaBus.Conduit.Stream
deriveFrameTimestamp
:: forall m r t a.
(Monad m, CanBeTicks r t, HasDuration a, HasTimestamp a)
=> Ticks r t -> Conduit a m (SetTimestamp a (Ticks r t))
deriveFrameTimestamp t0 = evalStateC t0 (awaitForever yieldSync)
where
yieldSync :: a
-> Conduit a (StateT (Ticks r t) m) (SetTimestamp a (Ticks r t))
yieldSync sb = do
t <- get
modify (+ (nominalDiffTime # getDuration sb))
yield (sb & timestamp .~ t)
convertTicksC'
:: forall proxy0 proxy1 m r t r' t' i s c p.
(NFData t, NFData t', CanBeTicks r t, CanBeTicks r' t', Monad m, NFData t')
=> proxy0 '( r, t)
-> proxy1 '( r', t')
-> Conduit (Stream i s (Ticks r t) p c) m (Stream i s (Ticks r' t') p c)
convertTicksC' _ _ = mapTicksC' convertTicks