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] ]