Index: webrtc/modules/audio_processing/test/conversational_speech/generator_unittest.cc |
diff --git a/webrtc/modules/audio_processing/test/conversational_speech/generator_unittest.cc b/webrtc/modules/audio_processing/test/conversational_speech/generator_unittest.cc |
index 406d95cf211ebe3ba55eb343b72854555574dfec..6797beb98305272e9aa19626317a049000b0dcf1 100644 |
--- a/webrtc/modules/audio_processing/test/conversational_speech/generator_unittest.cc |
+++ b/webrtc/modules/audio_processing/test/conversational_speech/generator_unittest.cc |
@@ -33,15 +33,22 @@ |
// cases in which there are wrong offsets leading to self cross-talk (which is |
// rejected). |
+// MSVC++ requires this to be set before any other includes to get M_PI. |
+#define _USE_MATH_DEFINES |
+ |
#include <stdio.h> |
+#include <cmath> |
#include <map> |
#include <memory> |
#include "webrtc/base/logging.h" |
+#include "webrtc/base/pathutils.h" |
+#include "webrtc/common_audio/wav_file.h" |
#include "webrtc/modules/audio_processing/test/conversational_speech/config.h" |
#include "webrtc/modules/audio_processing/test/conversational_speech/mock_wavreader_factory.h" |
#include "webrtc/modules/audio_processing/test/conversational_speech/multiend_call.h" |
#include "webrtc/modules/audio_processing/test/conversational_speech/timing.h" |
+#include "webrtc/modules/audio_processing/test/conversational_speech/wavreader_factory.h" |
#include "webrtc/test/gmock.h" |
#include "webrtc/test/gtest.h" |
#include "webrtc/test/testsupport/fileutils.h" |
@@ -55,7 +62,7 @@ using conversational_speech::SaveTiming; |
using conversational_speech::MockWavReaderFactory; |
using conversational_speech::MultiEndCall; |
using conversational_speech::Turn; |
-using conversational_speech::WavReaderAbstractFactory; |
+using conversational_speech::WavReaderFactory; |
const char* const audiotracks_path = "/path/to/audiotracks"; |
const char* const timing_filepath = "/path/to/timing_file.txt"; |
@@ -89,6 +96,23 @@ std::unique_ptr<MockWavReaderFactory> CreateMockWavReaderFactory() { |
kDefaultMockWavReaderFactoryParamsMap)); |
} |
+void CreateSineWavFile(const std::string& filepath, |
+ const MockWavReaderFactory::Params& params, |
+ float frequency = 440.0f) { |
+ // Create samples. |
+ constexpr double two_pi = 2.0 * M_PI; |
+ std::vector<int16_t> samples(params.num_samples); |
+ for (std::size_t i = 0; i < params.num_samples; ++i) { |
+ // TODO(alessiob): the produced tone is not pure, improve. |
+ samples[i] = std::lround(32767.0f * std::sin( |
+ two_pi * i * frequency / params.sample_rate)); |
+ } |
+ |
+ // Write samples. |
+ WavWriter wav_writer(filepath, params.sample_rate, params.num_channels); |
+ wav_writer.WriteSamples(samples.data(), params.num_samples); |
+} |
+ |
} // namespace |
using testing::_; |
@@ -487,5 +511,34 @@ TEST_F(ConversationalSpeechTest, MultiEndCallSetupLongSequenceInvalid) { |
EXPECT_FALSE(multiend_call.valid()); |
} |
+TEST_F(ConversationalSpeechTest, MultiEndCallWavReaderAdaptorSine) { |
+ // Parameters with which wav files are created. |
+ constexpr int duration_seconds = 5; |
+ const int sample_rates[] = {8000, 11025, 16000, 22050, 32000, 44100, 48000}; |
+ |
+ for (int sample_rate : sample_rates) { |
+ const rtc::Pathname temp_filename( |
+ OutputPath(), "TempSineWavFile_" + std::to_string(sample_rate) |
+ + ".wav"); |
+ |
+ // Write wav file. |
+ const std::size_t num_samples = duration_seconds * sample_rate; |
+ MockWavReaderFactory::Params params = {sample_rate, 1u, num_samples}; |
+ CreateSineWavFile(temp_filename.pathname(), params); |
+ LOG(LS_VERBOSE) << "wav file @" << sample_rate << " Hz created (" |
+ << num_samples << " samples)"; |
+ |
+ // Load wav file and check if params match. |
+ WavReaderFactory wav_reader_factory; |
+ auto wav_reader = wav_reader_factory.Create(temp_filename.pathname()); |
+ EXPECT_EQ(sample_rate, wav_reader->SampleRate()); |
+ EXPECT_EQ(1u, wav_reader->NumChannels()); |
+ EXPECT_EQ(num_samples, wav_reader->NumSamples()); |
+ |
+ // Clean up. |
+ remove(temp_filename.pathname().c_str()); |
+ } |
+} |
+ |
} // namespace test |
} // namespace webrtc |