Index: webrtc/modules/audio_processing/aec3/block_processor.cc |
diff --git a/webrtc/modules/audio_processing/aec3/block_processor.cc b/webrtc/modules/audio_processing/aec3/block_processor.cc |
index 3a32f3c80b9369b642b0bcf4c173fa7ebd485ce9..52bc4ef1a30838e7d8772cab0b69310b9dc214cd 100644 |
--- a/webrtc/modules/audio_processing/aec3/block_processor.cc |
+++ b/webrtc/modules/audio_processing/aec3/block_processor.cc |
@@ -112,20 +112,27 @@ void BlockProcessorImpl::ProcessCapture( |
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); |
+ bool delay_change; |
+ if (new_delay >= kMinEchoPathDelayBlocks) { |
+ render_buffer_->SetDelay(new_delay); |
+ const size_t achieved_delay = render_buffer_->Delay(); |
+ delay_change = old_delay != achieved_delay || old_delay != new_delay || |
+ render_buffer_overrun_occurred_; |
+ |
+ // 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); |
+ } else { |
+ delay_controller_->Reset(); |
+ render_buffer_->Reset(); |
+ delay_change = true; |
+ } |
// 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_), |
+ EchoPathVariability(echo_path_gain_change, delay_change), |
capture_signal_saturation, render_buffer_->GetRenderBuffer(), |
capture_block); |