module Data.ZoomCache.Multichannel.Internal (
supportMultichannel
, identifyCodecMultichannel
, oneTrackMultichannel
, mkTrackSpecMultichannel
) where
import Data.ByteString (ByteString)
import Data.Functor.Identity
import qualified Data.IntMap as IM
import qualified Data.Iteratee as I
import Data.TypeLevel.Num hiding ((==))
import qualified Data.Iteratee.Offset as OffI
import Data.Iteratee.ZoomCache.Utils
import Data.Offset
import Data.ZoomCache.Common
import Data.ZoomCache.Multichannel.Common
import Data.ZoomCache.Multichannel.NList()
import Data.ZoomCache.NList
import Data.ZoomCache.Types
supportMultichannel :: [IdentifyCodec] -> [IdentifyCodec]
supportMultichannel = f
where f x = x ++ [identifyCodecMultichannel (f x)]
runner1 :: Identity (I.Iteratee s Identity c) -> c
runner1 = runIdentity . I.run . runIdentity
identifyCodecMultichannel :: [IdentifyCodec] -> IdentifyCodec
identifyCodecMultichannel identifiers bs = runner1 $ I.enumPure1Chunk (Offset 0 bs) identifyMulti
where
identifyMulti :: (Functor m, Monad m) => I.Iteratee (Offset ByteString) m (Maybe Codec)
identifyMulti = do
mIdent <- OffI.takeBS 8
if mIdent == trackTypeMultichannel
then do
channels <- readInt32be
subIdentLength <- readInt32be
subCodec <- readCodec identifiers subIdentLength
return (fmap (foo channels) subCodec)
else return Nothing
foo :: Int -> Codec -> Codec
foo channels (Codec a) = reifyIntegral channels (\n -> Codec (NList n [a]))
oneTrackMultichannel :: (ZoomReadable a)
=> Int -> a -> Bool -> Bool -> SampleRateType -> Rational -> ByteString -> TrackMap
oneTrackMultichannel channels a delta zlib !drType !rate !name =
IM.singleton 1 (mkTrackSpecMultichannel channels a delta zlib drType rate name)
mkTrackSpecMultichannel :: (ZoomReadable a)
=> Int -> a -> Bool -> Bool -> SampleRateType -> Rational -> ByteString
-> TrackSpec
mkTrackSpecMultichannel channels a = reifyIntegral channels
(\n -> TrackSpec (Codec (NList n [a])))