| 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));
|
|
|