diff --git a/webrtc/modules/audio_processing/aec3/aec3_common.h b/webrtc/modules/audio_processing/aec3/aec3_common.h index ef7dcdf261..f03a7e33d2 100644 --- a/webrtc/modules/audio_processing/aec3/aec3_common.h +++ b/webrtc/modules/audio_processing/aec3/aec3_common.h @@ -63,7 +63,7 @@ constexpr float kFixedEchoPathGain = 100; constexpr size_t kRenderDelayBufferSize = (3 * kDownsampledRenderBufferSize) / (4 * kSubBlockSize); -constexpr size_t kMaxApiCallsJitterBlocks = 10; +constexpr size_t kMaxApiCallsJitterBlocks = 20; constexpr size_t kRenderTransferQueueSize = kMaxApiCallsJitterBlocks / 2; static_assert(2 * kRenderTransferQueueSize >= kMaxApiCallsJitterBlocks, "Requirement to ensure buffer overflow detection"); diff --git a/webrtc/modules/audio_processing/aec3/block_processor.cc b/webrtc/modules/audio_processing/aec3/block_processor.cc index 79892345b1..bb1286cd43 100644 --- a/webrtc/modules/audio_processing/aec3/block_processor.cc +++ b/webrtc/modules/audio_processing/aec3/block_processor.cc @@ -101,34 +101,34 @@ void BlockProcessorImpl::ProcessCapture( // been a render buffer overrun as the buffer alignment may be noncausal. delay_controller_->Reset(); render_buffer_->Reset(); - } else { - // Update the render buffers with new render data, filling the buffers with - // empty blocks when there is no render data available. - render_buffer_underrun = !render_buffer_->UpdateBuffers(); - - // Compute and and apply the render delay required to achieve proper signal - // alignment. - const size_t old_delay = render_buffer_->Delay(); - const size_t new_delay = delay_controller_->GetDelay( - render_buffer_->GetDownsampledRenderBuffer(), (*capture_block)[0]); - render_buffer_->SetDelay(new_delay); - const size_t achieved_delay = render_buffer_->Delay(); - - // Inform the delay controller of the actually set delay to allow it to - // properly react to a non-feasible delay. - delay_controller_->SetDelay(achieved_delay); - - // Remove the echo from the capture signal. - echo_remover_->ProcessCapture( - delay_controller_->AlignmentHeadroomSamples(), - EchoPathVariability(echo_path_gain_change, - old_delay != achieved_delay || - old_delay != new_delay || - render_buffer_overrun_occurred_), - capture_signal_saturation, render_buffer_->GetRenderBuffer(), - capture_block); } + // Update the render buffers with new render data, filling the buffers with + // empty blocks when there is no render data available. + render_buffer_underrun = !render_buffer_->UpdateBuffers(); + + // Compute and and apply the render delay required to achieve proper signal + // alignment. + const size_t old_delay = render_buffer_->Delay(); + const size_t new_delay = delay_controller_->GetDelay( + render_buffer_->GetDownsampledRenderBuffer(), (*capture_block)[0]); + render_buffer_->SetDelay(new_delay); + const size_t achieved_delay = render_buffer_->Delay(); + + // Inform the delay controller of the actually set delay to allow it to + // properly react to a non-feasible delay. + delay_controller_->SetDelay(achieved_delay); + + // Remove the echo from the capture signal. + echo_remover_->ProcessCapture( + delay_controller_->AlignmentHeadroomSamples(), + EchoPathVariability(echo_path_gain_change, + old_delay != achieved_delay || + old_delay != new_delay || + render_buffer_overrun_occurred_), + capture_signal_saturation, render_buffer_->GetRenderBuffer(), + capture_block); + // Update the metrics. metrics_.UpdateCapture(render_buffer_underrun); diff --git a/webrtc/modules/audio_processing/aec3/render_delay_buffer.cc b/webrtc/modules/audio_processing/aec3/render_delay_buffer.cc index cf3e2482ef..6e6766ab4d 100644 --- a/webrtc/modules/audio_processing/aec3/render_delay_buffer.cc +++ b/webrtc/modules/audio_processing/aec3/render_delay_buffer.cc @@ -124,6 +124,11 @@ void RenderDelayBufferImpl::Reset() { downsampled_render_buffer_.buffer.fill(0.f); fft_buffer_.Clear(); api_call_jitter_buffer_.Reset(); + for (auto& c : buffer_) { + for (auto& b : c) { + std::fill(b.begin(), b.end(), 0.f); + } + } } bool RenderDelayBufferImpl::Insert(