summaryrefslogtreecommitdiffstats
path: root/src/3rdparty/resonance-audio/resonance_audio/ambisonics/stereo_from_soundfield_converter_test.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/3rdparty/resonance-audio/resonance_audio/ambisonics/stereo_from_soundfield_converter_test.cc')
-rw-r--r--src/3rdparty/resonance-audio/resonance_audio/ambisonics/stereo_from_soundfield_converter_test.cc103
1 files changed, 103 insertions, 0 deletions
diff --git a/src/3rdparty/resonance-audio/resonance_audio/ambisonics/stereo_from_soundfield_converter_test.cc b/src/3rdparty/resonance-audio/resonance_audio/ambisonics/stereo_from_soundfield_converter_test.cc
new file mode 100644
index 000000000..aa1f5c70a
--- /dev/null
+++ b/src/3rdparty/resonance-audio/resonance_audio/ambisonics/stereo_from_soundfield_converter_test.cc
@@ -0,0 +1,103 @@
+/*
+Copyright 2018 Google Inc. All Rights Reserved.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS-IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+#include "ambisonics/stereo_from_soundfield_converter.h"
+
+#include <iterator>
+
+#include "third_party/googletest/googletest/include/gtest/gtest.h"
+#include "base/audio_buffer.h"
+#include "base/constants_and_types.h"
+#include "utils/planar_interleaved_conversion.h"
+
+namespace vraudio {
+
+namespace {
+
+// Number of frames per buffer.
+const size_t kFramesPerBuffer = 2;
+
+// First order ambisonic signal in the AmbiX format (W, Y, Z, X), sound source
+// in the front.
+const float kFirstOrderSourceFront[] = {1.0f, 0.0f, 0.0f, 1.0f,
+ 1.0f, 0.0f, 0.0f, 1.0f};
+
+// First order ambisonic signal in the AmbiX format (W, Y, Z, X), sound source
+// to the left.
+const float kFirstOrderSourceLeft[] = {1.0f, 1.0f, 0.0f, 0.0f,
+ 1.0f, 1.0f, 0.0f, 0.0f};
+
+// Tests whether the conversion to stereo from soundfield results in equal
+// signal in both L/R output channels when there is a single source in front of
+// the soundfield.
+TEST(StereoFromSoundfieldConverterTest, StereoFromSoundfieldFrontTest) {
+ // Initialize the soundfield input buffer.
+ const std::vector<float> soundfield_data(std::begin(kFirstOrderSourceFront),
+ std::end(kFirstOrderSourceFront));
+ AudioBuffer soundfield_buffer(
+ kNumFirstOrderAmbisonicChannels,
+ soundfield_data.size() / kNumFirstOrderAmbisonicChannels);
+ FillAudioBuffer(soundfield_data, kNumFirstOrderAmbisonicChannels,
+ &soundfield_buffer);
+
+ // Output buffer is stereo.
+ AudioBuffer output(kNumStereoChannels,
+ soundfield_data.size() / kNumFirstOrderAmbisonicChannels);
+
+ StereoFromSoundfield(soundfield_buffer, &output);
+
+ // Test for near equality.
+ ASSERT_EQ(kNumStereoChannels, output.num_channels());
+ const AudioBuffer::Channel& output_channel_left = output[0];
+ const AudioBuffer::Channel& output_channel_right = output[1];
+ for (size_t frame = 0; frame < kFramesPerBuffer; ++frame) {
+ EXPECT_NEAR(output_channel_left[frame], output_channel_right[frame],
+ kEpsilonFloat);
+ }
+}
+
+// Tests whether the conversion to stereo from soundfield, when the sound source
+// in the soundfield is to the left, results in a signal only in the L output
+// channel.
+TEST(StereoFromSoundfieldConverterTest, StereoFromSoundfieldLeftTest) {
+ // Initialize the soundfield input buffer.
+ const std::vector<float> soundfield_data(std::begin(kFirstOrderSourceLeft),
+ std::end(kFirstOrderSourceLeft));
+ AudioBuffer soundfield_buffer(
+ kNumFirstOrderAmbisonicChannels,
+ soundfield_data.size() / kNumFirstOrderAmbisonicChannels);
+ FillAudioBuffer(soundfield_data, kNumFirstOrderAmbisonicChannels,
+ &soundfield_buffer);
+
+ // Output buffer is stereo.
+ AudioBuffer output(kNumStereoChannels,
+ soundfield_data.size() / kNumFirstOrderAmbisonicChannels);
+
+ StereoFromSoundfield(soundfield_buffer, &output);
+
+ // Test for near equality.
+ ASSERT_EQ(kNumStereoChannels, output.num_channels());
+ const AudioBuffer::Channel& output_channel_left = output[0];
+ const AudioBuffer::Channel& output_channel_right = output[1];
+ for (size_t frame = 0; frame < kFramesPerBuffer; ++frame) {
+ EXPECT_NEAR(output_channel_left[frame], 1.0f, kEpsilonFloat);
+ EXPECT_NEAR(output_channel_right[frame], 0.0f, kEpsilonFloat);
+ }
+}
+
+} // namespace
+
+} // namespace vraudio