AEC3: Ensure that the high-pass filter effect is on when AEC3 is active

This CL ensures that the high-pass filter is on whenever the echo
controller is on. This is important as the echo controller code assumes
that the external high-pass filter is active.

The CL also corrects the ToggleAec unit test (which started failing
after this code change).

Bug: webrtc:11159,chromium:1030179
Change-Id: Ie29db74bf3de6279a08564398d32d67d5e1569db
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/161222
Reviewed-by: Sam Zackrisson <saza@webrtc.org>
Commit-Queue: Per Åhgren <peah@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#29979}
This commit is contained in:
Per Åhgren 2019-12-03 11:15:18 +01:00 committed by Commit Bot
parent 014dd3c9f7
commit 3a77f93589
3 changed files with 13 additions and 10 deletions

View file

@ -247,7 +247,8 @@ bool AudioProcessingImpl::SubmoduleStates::RenderMultiBandProcessingActive()
bool AudioProcessingImpl::SubmoduleStates::HighPassFilteringRequired() const { bool AudioProcessingImpl::SubmoduleStates::HighPassFilteringRequired() const {
return high_pass_filter_enabled_ || echo_canceller_enabled_ || return high_pass_filter_enabled_ || echo_canceller_enabled_ ||
mobile_echo_controller_enabled_ || noise_suppressor_enabled_; mobile_echo_controller_enabled_ || noise_suppressor_enabled_ ||
echo_controller_enabled_;
} }
AudioProcessingBuilder::AudioProcessingBuilder() = default; AudioProcessingBuilder::AudioProcessingBuilder() = default;
@ -513,7 +514,7 @@ int AudioProcessingImpl::InitializeLocked() {
submodules_.agc_manager->SetCaptureMuted(capture_.output_will_be_muted); submodules_.agc_manager->SetCaptureMuted(capture_.output_will_be_muted);
} }
InitializeTransient(); InitializeTransient();
InitializeHighPassFilter(); InitializeHighPassFilter(false);
InitializeVoiceDetector(); InitializeVoiceDetector();
InitializeResidualEchoDetector(); InitializeResidualEchoDetector();
InitializeEchoController(); InitializeEchoController();
@ -676,7 +677,8 @@ void AudioProcessingImpl::ApplyConfig(const AudioProcessing::Config& config) {
InitializeNoiseSuppressor(); InitializeNoiseSuppressor();
} }
InitializeHighPassFilter(); InitializeHighPassFilter(config_.echo_canceller.enabled &&
!config.echo_canceller.mobile_mode);
if (agc1_config_changed) { if (agc1_config_changed) {
ApplyAgc1Config(config_.gain_controller1); ApplyAgc1Config(config_.gain_controller1);
@ -1788,7 +1790,7 @@ AudioProcessing::Config AudioProcessingImpl::GetConfig() const {
bool AudioProcessingImpl::UpdateActiveSubmoduleStates() { bool AudioProcessingImpl::UpdateActiveSubmoduleStates() {
return submodule_states_.Update( return submodule_states_.Update(
config_.high_pass_filter.enabled, !!submodules_.echo_cancellation, config_.high_pass_filter.enabled, config_.echo_canceller.enabled,
!!submodules_.echo_control_mobile, config_.residual_echo_detector.enabled, !!submodules_.echo_control_mobile, config_.residual_echo_detector.enabled,
!!submodules_.legacy_noise_suppressor || !!submodules_.noise_suppressor, !!submodules_.legacy_noise_suppressor || !!submodules_.noise_suppressor,
submodules_.gain_control->is_enabled(), config_.gain_controller2.enabled, submodules_.gain_control->is_enabled(), config_.gain_controller2.enabled,
@ -1807,8 +1809,8 @@ void AudioProcessingImpl::InitializeTransient() {
} }
} }
void AudioProcessingImpl::InitializeHighPassFilter() { void AudioProcessingImpl::InitializeHighPassFilter(bool force_activation) {
if (submodule_states_.HighPassFilteringRequired()) { if (force_activation || submodule_states_.HighPassFilteringRequired()) {
submodules_.high_pass_filter.reset(new HighPassFilter(num_proc_channels())); submodules_.high_pass_filter.reset(new HighPassFilter(num_proc_channels()));
} else { } else {
submodules_.high_pass_filter.reset(); submodules_.high_pass_filter.reset();

View file

@ -232,7 +232,8 @@ class AudioProcessingImpl : public AudioProcessing {
RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_render_, crit_capture_); RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_render_, crit_capture_);
void InitializeResidualEchoDetector() void InitializeResidualEchoDetector()
RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_render_, crit_capture_); RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_render_, crit_capture_);
void InitializeHighPassFilter() RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_capture_); void InitializeHighPassFilter(bool force_activation)
RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_capture_);
void InitializeVoiceDetector() RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_capture_); void InitializeVoiceDetector() RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_capture_);
void InitializeEchoController() void InitializeEchoController()
RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_render_, crit_capture_); RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_render_, crit_capture_);

View file

@ -51,8 +51,8 @@ class DebugDumpGenerator {
bool enable_pre_amplifier); bool enable_pre_amplifier);
// Constructor that uses default input files. // Constructor that uses default input files.
explicit DebugDumpGenerator(const Config& config, DebugDumpGenerator(const Config& config,
const AudioProcessing::Config& apm_config); const AudioProcessing::Config& apm_config);
~DebugDumpGenerator(); ~DebugDumpGenerator();
@ -346,7 +346,7 @@ TEST_F(DebugDumpTest, ToggleAec) {
generator.StartRecording(); generator.StartRecording();
generator.Process(100); generator.Process(100);
apm_config.echo_canceller.enabled = true; apm_config.echo_canceller.enabled = false;
generator.apm()->ApplyConfig(apm_config); generator.apm()->ApplyConfig(apm_config);
generator.Process(100); generator.Process(100);