| Index: webrtc/modules/audio_processing/aec3/render_delay_buffer.cc
|
| diff --git a/webrtc/modules/audio_processing/aec3/render_delay_buffer.cc b/webrtc/modules/audio_processing/aec3/render_delay_buffer.cc
|
| index 6e6766ab4ded9a17104fe99c664049f0abafc98d..12dae1b8b470680c2ee806d03be27044a3b26b49 100644
|
| --- a/webrtc/modules/audio_processing/aec3/render_delay_buffer.cc
|
| +++ b/webrtc/modules/audio_processing/aec3/render_delay_buffer.cc
|
| @@ -97,6 +97,7 @@ class RenderDelayBufferImpl final : public RenderDelayBuffer {
|
| DownsampledRenderBuffer downsampled_render_buffer_;
|
| DecimatorBy4 render_decimator_;
|
| ApiCallJitterBuffer api_call_jitter_buffer_;
|
| + const std::vector<std::vector<float>> zero_block_;
|
| RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(RenderDelayBufferImpl);
|
| };
|
|
|
| @@ -107,7 +108,8 @@ RenderDelayBufferImpl::RenderDelayBufferImpl(size_t num_bands)
|
| num_bands,
|
| std::max(kResidualEchoPowerRenderWindowSize, kAdaptiveFilterLength),
|
| std::vector<size_t>(1, kAdaptiveFilterLength)),
|
| - api_call_jitter_buffer_(num_bands) {
|
| + api_call_jitter_buffer_(num_bands),
|
| + zero_block_(num_bands, std::vector<float>(kBlockSize, 0.f)) {
|
| buffer_.fill(std::vector<std::vector<float>>(
|
| num_bands, std::vector<float>(kBlockSize, 0.f)));
|
|
|
| @@ -147,12 +149,11 @@ bool RenderDelayBufferImpl::Insert(
|
|
|
| bool RenderDelayBufferImpl::UpdateBuffers() {
|
| bool underrun = true;
|
| - // Update the buffers with a new block if such is available, otherwise repeat
|
| - // the previous block.
|
| + // Update the buffers with a new block if such is available, otherwise insert
|
| + // a block of silence.
|
| if (api_call_jitter_buffer_.Size() > 0) {
|
| last_insert_index_ = (last_insert_index_ + 1) % buffer_.size();
|
| api_call_jitter_buffer_.Remove(&buffer_[last_insert_index_]);
|
| -
|
| underrun = false;
|
| }
|
|
|
| @@ -162,14 +163,22 @@ bool RenderDelayBufferImpl::UpdateBuffers() {
|
| downsampled_render_buffer_.buffer.size();
|
|
|
| std::array<float, kSubBlockSize> render_downsampled;
|
| - render_decimator_.Decimate(buffer_[last_insert_index_][0],
|
| - render_downsampled);
|
| + if (underrun) {
|
| + render_decimator_.Decimate(zero_block_[0], render_downsampled);
|
| + } else {
|
| + render_decimator_.Decimate(buffer_[last_insert_index_][0],
|
| + render_downsampled);
|
| + }
|
| std::copy(render_downsampled.rbegin(), render_downsampled.rend(),
|
| downsampled_render_buffer_.buffer.begin() +
|
| downsampled_render_buffer_.position);
|
|
|
| - fft_buffer_.Insert(
|
| - buffer_[(last_insert_index_ - delay_ + buffer_.size()) % buffer_.size()]);
|
| + if (underrun) {
|
| + fft_buffer_.Insert(zero_block_);
|
| + } else {
|
| + fft_buffer_.Insert(buffer_[(last_insert_index_ - delay_ + buffer_.size()) %
|
| + buffer_.size()]);
|
| + }
|
| return !underrun;
|
| }
|
|
|
|
|