/* * Copyright (c) 2017 The WebRTC project authors. All Rights Reserved. * * Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source * tree. An additional intellectual property rights grant can be found * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree. */ #include #include #include "common_audio/wav_file.h" #include "common_audio/wav_header.h" #include "test/fake_audio_device.h" #include "test/gtest.h" #include "test/testsupport/fileutils.h" namespace webrtc { namespace test { namespace { void RunTest(const std::vector& input_samples, const std::vector& expected_samples, size_t samples_per_frame) { const ::testing::TestInfo* const test_info = ::testing::UnitTest::GetInstance()->current_test_info(); const std::string output_filename = test::OutputPath() + "BoundedWavFileWriterTest_" + test_info->name() + ".wav"; static const size_t kSamplesPerFrame = 8; static const int kSampleRate = kSamplesPerFrame * 100; EXPECT_EQ(FakeAudioDevice::SamplesPerFrame(kSampleRate), kSamplesPerFrame); { std::unique_ptr writer = FakeAudioDevice::CreateBoundedWavFileWriter(output_filename, 800); for (size_t i = 0; i < input_samples.size(); i += kSamplesPerFrame) { EXPECT_TRUE(writer->Render(rtc::ArrayView( &input_samples[i], std::min(kSamplesPerFrame, input_samples.size() - i)))); } } { WavReader reader(output_filename); std::vector read_samples(expected_samples.size()); EXPECT_EQ(expected_samples.size(), reader.ReadSamples(read_samples.size(), read_samples.data())); EXPECT_EQ(expected_samples, read_samples); EXPECT_EQ(0u, reader.ReadSamples(read_samples.size(), read_samples.data())); } remove(output_filename.c_str()); } } // namespace TEST(BoundedWavFileWriterTest, NoSilence) { static const std::vector kInputSamples = { 75, 1234, 243, -1231, -22222, 0, 3, 88, 1222, -1213, -13222, -7, -3525, 5787, -25247, 8 }; static const std::vector kExpectedSamples = kInputSamples; RunTest(kInputSamples, kExpectedSamples, 8); } TEST(BoundedWavFileWriterTest, SomeStartSilence) { static const std::vector kInputSamples = { 0, 0, 0, 0, 3, 0, 0, 0, 0, 3, -13222, -7, -3525, 5787, -25247, 8 }; static const std::vector kExpectedSamples(kInputSamples.begin() + 10, kInputSamples.end()); RunTest(kInputSamples, kExpectedSamples, 8); } TEST(BoundedWavFileWriterTest, NegativeStartSilence) { static const std::vector kInputSamples = { 0, -4, -6, 0, 3, 0, 0, 0, 0, 3, -13222, -7, -3525, 5787, -25247, 8 }; static const std::vector kExpectedSamples(kInputSamples.begin() + 2, kInputSamples.end()); RunTest(kInputSamples, kExpectedSamples, 8); } TEST(BoundedWavFileWriterTest, SomeEndSilence) { static const std::vector kInputSamples = { 75, 1234, 243, -1231, -22222, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; static const std::vector kExpectedSamples(kInputSamples.begin(), kInputSamples.end() - 9); RunTest(kInputSamples, kExpectedSamples, 8); } TEST(BoundedWavFileWriterTest, DoubleEndSilence) { static const std::vector kInputSamples = { 75, 1234, 243, -1231, -22222, 0, 0, 0, 0, -1213, -13222, -7, -3525, 5787, 0, 0 }; static const std::vector kExpectedSamples(kInputSamples.begin(), kInputSamples.end() - 2); RunTest(kInputSamples, kExpectedSamples, 8); } TEST(BoundedWavFileWriterTest, DoubleSilence) { static const std::vector kInputSamples = { 0, -1213, -13222, -7, -3525, 5787, 0, 0 }; static const std::vector kExpectedSamples(kInputSamples.begin() + 1, kInputSamples.end() - 2); RunTest(kInputSamples, kExpectedSamples, 8); } TEST(BoundedWavFileWriterTest, EndSilenceCutoff) { static const std::vector kInputSamples = { 75, 1234, 243, -1231, -22222, 0, 1, 0, 0, 0, 0 }; static const std::vector kExpectedSamples(kInputSamples.begin(), kInputSamples.end() - 4); RunTest(kInputSamples, kExpectedSamples, 8); } } // namespace test } // namespace webrtc