-- | Detailed audio sample description.
module Data.ByteString.IsoBaseFileFormat.Boxes.AudioSampleEntry where

import Data.ByteString.IsoBaseFileFormat.Boxes.Box
import Data.ByteString.IsoBaseFileFormat.Boxes.BoxFields
import Data.ByteString.IsoBaseFileFormat.Boxes.Handler
import Data.ByteString.IsoBaseFileFormat.Boxes.SampleEntry

-- | Construct an audio sample entry box.
audioSampleEntry ::
     (KnownSymbol
       (BoxTypeSymbol (SampleEntry 'AudioTrack (AudioCoding c))))
  => AudioCoding c
  -> U16 "data_reference_index"
  -> SampleEntry 'AudioTrack (AudioCoding c)
  -> Box (SampleEntry 'AudioTrack (AudioCoding c))
audioSampleEntry _ = sampleEntry

-- | Fields if audio sample entries
newtype instance SampleEntry 'AudioTrack (AudioCoding c) where
    AudioSampleEntry
      :: Constant (U32Arr "reserved" 2) '[0,0]
      :+ Template (U16 "channelcount") 2
      :+ Template (U16 "samplesize") 16
      :+ U16 "pre_defined"
      :+ Constant (U16 "reserved") 0
      :+ Template (U32 "samplerate") (DefaultSoundSamplerate * 65536)
      -- TODO implement fix point integer
      -> SampleEntry 'AudioTrack (AudioCoding c)
    deriving (IsBoxContent, Default)

type DefaultSoundSamplerate = 48000

-- | A coproduct of audio codec types
data family AudioCoding (c :: Symbol)

-- | The MPEG-4 AAC Audio codec
data instance AudioCoding "mp4a" = Mpeg4Aac

type instance BoxTypeSymbol (AudioCoding c) = c