-- | Conduits for converting 'ALaw' 'Stream's to 'S16' streams and vice versa.
module Data.MediaBus.Conduit.Audio.Raw.Alaw
  ( alawToS16
  , s16ToAlaw
  ) where

import Control.Lens
import Control.DeepSeq (NFData)
import Data.Conduit
import Data.MediaBus.Media.Audio.Raw.Alaw
import Data.MediaBus.Media.Audio.Raw.Signed16bit
import Data.MediaBus.Media.Channels
import Data.MediaBus.Media.Stream
import Data.MediaBus.Conduit.Stream

-- | Convert from 'ALaw' to 'S16'
alawToS16
  :: (NFData cIn, NFData cOut, Monad m, EachChannelL cIn cOut ALaw S16)
  => Conduit (Stream i s t p cIn) m (Stream i s t p cOut)
alawToS16 = mapFrameContentC' (over eachChannel decodeALawSample)

-- | Convert from 'S16' to 'ALaw'
s16ToAlaw
  :: (NFData cIn, NFData cOut, Monad m, EachChannelL cIn cOut S16 ALaw)
  => Conduit (Stream i s t p cIn) m (Stream i s t p cOut)
s16ToAlaw = mapFrameContentC' (over eachChannel encodeALawSample)