packages feed

mediabus 0.3.3.0 → 0.4.0.0

raw patch · 11 files changed

+172/−70 lines, 11 filesdep ~mediabusPVP ok

version bump matches the API change (PVP)

Dependency ranges changed: mediabus

API changes (from Hackage documentation)

- Data.MediaBus.Conduit.Stream: mapTicksC :: Monad m => (t -> t') -> Conduit (Stream i s t p c) m (Stream i s t' p c)
- Data.MediaBus.Conduit.Stream: mapTicksC' :: (NFData t, Monad m) => (t -> t') -> Conduit (Stream i s t p c) m (Stream i s t' p c)
- Data.MediaBus.Conduit.Timing: 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)
- Data.MediaBus.Conduit.Timing: 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))
- Data.MediaBus.Media.SyncStream: setSequenceNumbersAndTimestamps :: (Num s, CanBeTicks r t, HasDuration c) => SyncStream i p c -> (s, Ticks r t) -> (Stream i s (Ticks r t) p c, (s, Ticks r t))
+ Data.MediaBus.Basics.Ticks: removeTimestamp :: (HasTimestamp a) => a -> (SetTimestamp a ())
+ Data.MediaBus.Basics.Ticks: setTimestampFromDurations :: forall r t a. (CanBeTicks r t, HasDuration a, HasTimestamp a, GetTimestamp a ~ ()) => a -> Ticks r t -> (SetTimestamp a (Ticks r t), Ticks r t)
+ Data.MediaBus.Conduit.Stream: mapTimestampC :: Monad m => (t -> t') -> Conduit (Stream i s t p c) m (Stream i s t' p c)
+ Data.MediaBus.Conduit.Stream: mapTimestampC' :: (NFData t, Monad m) => (t -> t') -> Conduit (Stream i s t p c) m (Stream i s t' p c)
+ Data.MediaBus.Conduit.SyncStream: assumeSynchronizedC :: (Monad m, KnownRate r, HasDuration d, Num s, CanBeTicks r t) => ConduitM (SyncStream i p d) (Stream i s (Ticks r t) p d) m ()
+ Data.MediaBus.Conduit.SyncStream: convertTimestampC :: 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)
+ Data.MediaBus.Conduit.SyncStream: removeTimestampC :: (Monad m, HasTimestamp a) => Conduit a m (SetTimestamp a ())
+ Data.MediaBus.Conduit.SyncStream: setSequenceNumberAndTimestampC :: (Monad m, KnownRate r, HasDuration d, Num s, CanBeTicks r t) => ConduitM (SyncStream i p d) (Stream i s (Ticks r t) p d) m ()
+ Data.MediaBus.Conduit.SyncStream: setTimestampFromDurationsC :: forall m r t a. (Monad m, CanBeTicks r t, HasDuration a, HasTimestamp a, GetTimestamp a ~ ()) => Ticks r t -> Conduit a m (SetTimestamp a (Ticks r t))
+ Data.MediaBus.Media.SyncStream: setSequenceNumberAndTimestamp :: (Num s, CanBeTicks r t, HasDuration c) => SyncStream i p c -> (s, Ticks r t) -> (Stream i s (Ticks r t) p c, (s, Ticks r t))
- Data.MediaBus.Basics.Series: _Next :: forall a_aqaM b_aqaN b_aqoP. Prism (Series a_aqaM b_aqoP) (Series a_aqaM b_aqaN) b_aqoP b_aqaN
+ Data.MediaBus.Basics.Series: _Next :: forall a_aqb6 b_aqb7 b_aqp9. Prism (Series a_aqb6 b_aqp9) (Series a_aqb6 b_aqb7) b_aqp9 b_aqb7
- Data.MediaBus.Basics.Series: _Start :: forall a_aqaM b_aqaN a_aqoU. Prism (Series a_aqoU b_aqaN) (Series a_aqaM b_aqaN) a_aqoU a_aqaM
+ Data.MediaBus.Basics.Series: _Start :: forall a_aqb6 b_aqb7 a_aqpe. Prism (Series a_aqpe b_aqb7) (Series a_aqb6 b_aqb7) a_aqpe a_aqb6
- Data.MediaBus.Media.Discontinous: _Got :: forall a_aEdX a_aEGe. Prism (Discontinous a_aEGe) (Discontinous a_aEdX) a_aEGe a_aEdX
+ Data.MediaBus.Media.Discontinous: _Got :: forall a_aEt4 a_aEVl. Prism (Discontinous a_aEVl) (Discontinous a_aEt4) a_aEVl a_aEt4
- Data.MediaBus.Media.Discontinous: _Missing :: forall a_aEdX. Prism' (Discontinous a_aEdX) ()
+ Data.MediaBus.Media.Discontinous: _Missing :: forall a_aEt4. Prism' (Discontinous a_aEt4) ()
- Data.MediaBus.Media.Stream: frameCtxInit :: forall i_aT86 s_aT87 t_aT88 p_aT89 p_aThJ. Lens (FrameCtx i_aT86 s_aT87 t_aT88 p_aT89) (FrameCtx i_aT86 s_aT87 t_aT88 p_aThJ) p_aT89 p_aThJ
+ Data.MediaBus.Media.Stream: frameCtxInit :: forall i_aTn4 s_aTn5 t_aTn6 p_aTn7 p_aTwH. Lens (FrameCtx i_aTn4 s_aTn5 t_aTn6 p_aTn7) (FrameCtx i_aTn4 s_aTn5 t_aTn6 p_aTwH) p_aTn7 p_aTwH
- Data.MediaBus.Media.Stream: frameCtxSeqNumRef :: forall i_aT86 s_aT87 t_aT88 p_aT89 s_aThK. Lens (FrameCtx i_aT86 s_aT87 t_aT88 p_aT89) (FrameCtx i_aT86 s_aThK t_aT88 p_aT89) s_aT87 s_aThK
+ Data.MediaBus.Media.Stream: frameCtxSeqNumRef :: forall i_aTn4 s_aTn5 t_aTn6 p_aTn7 s_aTwI. Lens (FrameCtx i_aTn4 s_aTn5 t_aTn6 p_aTn7) (FrameCtx i_aTn4 s_aTwI t_aTn6 p_aTn7) s_aTn5 s_aTwI
- Data.MediaBus.Media.Stream: frameCtxSourceId :: forall i_aT86 s_aT87 t_aT88 p_aT89 i_aThL. Lens (FrameCtx i_aT86 s_aT87 t_aT88 p_aT89) (FrameCtx i_aThL s_aT87 t_aT88 p_aT89) i_aT86 i_aThL
+ Data.MediaBus.Media.Stream: frameCtxSourceId :: forall i_aTn4 s_aTn5 t_aTn6 p_aTn7 i_aTwJ. Lens (FrameCtx i_aTn4 s_aTn5 t_aTn6 p_aTn7) (FrameCtx i_aTwJ s_aTn5 t_aTn6 p_aTn7) i_aTn4 i_aTwJ
- Data.MediaBus.Media.Stream: frameCtxTimestampRef :: forall i_aT86 s_aT87 t_aT88 p_aT89 t_aThM. Lens (FrameCtx i_aT86 s_aT87 t_aT88 p_aT89) (FrameCtx i_aT86 s_aT87 t_aThM p_aT89) t_aT88 t_aThM
+ Data.MediaBus.Media.Stream: frameCtxTimestampRef :: forall i_aTn4 s_aTn5 t_aTn6 p_aTn7 t_aTwK. Lens (FrameCtx i_aTn4 s_aTn5 t_aTn6 p_aTn7) (FrameCtx i_aTn4 s_aTn5 t_aTwK p_aTn7) t_aTn6 t_aTwK
- Data.MediaBus.Media.Stream: framePayload :: forall s_aTio t_aTip c_aTiq c_aTz1. Lens (Frame s_aTio t_aTip c_aTiq) (Frame s_aTio t_aTip c_aTz1) c_aTiq c_aTz1
+ Data.MediaBus.Media.Stream: framePayload :: forall s_aTxm t_aTxn c_aTxo c_aTNZ. Lens (Frame s_aTxm t_aTxn c_aTxo) (Frame s_aTxm t_aTxn c_aTNZ) c_aTxo c_aTNZ
- Data.MediaBus.Media.Stream: frameSeqNum :: forall s_aTio t_aTip c_aTiq s_aTz2. Lens (Frame s_aTio t_aTip c_aTiq) (Frame s_aTz2 t_aTip c_aTiq) s_aTio s_aTz2
+ Data.MediaBus.Media.Stream: frameSeqNum :: forall s_aTxm t_aTxn c_aTxo s_aTO0. Lens (Frame s_aTxm t_aTxn c_aTxo) (Frame s_aTO0 t_aTxn c_aTxo) s_aTxm s_aTO0
- Data.MediaBus.Media.Stream: frameTimestamp :: forall s_aTio t_aTip c_aTiq t_aTz3. Lens (Frame s_aTio t_aTip c_aTiq) (Frame s_aTio t_aTz3 c_aTiq) t_aTip t_aTz3
+ Data.MediaBus.Media.Stream: frameTimestamp :: forall s_aTxm t_aTxn c_aTxo t_aTO1. Lens (Frame s_aTxm t_aTxn c_aTxo) (Frame s_aTxm t_aTO1 c_aTxo) t_aTxn t_aTO1
- Data.MediaBus.Media.Stream: stream :: forall i_aTzz s_aTzA t_aTzB p_aTzC c_aTzD i_aTYZ s_aTZ0 t_aTZ1 p_aTZ2 c_aTZ3. Iso (Stream i_aTzz s_aTzA t_aTzB p_aTzC c_aTzD) (Stream i_aTYZ s_aTZ0 t_aTZ1 p_aTZ2 c_aTZ3) (Streamish i_aTzz s_aTzA t_aTzB p_aTzC c_aTzD) (Streamish i_aTYZ s_aTZ0 t_aTZ1 p_aTZ2 c_aTZ3)
+ Data.MediaBus.Media.Stream: stream :: forall i_aTOx s_aTOy t_aTOz p_aTOA c_aTOB i_aUdX s_aUdY t_aUdZ p_aUe0 c_aUe1. Iso (Stream i_aTOx s_aTOy t_aTOz p_aTOA c_aTOB) (Stream i_aUdX s_aUdY t_aUdZ p_aUe0 c_aUe1) (Streamish i_aTOx s_aTOy t_aTOz p_aTOA c_aTOB) (Streamish i_aUdX s_aUdY t_aUdZ p_aUe0 c_aUe1)

Files

mediabus.cabal view
@@ -1,5 +1,5 @@ name: mediabus-version: 0.3.3.0+version: 0.4.0.0 cabal-version: >=1.10 build-type: Simple license: BSD3@@ -38,7 +38,7 @@         Data.MediaBus.Conduit.Reorder         Data.MediaBus.Conduit.Segment         Data.MediaBus.Conduit.Stream-        Data.MediaBus.Conduit.Timing+        Data.MediaBus.Conduit.SyncStream         Data.MediaBus.Conduit.Trace         Data.MediaBus.Conduit.TypeAnnotations         Data.MediaBus.Media.Audio@@ -117,7 +117,7 @@         conduit <1.3,         conduit-combinators <1.2,         conduit-extra <1.2,-        mediabus <0.4,+        mediabus <0.5,         containers <0.6,         data-default <0.8,         deepseq <1.5,
specs/Data/MediaBus/Conduit/Audio/Raw/ResampleSpec.hs view
@@ -51,7 +51,7 @@   mapOutput     (MkStream . Next)     (mapOutput (MkFrame () def) (yield (pcmMediaBuffer # mediaBufferFromList x)) .|-     deriveFrameTimestamp 0)+     setTimestampFromDurationsC 0)  framesFromLists   :: Monad m@@ -61,4 +61,4 @@   mapOutput     (MkStream . Next)     (mapOutput (MkFrame () def) (mapM_ (yield . view (from pcmMediaBuffer) . mediaBufferFromList) xs) .|-     deriveFrameTimestamp 0)+     setTimestampFromDurationsC 0)
specs/Data/MediaBus/Media/SyncStreamSpec.hs view
@@ -19,7 +19,7 @@  spec :: Spec spec =-  describe "setSequenceNumbersAndTimestamps" $ do+  describe "setSequenceNumberAndTimestamp" $ do     it "increases the sequence number by one (only) for each frame" $       let prop :: (NonEmptyList (SyncStream () () FakePayload)) -> Bool           prop (NonEmpty inStr) =@@ -33,7 +33,7 @@                             z = (0, 0)                         in evalState                              (mapM-                                (state . setSequenceNumbersAndTimestamps)+                                (state . setSequenceNumberAndTimestamp)                                 inStr)                              z                   in case last outStr of@@ -53,7 +53,7 @@                                   z = (0, 0)                               in evalState                                    (mapM-                                      (state . setSequenceNumbersAndTimestamps)+                                      (state . setSequenceNumberAndTimestamp)                                       inStr)                                    z                         in filter isNext outStr@@ -72,7 +72,7 @@                             z = (0, MkTicks 0)                         in evalState                              (mapM-                                (state . setSequenceNumbersAndTimestamps)+                                (state . setSequenceNumberAndTimestamp)                                 inStr)                              z                   in filter isNext outStr
src/Data/MediaBus.hs view
@@ -22,7 +22,7 @@ import Data.MediaBus.Conduit.Reorder as X import Data.MediaBus.Conduit.Segment as X import Data.MediaBus.Conduit.Stream as X-import Data.MediaBus.Conduit.Timing as X+import Data.MediaBus.Conduit.SyncStream as X import Data.MediaBus.Conduit.Trace as X import Data.MediaBus.Conduit.TypeAnnotations as X import Data.MediaBus.Media.Audio as X
src/Data/MediaBus/Basics/Ticks.hs view
@@ -44,6 +44,8 @@   , type StaticTicksTicks   , HasDuration(..)   , HasTimestamp(..)+  , setTimestampFromDurations+  , removeTimestamp   , HasStaticDuration(..)   , getStaticDurationTicks   , getStaticDuration@@ -349,6 +351,33 @@   timestamp :: Lens t (SetTimestamp t s) (GetTimestamp t) s   timestamp' :: Lens' t (GetTimestamp t)   timestamp' = timestamp++-- | Calculate and set a timestamp.+--+-- The timestamp of each element is calculated from the sum of the durations of+-- the previous elements stored and the start time stamp @t0@.+--+-- The input elements must be instances of 'HasTimestamp' but with the important+-- condition, that the input timestamp is always /unit/ i.e. @()@.+-- This prevents /meaningful/ timestamps from being overwritten.+--+-- Use 'removeTimestamp' to explicitly remove a timestamp.+setTimestampFromDurations+  :: forall r t a.+     ( CanBeTicks r t+     , HasDuration a+     , HasTimestamp a+     , GetTimestamp a ~ ()+     )+  => a -> Ticks r t -> (SetTimestamp a (Ticks r t), Ticks r t)+setTimestampFromDurations !sb !t =+   (sb & timestamp .~ t, t + (nominalDiffTime # getDuration sb))++-- | Explicitly remove a timestamp, by setting the timestamp to @()@.+removeTimestamp+  :: (HasTimestamp a)+  => a -> (SetTimestamp a ())+removeTimestamp = timestamp .~ ()  -- ** Known at compile time durations -- *** Static ticks TODO rename static -> known
src/Data/MediaBus/Conduit/Stream.hs view
@@ -11,8 +11,8 @@   , mapFramesC   , mapFramesC'   , mapSeqNumC-  , mapTicksC-  , mapTicksC'+  , mapTimestampC+  , mapTimestampC'   , mapFrameContentMC   , mapFrameContentMC'   , mapFrameContentC'@@ -117,16 +117,16 @@  -- | A conduit that applies the given function to every time stamp of a -- 'Stream', in 'Frame's as well as 'FrameCtx's.-mapTicksC+mapTimestampC   :: Monad m   => (t -> t') -> Conduit (Stream i s t p c) m (Stream i s t' p c)-mapTicksC = mapC . over timestamp+mapTimestampC = mapC . over timestamp --- | A strict version of 'mapTicksC'.-mapTicksC'+-- | A strict version of 'mapTimestampC'.+mapTimestampC'   :: (NFData t, Monad m)   => (t -> t') -> Conduit (Stream i s t p c) m (Stream i s t' p c)-mapTicksC' = mapC . withStrategy rdeepseq . over timestamp+mapTimestampC' = mapC . withStrategy rdeepseq . over timestamp  -- | A conduit that applies the given pure function to 'eachFrameContent' of a 'Stream'. mapFrameContentC'
+ src/Data/MediaBus/Conduit/SyncStream.hs view
@@ -0,0 +1,100 @@+-- | 'Conduit's that remove or set the sequence numbers and time stamps in+--   'Stream's. The functions in this module lift the functions in 'SyncStream's+--   to conduits.+module Data.MediaBus.Conduit.SyncStream+  ( assumeSynchronizedC+  , setSequenceNumberAndTimestampC+  , convertTimestampC+  , setTimestampFromDurationsC+  , removeTimestampC+  ) where++import Control.Monad.State.Strict+import Control.DeepSeq (NFData)+import Data.Conduit+import Data.Conduit.Lift+import Data.MediaBus.Basics.Ticks+import Data.MediaBus.Conduit.Stream+import Data.MediaBus.Media.Stream+import Data.MediaBus.Media.SyncStream++-- * Combined Sequence number and timestamp calculation++-- | Assign sequence numbers and timestamps to the 'Frame's in a 'SyncStream',+-- starting both the sequence number and timestamp at @0@.+-- This functions is /strict/ and uses 'setSequenceNumberAndTimestamp'+-- under the hood.+-- Inorder to calculate only the 'timestamp' of a stream use+-- 'setTimestampFromDurationsC'.+setSequenceNumberAndTimestampC+  :: (Monad m, KnownRate r, HasDuration d, Num s, CanBeTicks r t)+  => ConduitM (SyncStream i p d) (Stream i s (Ticks r t) p d) m ()+setSequenceNumberAndTimestampC =+  evalStateC+    (0, 0)+    (awaitForever+       (\sIn -> do+          sOut <- lift (state (setSequenceNumberAndTimestamp sIn))+          yield sOut))++-- | Remove the sequence numbers and time stamps from a 'Stream'.+-- It's much more explicit to use a 'SyncStream' instead of a 'Stream'.+-- For example, when a library function aggregates 'Frame's but doesn't regard+-- the sequence numbers and time stamps, using 'SyncStream' indicates to users+-- of that library, that the function does not handle any gaps and/or out of order+-- packages or discrepancies in the time stamps and e.g. frame durations.+--+-- The user then knows, that she has to add functions to that conduit to accomodate+-- for that.+--+-- This functions is /strict/ and uses 'assumeSynchronized'+-- under the hood.+assumeSynchronizedC+  :: (Monad m, KnownRate r, HasDuration d, Num s, CanBeTicks r t)+  => ConduitM (SyncStream i p d) (Stream i s (Ticks r t) p d) m ()+assumeSynchronizedC =+  evalStateC+    (0, 0)+    (awaitForever+       (\sIn -> do+          sOut <- lift (state (setSequenceNumberAndTimestamp sIn))+          yield sOut))++-- * Timestamp calculation and conversion++-- | Set the timestamp of each element in the conduit.+-- The timestamp of each element is calculated from the sum of the durations of+-- the previous elements and the start time stamp @t0@.+--+-- The input elements must be instances of 'HasTimestamp' but with the important+-- condition, that the input timestamp is always /unit/ i.e. @()@.+-- This prevents /meaningful/ timestamps from being overwritten.+--+-- Use 'removeTimestampC' to explicitly remove a timestamp.+setTimestampFromDurationsC+  :: forall m r t a.+     ( Monad m+     , CanBeTicks r t+     , HasDuration a+     , HasTimestamp a+     , GetTimestamp a ~ ()+     )+  => Ticks r t -> Conduit a m (SetTimestamp a (Ticks r t))+setTimestampFromDurationsC t0 = evalStateC t0 (awaitForever go)+  where+    go !sb = lift (state (setTimestampFromDurations sb)) >>= yield++-- | Explicitly remove a timestamp, by setting the timestamp to @()@.+removeTimestampC+  :: (Monad m, HasTimestamp a)+  => Conduit a m (SetTimestamp a ())+removeTimestampC = awaitForever (yield . removeTimestamp)++-- | Recalculate all timestamps in a 'Stream'. This function is strict in its arguments.+convertTimestampC+  :: 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)+convertTimestampC _ _ = mapTimestampC' convertTicks
− src/Data/MediaBus/Conduit/Timing.hs
@@ -1,38 +0,0 @@--- | Conduits to create and convert the time stamps in 'Stream's-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---- | Overwrite the timestamp of a stream of things that  have a time stamp field---  (i.e. 'HasTimestamp' instances)  and also a duration, such that the---  timestamps increment by the duration starting from 0.-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)---- | Recalculate all timestamps in a 'Stream'-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
src/Data/MediaBus/Media/Audio/Raw.hs view
@@ -26,8 +26,10 @@ -- | An indicator for uncompressed audio with a given per sample encoding type. data Raw encoding --- | A family of multi-channel audio samples, this will be stored in a 'MediaBuffer'--- if audio is represented by @Audio r (Pcm c t)@+-- | A family of multi-channel audio sample value types. Values of this type are+--   stored in 'MediaBuffer's.+--   The 'Audio' instances with 'Raw' encodings use 'MediaBuffer's of 'Pcm'+--   values to store (multi-channel-) samples. data family Pcm c t  -- | Types of per channel PCM audio sample value.
src/Data/MediaBus/Media/Buffer.hs view
@@ -55,8 +55,7 @@ -- | Like 'HasMediaBufferL' but with the typical **simple** lens type parameters @s a@ type HasMediaBufferL' s a = (HasMediaBuffer s s, MediaBufferFrom s ~ a, MediaBufferTo s ~ a) --- | A buffer for media data. The type parameter @t@ is supposed to be an--- instance of `IsMedia`.+-- | A buffer for media data. This is just a newtype wrapper around 'V.Vector'. newtype MediaBuffer t = MkMediaBuffer   { _mediaBufferVector :: V.Vector t   } deriving (Generic, NFData, Monoid, Eq)
src/Data/MediaBus/Media/SyncStream.hs view
@@ -1,20 +1,30 @@--- | Naturally ordered 'Stream's.--- A 'Stream' without sequence numbers and timestamps has no means to represent--- 'Frame's that have varying sequence numbers or timestamps, hence they cannot--- be part of a stream that is not perfectly synchronized, therefore when consuming--- such 'Stream' values, the corresponding callers must work under the assumption--- that the frames are perfectly synchronous.+-- | A module for removing and creating sequence numbers and time stamps for+-- 'Stream's.+--+-- It's sometimes helpful to explicity use a 'SyncStream' instead of a 'Stream'.+--+-- For example, for a library function that consumes 'Frame's and doesn't regard+-- the sequence numbers and time stamps, such that the function does not handle+-- any gaps and/or out of order packages or discrepancies in the time stamps+-- and frame durations.+--+-- When the library author chooses 'SyncStream', the library users then know,+-- that the library function relies on a synchronized stream. module Data.MediaBus.Media.SyncStream   ( type SyncStream   , assumeSynchronized-  , setSequenceNumbersAndTimestamps+  , setSequenceNumberAndTimestamp   ) where  import Data.MediaBus.Basics.Series import Data.MediaBus.Basics.Ticks import Data.MediaBus.Media.Stream --- | A 'Stream' without a meaningful sequence number or timestamp.+-- | A 'Stream' without sequence numbers and time stamps is called a+-- 'SyncStream', which is the abbreviation of /synchronous stream/, because+-- when the sequence numbers and time stamps of a 'Stream', and by extension of+-- a 'Frame' and 'FrameCtx', are always @()@, the 'Frame's of a 'Stream' can+-- be assumed to be (perfectly) synchronous. type SyncStream i p c = Stream i () () p c  -- | Convert a 'Stream' to a 'SyncStream' by simply /forgetting/ the sequence@@ -32,13 +42,13 @@ -- Start the timestamp at @0@ and add the 'Frame' duration of the 'Next' -- frame in the stream. -- This function has the signature required to turn it into a 'State' monad.-setSequenceNumbersAndTimestamps+setSequenceNumberAndTimestamp   :: (Num s, CanBeTicks r t, HasDuration c)   => SyncStream i p c   -> (s, Ticks r t)   -> (Stream i s (Ticks r t) p c, (s, Ticks r t))-setSequenceNumbersAndTimestamps (MkStream (Next (MkFrame _t _s !c))) (nextS, nextT) =+setSequenceNumberAndTimestamp (MkStream (Next (MkFrame _t _s !c))) (nextS, nextT) =   ( MkStream (Next (MkFrame nextT nextS c))   , (nextS + 1, nextT + getDurationTicks c))-setSequenceNumbersAndTimestamps (MkStream (Start (MkFrameCtx i _t _s p))) (nextS, nextT) =+setSequenceNumberAndTimestamp (MkStream (Start (MkFrameCtx i _t _s p))) (nextS, nextT) =   ((MkStream (Start (MkFrameCtx i nextT nextS p))), (nextS, nextT))