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 +3/−3
- specs/Data/MediaBus/Conduit/Audio/Raw/ResampleSpec.hs +2/−2
- specs/Data/MediaBus/Media/SyncStreamSpec.hs +4/−4
- src/Data/MediaBus.hs +1/−1
- src/Data/MediaBus/Basics/Ticks.hs +29/−0
- src/Data/MediaBus/Conduit/Stream.hs +7/−7
- src/Data/MediaBus/Conduit/SyncStream.hs +100/−0
- src/Data/MediaBus/Conduit/Timing.hs +0/−38
- src/Data/MediaBus/Media/Audio/Raw.hs +4/−2
- src/Data/MediaBus/Media/Buffer.hs +1/−2
- src/Data/MediaBus/Media/SyncStream.hs +21/−11
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))