summaryrefslogtreecommitdiffstats
path: root/dom/media/gtest/TestAudioBuffer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'dom/media/gtest/TestAudioBuffer.cpp')
-rw-r--r--dom/media/gtest/TestAudioBuffer.cpp46
1 files changed, 46 insertions, 0 deletions
diff --git a/dom/media/gtest/TestAudioBuffer.cpp b/dom/media/gtest/TestAudioBuffer.cpp
new file mode 100644
index 0000000000..63b96eac2b
--- /dev/null
+++ b/dom/media/gtest/TestAudioBuffer.cpp
@@ -0,0 +1,46 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "MediaData.h"
+#include "gtest/gtest.h"
+
+using mozilla::AlignedFloatBuffer;
+using mozilla::AudioDataValue;
+using mozilla::FloatToAudioSample;
+using mozilla::InflatableShortBuffer;
+
+void FillSine(InflatableShortBuffer& aBuf, AlignedFloatBuffer& aFloatBuf) {
+ // Write a constant-pitch sine wave in both the integer and float buffers.
+ float phase = 0;
+ float phaseIncrement = 2 * M_PI * 440. / 44100.f;
+ for (uint32_t i = 0; i < aBuf.Length(); i++) {
+ aBuf.get()[i] = FloatToAudioSample<int16_t>(sin(phase));
+ aFloatBuf.get()[i] = sin(phase);
+ phase += phaseIncrement;
+ if (phase >= 2 * M_PI) {
+ phase -= 2 * M_PI;
+ }
+ }
+}
+
+TEST(InflatableAudioBuffer, Test)
+{
+ for (uint32_t i = 1; i < 10000; i++) {
+ InflatableShortBuffer buf(i);
+ AlignedFloatBuffer bufFloat(i);
+ FillSine(buf, bufFloat);
+ AlignedFloatBuffer inflated = buf.Inflate();
+ for (uint32_t j = 0; j < buf.Length(); j++) {
+ // Accept a very small difference because floats are floored in the
+ // conversion to integer.
+ if (std::abs(bufFloat.get()[j] - inflated.get()[j]) * 32767. > 1.0) {
+ fprintf(stderr, "%f != %f (size: %u, index: %u)\n", bufFloat.get()[j],
+ inflated.get()[j], i, j);
+ ASSERT_TRUE(false);
+ }
+ }
+ }
+
+} // namespace audio_mixer