zoom-cache-0.9.0.0: Blaze/ByteString/Builder/ZoomCache/Internal.hs
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE RecordWildCards #-}
{-# OPTIONS -Wall #-}
----------------------------------------------------------------------
-- |
-- Module : Blaze.ByteString.Builder.ZoomCache.Internal
-- Copyright : Conrad Parker
-- License : BSD3-style (see LICENSE)
--
-- Maintainer : Conrad Parker <conrad@metadecks.org>
-- Stability : unstable
-- Portability : unknown
--
-- Blaze-builder utility functions for writing ZoomCache files.
----------------------------------------------------------------------
module Blaze.ByteString.Builder.ZoomCache.Internal (
-- * Builders
fromFlags
, fromGlobal
, fromSummarySO
, fromTrackNo
, fromCodec
) where
import Blaze.ByteString.Builder
import Data.Bits
import qualified Data.ByteString as B
import qualified Data.ByteString.Char8 as C
import Data.Monoid
import Blaze.ByteString.Builder.ZoomCache
import Data.ZoomCache.Common
import Data.ZoomCache.Format
import Data.ZoomCache.Types
----------------------------------------------------------------------
-- Creating builders for ZoomCache types.
fromFlags :: Bool -> Bool -> SampleRateType -> Builder
fromFlags delta zlib drType = fromInt16be (zl .|. dl .|. dr)
where
zl | zlib = 4
| otherwise = 0
dl | delta = 2
| otherwise = 0
dr | drType == VariableSR = 1
| otherwise = 0
fromGlobal :: Global -> Builder
fromGlobal Global{..} = mconcat
[ fromByteString globalHeader
, mconcat $
[ fromVersion version
, fromIntegral32be noTracks
, fromRational64 presentationTime
, fromRational64 baseTime
]
, fromByteString $ C.pack (replicate 20 '\0') -- UTCTime
]
fromSummarySO :: ZoomWritable a => SummarySO a -> Builder
fromSummarySO s@SummarySO{..} = mconcat [ fromSummarySOHeader s, l, d]
where
d = fromSummaryData summarySOData
l = fromIntegral32be . B.length . toByteString $ d
fromSummarySOHeader :: SummarySO a -> Builder
fromSummarySOHeader s = mconcat
[ fromByteString summaryHeader
, fromIntegral32be . summarySOTrack $ s
, fromIntegral32be . summarySOLevel $ s
, fromSampleOffset . summarySOEntry $ s
, fromSampleOffset . summarySOExit $ s
]
fromTrackNo :: TrackNo -> Builder
fromTrackNo = fromInt32be . fromIntegral
fromCodec :: Codec -> Builder
fromCodec (Codec a) = fromByteString $ trackIdentifier a
fromVersion :: Version -> Builder
fromVersion (Version vMaj vMin) = mconcat
[ fromInt16be . fromIntegral $ vMaj
, fromInt16be . fromIntegral $ vMin
]