packages feed

mediabus-fdk-aac-0.3.0.0: bench/Encoder.hs

module Main
  ( main
  ) where

import Control.Monad
import Control.Monad.Logger
import Data.Conduit
import Data.MediaBus
import Data.MediaBus.FdkAac
import Data.Conduit.List
import Data.Time.Clock
import Data.Typeable
import Criterion.Main
import Control.Lens
import Data.Vector.Storable as V
import Data.Word
import GHC.TypeLits

main :: IO ()
main =
  defaultMain
    [bgroupFromTestDuration 1000 16000, bgroupFromTestDuration 1000 48000]

bgroupFromTestDuration :: NominalDiffTime -> Int -> Benchmark
bgroupFromTestDuration testdur samplesPerSecond =
  bgroup
    (show testdur Prelude.++ " ptime=20ms " Prelude.++ show samplesPerSecond Prelude.++
     " Hz") $
  let frameCount = ceiling (testdur / ptime)
      ptime = 20 / 1000
  in [ bgroup
         "AAC HE"
         [ bench "Stereo" $
           nfIO $
           encodeNFrames (aacEncoderConfig aacHe16KhzStereo) $
           testFrames testdur frameCount
         , bench "Mono" $
           nfIO $
           encodeNFrames (aacEncoderConfig aacHe16KhzMono) $
           testFrames testdur frameCount
         ]
     , bgroup
         "AAC LC"
         [ bench "Stereo" $
           nfIO $
           encodeNFrames (aacEncoderConfig aacLc16KhzStereo) $
           testFrames testdur frameCount
         , bench "Mono" $
           nfIO $
           encodeNFrames (aacEncoderConfig aacLc16KhzMono) $
           testFrames testdur frameCount
         ]
     ]

encodeNFrames
  :: forall r channels aot.
     ( CanBeSample (Pcm channels S16)
     , CanBeBlank (Pcm channels S16)
     , Show (Pcm channels S16)
     , KnownRate r
     , KnownChannelLayout channels
     , Show (AacAotProxy aot)
     , KnownNat (GetAacAot aot)
     , Typeable r
     )
  => AacEncoderConfig r channels aot
  -> [Stream SrcId32 SeqNum16 (Ticks r Word64) () (Audio r channels (Raw S16))]
  -> IO [Stream SrcId32 SeqNum16 (Ticks r Word64) (AacEncoderInfo r channels aot) (Audio r channels (Aac aot))]
encodeNFrames cfg pcms =
  runStdoutLoggingT $
  runConduitRes $ sourceList pcms .| encodeLinearToAacC cfg .| consume

testFrames
  :: (KnownRate r, IsPcmValue (Pcm channels S16))
  => NominalDiffTime
  -> Int
  -> [Stream SrcId32 SeqNum16 (Ticks r Word64) () (Audio r channels (Raw S16))]
testFrames frameDuration frames =
  [ MkStream
    (Next
       (MkFrame
          (fromIntegral x * (nominalDiffTime # frameDuration))
          (fromIntegral x)
          (blankFor frameDuration)))
  | x <- [0 .. frames]
  ]