Index: webrtc/modules/audio_processing/test/wav_based_simulator.cc |
diff --git a/webrtc/modules/audio_processing/test/wav_based_simulator.cc b/webrtc/modules/audio_processing/test/wav_based_simulator.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..3fbca92434b56137ba09c7efbd9324193ffdea06 |
--- /dev/null |
+++ b/webrtc/modules/audio_processing/test/wav_based_simulator.cc |
@@ -0,0 +1,156 @@ |
+/* |
+ * Copyright (c) 2016 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 "webrtc/modules/audio_processing/test/wav_based_simulator.h" |
+ |
+#include "webrtc/base/checks.h" |
+#include "webrtc/test/testsupport/trace_to_stderr.h" |
+ |
+namespace webrtc { |
+namespace test { |
+ |
+std::vector<WavBasedSimulator::SimulationEventType> |
+WavBasedSimulator::GetDefaultEventChain() const { |
+ std::vector<WavBasedSimulator::SimulationEventType> call_chain(2); |
+ call_chain[0] = SimulationEventType::kProcessStream; |
+ call_chain[1] = SimulationEventType::kProcessReverseStream; |
+ return call_chain; |
+} |
+ |
+void WavBasedSimulator::PrepareProcessStreamCall() { |
+ if (settings_.fixed_interface) { |
+ CopyToAudioFrame(*in_buf_, &fwd_frame_); |
+ } |
+ ap_->set_stream_key_pressed(settings_.use_ts && (*settings_.use_ts)); |
+ |
+ RTC_CHECK_EQ(AudioProcessing::kNoError, |
+ ap_->set_stream_delay_ms( |
+ settings_.stream_delay ? *settings_.stream_delay : 0)); |
+ |
+ ap_->echo_cancellation()->set_stream_drift_samples( |
+ settings_.stream_drift_samples ? *settings_.stream_drift_samples : 0); |
+ |
+ RTC_CHECK_EQ(AudioProcessing::kNoError, |
+ ap_->gain_control()->set_stream_analog_level( |
+ last_specified_microphone_level_)); |
+} |
+ |
+void WavBasedSimulator::PrepareReverseProcessStreamCall() { |
+ if (settings_.fixed_interface) { |
+ CopyToAudioFrame(*reverse_in_buf_, &rev_frame_); |
+ } |
+} |
+ |
+void WavBasedSimulator::Process() { |
+ std::unique_ptr<test::TraceToStderr> trace_to_stderr; |
+ if (settings_.use_verbose_logging) { |
+ trace_to_stderr.reset(new test::TraceToStderr(true)); |
+ } |
+ |
+ call_chain_ = GetDefaultEventChain(); |
+ CreateAudioProcessor(); |
+ |
+ Initialize(); |
+ |
+ bool samples_left_to_process = true; |
+ int call_chain_index = 0; |
+ int num_forward_chunks_processed = 0; |
+ const int kOneBykChunksPerSecond = |
+ 1.f / AudioProcessingSimulator::kChunksPerSecond; |
+ while (samples_left_to_process) { |
+ switch (call_chain_[call_chain_index]) { |
+ case SimulationEventType::kProcessStream: |
+ samples_left_to_process = HandleProcessStreamCall(); |
+ ++num_forward_chunks_processed; |
+ break; |
+ case SimulationEventType::kProcessReverseStream: |
+ if (settings_.reverse_input_filename) { |
+ samples_left_to_process = HandleProcessReverseStreamCall(); |
+ } |
+ break; |
+ default: |
+ RTC_CHECK(false); |
+ } |
+ |
+ call_chain_index = (call_chain_index + 1) % call_chain_.size(); |
+ |
+ if (trace_to_stderr) { |
+ trace_to_stderr->SetTimeSeconds(num_forward_chunks_processed * |
+ kOneBykChunksPerSecond); |
+ } |
+ } |
+ |
+ DestroyAudioProcessor(); |
+} |
+ |
+bool WavBasedSimulator::HandleProcessStreamCall() { |
+ bool samples_left_to_process = buffer_reader_->Read(in_buf_.get()); |
+ if (samples_left_to_process) { |
+ PrepareProcessStreamCall(); |
+ ProcessStream(settings_.fixed_interface); |
+ last_specified_microphone_level_ = |
+ ap_->gain_control()->stream_analog_level(); |
+ } |
+ return samples_left_to_process; |
+} |
+ |
+bool WavBasedSimulator::HandleProcessReverseStreamCall() { |
+ bool samples_left_to_process = |
+ reverse_buffer_reader_->Read(reverse_in_buf_.get()); |
+ if (samples_left_to_process) { |
+ PrepareReverseProcessStreamCall(); |
+ ProcessReverseStream(settings_.fixed_interface); |
+ } |
+ return samples_left_to_process; |
+} |
+ |
+void WavBasedSimulator::Initialize() { |
+ std::unique_ptr<WavReader> in_file( |
+ new WavReader(settings_.input_filename->c_str())); |
+ int input_sample_rate_hz = in_file->sample_rate(); |
+ int input_num_channels = in_file->num_channels(); |
+ buffer_reader_.reset(new ChannelBufferWavReader(std::move(in_file))); |
+ |
+ int output_sample_rate_hz = settings_.output_sample_rate_hz |
+ ? *settings_.output_sample_rate_hz |
+ : input_sample_rate_hz; |
+ int output_num_channels = settings_.output_num_channels |
+ ? *settings_.output_num_channels |
+ : input_num_channels; |
+ |
+ int reverse_sample_rate_hz = 48000; |
+ int reverse_num_channels = 1; |
+ int reverse_output_sample_rate_hz = 48000; |
+ int reverse_output_num_channels = 1; |
+ if (settings_.reverse_input_filename) { |
+ std::unique_ptr<WavReader> reverse_in_file( |
+ new WavReader(settings_.reverse_input_filename->c_str())); |
+ reverse_sample_rate_hz = reverse_in_file->sample_rate(); |
+ reverse_num_channels = reverse_in_file->num_channels(); |
+ reverse_buffer_reader_.reset( |
+ new ChannelBufferWavReader(std::move(reverse_in_file))); |
+ |
+ reverse_output_sample_rate_hz = |
+ settings_.reverse_output_sample_rate_hz |
+ ? *settings_.reverse_output_sample_rate_hz |
+ : reverse_sample_rate_hz; |
+ reverse_output_num_channels = settings_.reverse_output_num_channels |
+ ? *settings_.reverse_output_num_channels |
+ : reverse_num_channels; |
+ } |
+ |
+ SetupBuffersConfigsOutputs( |
+ input_sample_rate_hz, output_sample_rate_hz, reverse_sample_rate_hz, |
+ reverse_output_sample_rate_hz, input_num_channels, output_num_channels, |
+ reverse_num_channels, reverse_output_num_channels); |
+} |
+ |
+} // namespace test |
+} // namespace webrtc |