Index: webrtc/test/fake_audio_device.cc |
diff --git a/webrtc/test/fake_audio_device.cc b/webrtc/test/fake_audio_device.cc |
index 7a3f0dd740e17e36128048a8625be3b5fed7b187..91d5978b3fccf0f08c116a7a7c796d0634d713e6 100644 |
--- a/webrtc/test/fake_audio_device.cc |
+++ b/webrtc/test/fake_audio_device.cc |
@@ -111,6 +111,69 @@ class WavFileWriter final : public test::FakeAudioDevice::Renderer { |
WavWriter wav_writer_; |
}; |
+class BoundedWavFileWriter : public test::FakeAudioDevice::Renderer { |
+ public: |
+ BoundedWavFileWriter(std::string filename, int sampling_frequency_in_hz) |
+ : sampling_frequency_in_hz_(sampling_frequency_in_hz), |
+ wav_writer_(filename, sampling_frequency_in_hz, 1), |
+ silent_audio_(test::FakeAudioDevice::SamplesPerFrame( |
+ sampling_frequency_in_hz), 0), |
+ started_writing_(false), |
+ trailing_zeros_(0) {} |
+ |
+ int SamplingFrequency() const override { |
+ return sampling_frequency_in_hz_; |
+ } |
+ |
+ bool Render(rtc::ArrayView<const int16_t> data) override { |
+ const int16_t kAmplitudeThreshold = 5; |
+ |
+ const int16_t* begin = data.begin(); |
+ const int16_t* end = data.end(); |
+ if (!started_writing_) { |
+ // Cut off silence at the beginning. |
+ while (begin < end) { |
+ if (std::abs(*begin) > kAmplitudeThreshold) { |
+ started_writing_ = true; |
+ break; |
+ } |
+ ++begin; |
+ } |
+ } |
+ if (started_writing_) { |
+ // Cut off silence at the end. |
+ while (begin < end) { |
+ if (*(end - 1) != 0) { |
+ break; |
+ } |
+ --end; |
+ } |
+ if (begin < end) { |
+ // If it turns out that the silence was not final, need to write all the |
+ // skipped zeros and continue writing audio. |
+ while (trailing_zeros_ > 0) { |
+ const size_t zeros_to_write = std::min(trailing_zeros_, |
+ silent_audio_.size()); |
+ wav_writer_.WriteSamples(silent_audio_.data(), zeros_to_write); |
+ trailing_zeros_ -= zeros_to_write; |
+ } |
+ wav_writer_.WriteSamples(begin, end - begin); |
+ } |
+ // Save the number of zeros we skipped in case this needs to be restored. |
+ trailing_zeros_ += data.end() - end; |
+ } |
+ return true; |
+ } |
+ |
+ private: |
+ int sampling_frequency_in_hz_; |
+ WavWriter wav_writer_; |
+ std::vector<int16_t> silent_audio_; |
+ bool started_writing_; |
+ size_t trailing_zeros_; |
+}; |
+ |
+ |
class DiscardRenderer final : public test::FakeAudioDevice::Renderer { |
public: |
explicit DiscardRenderer(int sampling_frequency_in_hz) |
@@ -162,6 +225,13 @@ std::unique_ptr<FakeAudioDevice::Renderer> FakeAudioDevice::CreateWavFileWriter( |
} |
std::unique_ptr<FakeAudioDevice::Renderer> |
+ FakeAudioDevice::CreateBoundedWavFileWriter( |
+ std::string filename, int sampling_frequency_in_hz) { |
+ return std::unique_ptr<FakeAudioDevice::Renderer>( |
+ new BoundedWavFileWriter(filename, sampling_frequency_in_hz)); |
+} |
+ |
+std::unique_ptr<FakeAudioDevice::Renderer> |
FakeAudioDevice::CreateDiscardRenderer(int sampling_frequency_in_hz) { |
return std::unique_ptr<FakeAudioDevice::Renderer>( |
new DiscardRenderer(sampling_frequency_in_hz)); |