content/media/compiledtest/TestAudioMixer.cpp

Wed, 31 Dec 2014 06:55:50 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:55:50 +0100
changeset 2
7e26c7da4463
permissions
-rw-r--r--

Added tag UPSTREAM_283F7C6 for changeset ca08bd8f51b2

     1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
     2 /* This Source Code Form is subject to the terms of the Mozilla Public
     3  * License, v. 2.0. If a copy of the MPL was not distributed with this file,
     4  * You can obtain one at http://mozilla.org/MPL/2.0/. */
     6 #include "AudioMixer.h"
     7 #include <assert.h>
     9 using mozilla::AudioDataValue;
    10 using mozilla::AudioSampleFormat;
    12 /* In this test, the different audio stream and channels are always created to
    13  * cancel each other. */
    14 void MixingDone(AudioDataValue* aData, AudioSampleFormat aFormat, uint32_t aChannels, uint32_t aFrames, uint32_t aSampleRate)
    15 {
    16   bool silent = true;
    17   for (uint32_t i = 0; i < aChannels * aFrames; i++) {
    18     if (aData[i] != 0.0) {
    19       if (aFormat == mozilla::AUDIO_FORMAT_S16) {
    20         fprintf(stderr, "Sample at %d is not silent: %d\n", i, (short)aData[i]);
    21       } else {
    22         fprintf(stderr, "Sample at %d is not silent: %f\n", i, (float)aData[i]);
    23       }
    24       silent = false;
    25     }
    26   }
    27   if (!silent) {
    28     MOZ_CRASH();
    29   }
    30 }
    32 /* Helper function to give us the maximum and minimum value that don't clip,
    33  * for a given sample format (integer or floating-point). */
    34 template<typename T>
    35 T GetLowValue();
    37 template<typename T>
    38 T GetHighValue();
    40 template<>
    41 float GetLowValue<float>() {
    42   return -1.0;
    43 }
    45 template<>
    46 short GetLowValue<short>() {
    47   return -INT16_MAX;
    48 }
    50 template<>
    51 float GetHighValue<float>() {
    52   return 1.0;
    53 }
    55 template<>
    56 short GetHighValue<short>() {
    57   return INT16_MAX;
    58 }
    60 void FillBuffer(AudioDataValue* aBuffer, uint32_t aLength, AudioDataValue aValue)
    61 {
    62   AudioDataValue* end = aBuffer + aLength;
    63   while (aBuffer != end) {
    64     *aBuffer++ = aValue;
    65   }
    66 }
    68 int main(int argc, char* argv[]) {
    69   const uint32_t CHANNEL_LENGTH = 256;
    70   const uint32_t AUDIO_RATE = 44100;
    71   AudioDataValue a[CHANNEL_LENGTH * 2];
    72   AudioDataValue b[CHANNEL_LENGTH * 2];
    73   FillBuffer(a, CHANNEL_LENGTH, GetLowValue<AudioDataValue>());
    74   FillBuffer(a + CHANNEL_LENGTH, CHANNEL_LENGTH, GetHighValue<AudioDataValue>());
    75   FillBuffer(b, CHANNEL_LENGTH, GetHighValue<AudioDataValue>());
    76   FillBuffer(b + CHANNEL_LENGTH, CHANNEL_LENGTH, GetLowValue<AudioDataValue>());
    78   {
    79     int iterations = 2;
    80     mozilla::AudioMixer mixer(MixingDone);
    82     fprintf(stderr, "Test AudioMixer constant buffer length.\n");
    84     while (iterations--) {
    85       mixer.Mix(a, 2, CHANNEL_LENGTH, AUDIO_RATE);
    86       mixer.Mix(b, 2, CHANNEL_LENGTH, AUDIO_RATE);
    87       mixer.FinishMixing();
    88     }
    89   }
    91   {
    92     mozilla::AudioMixer mixer(MixingDone);
    94     fprintf(stderr, "Test AudioMixer variable buffer length.\n");
    96     FillBuffer(a, CHANNEL_LENGTH / 2, GetLowValue<AudioDataValue>());
    97     FillBuffer(a + CHANNEL_LENGTH / 2, CHANNEL_LENGTH / 2, GetLowValue<AudioDataValue>());
    98     FillBuffer(b, CHANNEL_LENGTH / 2, GetHighValue<AudioDataValue>());
    99     FillBuffer(b + CHANNEL_LENGTH / 2, CHANNEL_LENGTH / 2, GetHighValue<AudioDataValue>());
   100     mixer.Mix(a, 2, CHANNEL_LENGTH / 2, AUDIO_RATE);
   101     mixer.Mix(b, 2, CHANNEL_LENGTH / 2, AUDIO_RATE);
   102     mixer.FinishMixing();
   103     FillBuffer(a, CHANNEL_LENGTH, GetLowValue<AudioDataValue>());
   104     FillBuffer(a + CHANNEL_LENGTH, CHANNEL_LENGTH, GetHighValue<AudioDataValue>());
   105     FillBuffer(b, CHANNEL_LENGTH, GetHighValue<AudioDataValue>());
   106     FillBuffer(b + CHANNEL_LENGTH, CHANNEL_LENGTH, GetLowValue<AudioDataValue>());
   107     mixer.Mix(a, 2, CHANNEL_LENGTH, AUDIO_RATE);
   108     mixer.Mix(b, 2, CHANNEL_LENGTH, AUDIO_RATE);
   109     mixer.FinishMixing();
   110     FillBuffer(a, CHANNEL_LENGTH / 2, GetLowValue<AudioDataValue>());
   111     FillBuffer(a + CHANNEL_LENGTH / 2, CHANNEL_LENGTH / 2, GetLowValue<AudioDataValue>());
   112     FillBuffer(b, CHANNEL_LENGTH / 2, GetHighValue<AudioDataValue>());
   113     FillBuffer(b + CHANNEL_LENGTH / 2, CHANNEL_LENGTH / 2, GetHighValue<AudioDataValue>());
   114     mixer.Mix(a, 2, CHANNEL_LENGTH / 2, AUDIO_RATE);
   115     mixer.Mix(b, 2, CHANNEL_LENGTH / 2, AUDIO_RATE);
   116     mixer.FinishMixing();
   117   }
   119   FillBuffer(a, CHANNEL_LENGTH, GetLowValue<AudioDataValue>());
   120   FillBuffer(b, CHANNEL_LENGTH, GetHighValue<AudioDataValue>());
   122   {
   123     mozilla::AudioMixer mixer(MixingDone);
   124     fprintf(stderr, "Test AudioMixer variable channel count.\n");
   126     mixer.Mix(a, 1, CHANNEL_LENGTH, AUDIO_RATE);
   127     mixer.Mix(b, 1, CHANNEL_LENGTH, AUDIO_RATE);
   128     mixer.FinishMixing();
   129     mixer.Mix(a, 1, CHANNEL_LENGTH, AUDIO_RATE);
   130     mixer.Mix(b, 1, CHANNEL_LENGTH, AUDIO_RATE);
   131     mixer.FinishMixing();
   132     mixer.Mix(a, 1, CHANNEL_LENGTH, AUDIO_RATE);
   133     mixer.Mix(b, 1, CHANNEL_LENGTH, AUDIO_RATE);
   134     mixer.FinishMixing();
   135   }
   137   {
   138     mozilla::AudioMixer mixer(MixingDone);
   139     fprintf(stderr, "Test AudioMixer variable stream count.\n");
   141     mixer.Mix(a, 2, CHANNEL_LENGTH, AUDIO_RATE);
   142     mixer.Mix(b, 2, CHANNEL_LENGTH, AUDIO_RATE);
   143     mixer.FinishMixing();
   144     mixer.Mix(a, 2, CHANNEL_LENGTH, AUDIO_RATE);
   145     mixer.Mix(b, 2, CHANNEL_LENGTH, AUDIO_RATE);
   146     mixer.Mix(a, 2, CHANNEL_LENGTH, AUDIO_RATE);
   147     mixer.Mix(b, 2, CHANNEL_LENGTH, AUDIO_RATE);
   148     mixer.FinishMixing();
   149     mixer.Mix(a, 2, CHANNEL_LENGTH, AUDIO_RATE);
   150     mixer.Mix(b, 2, CHANNEL_LENGTH, AUDIO_RATE);
   151     mixer.FinishMixing();
   152   }
   154   return 0;
   155 }

mercurial