module Main
( main
) where
import Control.Monad.Logger
import Criterion.Main
import Data.Conduit
import Data.Conduit.List
import Data.MediaBus
import Data.MediaBus.FdkAac
import Data.Time.Clock
import Data.Typeable
import Data.Word
import GHC.TypeLits
main :: IO ()
main = defaultMain [bgroupFromTestDuration 1]
bgroupFromTestDuration :: NominalDiffTime -> Benchmark
bgroupFromTestDuration testdur =
bgroup (show testdur Prelude.++ " ptime=20ms") $
let frameCount = ceiling (testdur / ptime)
ptime = 20 / 1000
in [ bgroup
"AAC HE 16kHz"
[ bench "Stereo" $
nfIO $
encodeNFrames (aacEncoderConfig aacHe16KhzStereo) $
testFrames ptime frameCount
, bench "Mono" $
nfIO $
encodeNFrames (aacEncoderConfig aacHe16KhzMono) $
testFrames ptime frameCount
]
, bgroup
"AAC LC 16kHz"
[ bench "Stereo" $
nfIO $
encodeNFrames (aacEncoderConfig aacLc16KhzStereo) $
testFrames ptime frameCount
, bench "Mono" $
nfIO $
encodeNFrames (aacEncoderConfig aacLc16KhzMono) $
testFrames ptime frameCount
]
, bgroup
"AAC HE 48kHz"
[ bench "Stereo" $
nfIO $
encodeNFrames (aacEncoderConfig aacHe48KhzStereo) $
testFrames ptime frameCount
, bench "Mono" $
nfIO $
encodeNFrames (aacEncoderConfig aacHe48KhzMono) $
testFrames ptime frameCount
]
, bgroup
"AAC LC 48kHz"
[ bench "Stereo" $
nfIO $
encodeNFrames (aacEncoderConfig aacLc48KhzStereo) $
testFrames ptime frameCount
, bench "Mono" $
nfIO $
encodeNFrames (aacEncoderConfig aacLc48KhzMono) $
testFrames ptime 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
-> [SyncStream SrcId32 () (Audio r channels (Raw S16))]
-> IO [Stream SrcId32 SeqNum64 (Ticks r Word64) (AacEncoderInfo r channels aot) (Audio r channels (Aac aot))]
encodeNFrames cfg pcms =
runStdoutLoggingT $
runConduitRes $
sourceList pcms .| encodeLinearToAacC cfg .| setSequenceNumberAndTimestampC .|
consume
testFrames
:: (KnownRate r, IsPcmValue (Pcm channels S16))
=> NominalDiffTime
-> Int
-> [SyncStream SrcId32 () (Audio r channels (Raw S16))]
testFrames frameDuration frames =
Prelude.replicate frames $
MkStream (Next (MkFrame () () (blankFor frameDuration)))