module Data.ZoomCache.Common (
TimeStamp (..)
, TimeStampDiff(..)
, timeStampDiff
, timeStampFromSO
, timeStampFromUTCTime
, utcTimeFromTimeStamp
, SampleOffset(..)
, SampleOffsetDiff(..)
, sampleOffsetDiff
, SampleRateType(..)
, TrackNo
, Global(..)
, Version(..)
) where
import Data.Int
import Data.Ratio
import Data.Time.Clock (UTCTime, addUTCTime, diffUTCTime)
type TrackNo = Int
data SampleOffset = SO { unSO :: !Int64 }
deriving (Eq, Ord, Show)
data SampleOffsetDiff = SODiff { unSODiff :: !Int64 }
deriving (Eq, Ord, Show)
sampleOffsetDiff :: SampleOffset -> SampleOffset -> SampleOffsetDiff
sampleOffsetDiff (SO t1) (SO t2) = SODiff (t1 t2)
data Version = Version !Int !Int
deriving (Eq, Show)
data Global = Global
{ version :: Version
, noTracks :: Int
, baseUTC :: Maybe UTCTime
}
data SampleRateType = ConstantSR | VariableSR
deriving (Eq, Show)
newtype TimeStamp = TS Double
deriving (Eq, Ord, Show)
newtype TimeStampDiff = TSDiff Double
timeStampDiff :: TimeStamp -> TimeStamp -> TimeStampDiff
timeStampDiff (TS t1) (TS t2) = TSDiff (t1 t2)
timeStampFromSO :: Rational -> SampleOffset -> TimeStamp
timeStampFromSO r (SO so)
| n == 0 = TS 0.0
| otherwise = TS (fromIntegral so * d / n)
where
n = fromIntegral $ numerator r
d = fromIntegral $ denominator r
utcTimeFromTimeStamp :: UTCTime -> TimeStamp -> UTCTime
utcTimeFromTimeStamp base (TS ts) = addUTCTime dTime base
where
dTime = fromRational . toRational $ ts
timeStampFromUTCTime :: UTCTime -> UTCTime -> TimeStamp
timeStampFromUTCTime base u = TS (fromRational . toRational $ d)
where
d = diffUTCTime u base