content/media/compiledtest/TestAudioMixer.cpp

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/content/media/compiledtest/TestAudioMixer.cpp	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,156 @@
     1.4 +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
     1.5 +/* This Source Code Form is subject to the terms of the Mozilla Public
     1.6 + * License, v. 2.0. If a copy of the MPL was not distributed with this file,
     1.7 + * You can obtain one at http://mozilla.org/MPL/2.0/. */
     1.8 +
     1.9 +#include "AudioMixer.h"
    1.10 +#include <assert.h>
    1.11 +
    1.12 +using mozilla::AudioDataValue;
    1.13 +using mozilla::AudioSampleFormat;
    1.14 +
    1.15 +/* In this test, the different audio stream and channels are always created to
    1.16 + * cancel each other. */
    1.17 +void MixingDone(AudioDataValue* aData, AudioSampleFormat aFormat, uint32_t aChannels, uint32_t aFrames, uint32_t aSampleRate)
    1.18 +{
    1.19 +  bool silent = true;
    1.20 +  for (uint32_t i = 0; i < aChannels * aFrames; i++) {
    1.21 +    if (aData[i] != 0.0) {
    1.22 +      if (aFormat == mozilla::AUDIO_FORMAT_S16) {
    1.23 +        fprintf(stderr, "Sample at %d is not silent: %d\n", i, (short)aData[i]);
    1.24 +      } else {
    1.25 +        fprintf(stderr, "Sample at %d is not silent: %f\n", i, (float)aData[i]);
    1.26 +      }
    1.27 +      silent = false;
    1.28 +    }
    1.29 +  }
    1.30 +  if (!silent) {
    1.31 +    MOZ_CRASH();
    1.32 +  }
    1.33 +}
    1.34 +
    1.35 +/* Helper function to give us the maximum and minimum value that don't clip,
    1.36 + * for a given sample format (integer or floating-point). */
    1.37 +template<typename T>
    1.38 +T GetLowValue();
    1.39 +
    1.40 +template<typename T>
    1.41 +T GetHighValue();
    1.42 +
    1.43 +template<>
    1.44 +float GetLowValue<float>() {
    1.45 +  return -1.0;
    1.46 +}
    1.47 +
    1.48 +template<>
    1.49 +short GetLowValue<short>() {
    1.50 +  return -INT16_MAX;
    1.51 +}
    1.52 +
    1.53 +template<>
    1.54 +float GetHighValue<float>() {
    1.55 +  return 1.0;
    1.56 +}
    1.57 +
    1.58 +template<>
    1.59 +short GetHighValue<short>() {
    1.60 +  return INT16_MAX;
    1.61 +}
    1.62 +
    1.63 +void FillBuffer(AudioDataValue* aBuffer, uint32_t aLength, AudioDataValue aValue)
    1.64 +{
    1.65 +  AudioDataValue* end = aBuffer + aLength;
    1.66 +  while (aBuffer != end) {
    1.67 +    *aBuffer++ = aValue;
    1.68 +  }
    1.69 +}
    1.70 +
    1.71 +int main(int argc, char* argv[]) {
    1.72 +  const uint32_t CHANNEL_LENGTH = 256;
    1.73 +  const uint32_t AUDIO_RATE = 44100;
    1.74 +  AudioDataValue a[CHANNEL_LENGTH * 2];
    1.75 +  AudioDataValue b[CHANNEL_LENGTH * 2];
    1.76 +  FillBuffer(a, CHANNEL_LENGTH, GetLowValue<AudioDataValue>());
    1.77 +  FillBuffer(a + CHANNEL_LENGTH, CHANNEL_LENGTH, GetHighValue<AudioDataValue>());
    1.78 +  FillBuffer(b, CHANNEL_LENGTH, GetHighValue<AudioDataValue>());
    1.79 +  FillBuffer(b + CHANNEL_LENGTH, CHANNEL_LENGTH, GetLowValue<AudioDataValue>());
    1.80 +
    1.81 +  {
    1.82 +    int iterations = 2;
    1.83 +    mozilla::AudioMixer mixer(MixingDone);
    1.84 +
    1.85 +    fprintf(stderr, "Test AudioMixer constant buffer length.\n");
    1.86 +
    1.87 +    while (iterations--) {
    1.88 +      mixer.Mix(a, 2, CHANNEL_LENGTH, AUDIO_RATE);
    1.89 +      mixer.Mix(b, 2, CHANNEL_LENGTH, AUDIO_RATE);
    1.90 +      mixer.FinishMixing();
    1.91 +    }
    1.92 +  }
    1.93 +
    1.94 +  {
    1.95 +    mozilla::AudioMixer mixer(MixingDone);
    1.96 +
    1.97 +    fprintf(stderr, "Test AudioMixer variable buffer length.\n");
    1.98 +
    1.99 +    FillBuffer(a, CHANNEL_LENGTH / 2, GetLowValue<AudioDataValue>());
   1.100 +    FillBuffer(a + CHANNEL_LENGTH / 2, CHANNEL_LENGTH / 2, GetLowValue<AudioDataValue>());
   1.101 +    FillBuffer(b, CHANNEL_LENGTH / 2, GetHighValue<AudioDataValue>());
   1.102 +    FillBuffer(b + CHANNEL_LENGTH / 2, CHANNEL_LENGTH / 2, GetHighValue<AudioDataValue>());
   1.103 +    mixer.Mix(a, 2, CHANNEL_LENGTH / 2, AUDIO_RATE);
   1.104 +    mixer.Mix(b, 2, CHANNEL_LENGTH / 2, AUDIO_RATE);
   1.105 +    mixer.FinishMixing();
   1.106 +    FillBuffer(a, CHANNEL_LENGTH, GetLowValue<AudioDataValue>());
   1.107 +    FillBuffer(a + CHANNEL_LENGTH, CHANNEL_LENGTH, GetHighValue<AudioDataValue>());
   1.108 +    FillBuffer(b, CHANNEL_LENGTH, GetHighValue<AudioDataValue>());
   1.109 +    FillBuffer(b + CHANNEL_LENGTH, CHANNEL_LENGTH, GetLowValue<AudioDataValue>());
   1.110 +    mixer.Mix(a, 2, CHANNEL_LENGTH, AUDIO_RATE);
   1.111 +    mixer.Mix(b, 2, CHANNEL_LENGTH, AUDIO_RATE);
   1.112 +    mixer.FinishMixing();
   1.113 +    FillBuffer(a, CHANNEL_LENGTH / 2, GetLowValue<AudioDataValue>());
   1.114 +    FillBuffer(a + CHANNEL_LENGTH / 2, CHANNEL_LENGTH / 2, GetLowValue<AudioDataValue>());
   1.115 +    FillBuffer(b, CHANNEL_LENGTH / 2, GetHighValue<AudioDataValue>());
   1.116 +    FillBuffer(b + CHANNEL_LENGTH / 2, CHANNEL_LENGTH / 2, GetHighValue<AudioDataValue>());
   1.117 +    mixer.Mix(a, 2, CHANNEL_LENGTH / 2, AUDIO_RATE);
   1.118 +    mixer.Mix(b, 2, CHANNEL_LENGTH / 2, AUDIO_RATE);
   1.119 +    mixer.FinishMixing();
   1.120 +  }
   1.121 +
   1.122 +  FillBuffer(a, CHANNEL_LENGTH, GetLowValue<AudioDataValue>());
   1.123 +  FillBuffer(b, CHANNEL_LENGTH, GetHighValue<AudioDataValue>());
   1.124 +
   1.125 +  {
   1.126 +    mozilla::AudioMixer mixer(MixingDone);
   1.127 +    fprintf(stderr, "Test AudioMixer variable channel count.\n");
   1.128 +
   1.129 +    mixer.Mix(a, 1, CHANNEL_LENGTH, AUDIO_RATE);
   1.130 +    mixer.Mix(b, 1, CHANNEL_LENGTH, AUDIO_RATE);
   1.131 +    mixer.FinishMixing();
   1.132 +    mixer.Mix(a, 1, CHANNEL_LENGTH, AUDIO_RATE);
   1.133 +    mixer.Mix(b, 1, CHANNEL_LENGTH, AUDIO_RATE);
   1.134 +    mixer.FinishMixing();
   1.135 +    mixer.Mix(a, 1, CHANNEL_LENGTH, AUDIO_RATE);
   1.136 +    mixer.Mix(b, 1, CHANNEL_LENGTH, AUDIO_RATE);
   1.137 +    mixer.FinishMixing();
   1.138 +  }
   1.139 +
   1.140 +  {
   1.141 +    mozilla::AudioMixer mixer(MixingDone);
   1.142 +    fprintf(stderr, "Test AudioMixer variable stream count.\n");
   1.143 +
   1.144 +    mixer.Mix(a, 2, CHANNEL_LENGTH, AUDIO_RATE);
   1.145 +    mixer.Mix(b, 2, CHANNEL_LENGTH, AUDIO_RATE);
   1.146 +    mixer.FinishMixing();
   1.147 +    mixer.Mix(a, 2, CHANNEL_LENGTH, AUDIO_RATE);
   1.148 +    mixer.Mix(b, 2, CHANNEL_LENGTH, AUDIO_RATE);
   1.149 +    mixer.Mix(a, 2, CHANNEL_LENGTH, AUDIO_RATE);
   1.150 +    mixer.Mix(b, 2, CHANNEL_LENGTH, AUDIO_RATE);
   1.151 +    mixer.FinishMixing();
   1.152 +    mixer.Mix(a, 2, CHANNEL_LENGTH, AUDIO_RATE);
   1.153 +    mixer.Mix(b, 2, CHANNEL_LENGTH, AUDIO_RATE);
   1.154 +    mixer.FinishMixing();
   1.155 +  }
   1.156 +
   1.157 +  return 0;
   1.158 +}
   1.159 +

mercurial