Make AEC3 the default desktop AEC option in WebRTC
Bug: webrtc:10366
Change-Id: I854ed62df1da489fdab43e9157dff79b7287cacb
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/125081
Reviewed-by: Sam Zackrisson <saza@webrtc.org>
Reviewed-by: Mirko Bonadei <mbonadei@webrtc.org>
Commit-Queue: Per Åhgren <peah@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#26983}
diff --git a/modules/audio_processing/audio_processing_impl.cc b/modules/audio_processing/audio_processing_impl.cc
index 3400abf..504eb31 100644
--- a/modules/audio_processing/audio_processing_impl.cc
+++ b/modules/audio_processing/audio_processing_impl.cc
@@ -16,10 +16,12 @@
#include <type_traits>
#include <utility>
+#include "absl/memory/memory.h"
#include "absl/types/optional.h"
#include "api/array_view.h"
#include "common_audio/audio_converter.h"
#include "common_audio/include/audio_util.h"
+#include "modules/audio_processing/aec3/echo_canceller3.h"
#include "modules/audio_processing/agc/agc_manager_direct.h"
#include "modules/audio_processing/agc2/gain_applier.h"
#include "modules/audio_processing/audio_buffer.h"
@@ -669,17 +671,20 @@
rtc::CritScope cs_render(&crit_render_);
rtc::CritScope cs_capture(&crit_capture_);
+ const bool aec_config_changed =
+ config_.echo_canceller.enabled != config.echo_canceller.enabled ||
+ config_.echo_canceller.use_legacy_aec !=
+ config.echo_canceller.use_legacy_aec ||
+ config_.echo_canceller.mobile_mode != config.echo_canceller.mobile_mode ||
+ (config_.echo_canceller.enabled && config.echo_canceller.use_legacy_aec &&
+ config_.echo_canceller.legacy_moderate_suppression_level !=
+ config.echo_canceller.legacy_moderate_suppression_level);
+
config_ = config;
- private_submodules_->echo_cancellation->Enable(
- config_.echo_canceller.enabled && !config_.echo_canceller.mobile_mode);
- private_submodules_->echo_control_mobile->Enable(
- config_.echo_canceller.enabled && config_.echo_canceller.mobile_mode);
-
- private_submodules_->echo_cancellation->set_suppression_level(
- config.echo_canceller.legacy_moderate_suppression_level
- ? EchoCancellationImpl::SuppressionLevel::kModerateSuppression
- : EchoCancellationImpl::SuppressionLevel::kHighSuppression);
+ if (aec_config_changed) {
+ InitializeEchoController();
+ }
public_submodules_->noise_suppression->Enable(
config.noise_suppression.enabled);
@@ -1342,6 +1347,7 @@
capture_buffer->split_bands_const(0)[kBand0To8kHz],
capture_buffer->num_frames_per_band(), capture_nonlocked_.split_rate);
}
+ // TODO(peah): Add reporting from AEC3 whether there is echo.
RETURN_ON_ERR(public_submodules_->gain_control->ProcessCaptureAudio(
capture_buffer,
private_submodules_->echo_cancellation->stream_has_echo()));
@@ -1770,11 +1776,31 @@
}
void AudioProcessingImpl::InitializeEchoController() {
- if (echo_control_factory_) {
- private_submodules_->echo_controller =
- echo_control_factory_->Create(proc_sample_rate_hz());
+ if (echo_control_factory_ ||
+ (config_.echo_canceller.enabled && !config_.echo_canceller.mobile_mode &&
+ !config_.echo_canceller.use_legacy_aec)) {
+ if (echo_control_factory_) {
+ private_submodules_->echo_controller =
+ echo_control_factory_->Create(proc_sample_rate_hz());
+ } else {
+ private_submodules_->echo_controller = absl::make_unique<EchoCanceller3>(
+ EchoCanceller3Config(), proc_sample_rate_hz(), true);
+ }
+
+ capture_nonlocked_.echo_controller_enabled = true;
} else {
+ private_submodules_->echo_cancellation->Enable(
+ config_.echo_canceller.enabled && !config_.echo_canceller.mobile_mode);
+ private_submodules_->echo_control_mobile->Enable(
+ config_.echo_canceller.enabled && config_.echo_canceller.mobile_mode);
+
+ private_submodules_->echo_cancellation->set_suppression_level(
+ config_.echo_canceller.legacy_moderate_suppression_level
+ ? EchoCancellationImpl::SuppressionLevel::kModerateSuppression
+ : EchoCancellationImpl::SuppressionLevel::kHighSuppression);
+
private_submodules_->echo_controller.reset();
+ capture_nonlocked_.echo_controller_enabled = false;
}
}
@@ -1915,7 +1941,7 @@
InternalAPMConfig apm_config;
- apm_config.aec_enabled = private_submodules_->echo_cancellation->is_enabled();
+ apm_config.aec_enabled = config_.echo_canceller.enabled;
apm_config.aec_delay_agnostic_enabled =
private_submodules_->echo_cancellation->is_delay_agnostic_enabled();
apm_config.aec_drift_compensation_enabled =