AEC3: Parametrize the shadow filter output usage

This CL introduces the ability to control the usage of the shadow filter
output in the echo canceller output.

Bug: webrtc:9694,chromium:879451
Change-Id: I01f90de60de1799b32892051c176bda5e1a8d33e
Reviewed-on: https://webrtc-review.googlesource.com/97020
Reviewed-by: Gustaf Ullberg <gustaf@webrtc.org>
Commit-Queue: Per Åhgren <peah@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#24506}
diff --git a/api/audio/echo_canceller3_config.h b/api/audio/echo_canceller3_config.h
index a142d52..f4ba8e9 100644
--- a/api/audio/echo_canceller3_config.h
+++ b/api/audio/echo_canceller3_config.h
@@ -58,6 +58,7 @@
     size_t config_change_duration_blocks = 250;
     float initial_state_seconds = 2.5f;
     bool conservative_initial_phase = false;
+    bool enable_shadow_filter_output_usage = true;
   } filter;
 
   struct Erle {
diff --git a/modules/audio_processing/aec3/echo_remover.cc b/modules/audio_processing/aec3/echo_remover.cc
index e52bc62..9b6677e 100644
--- a/modules/audio_processing/aec3/echo_remover.cc
+++ b/modules/audio_processing/aec3/echo_remover.cc
@@ -162,7 +162,9 @@
           new ApmDataDumper(rtc::AtomicOps::Increment(&instance_count_))),
       optimization_(DetectOptimization()),
       sample_rate_hz_(sample_rate_hz),
-      use_shadow_filter_output_(UseShadowFilterOutput()),
+      use_shadow_filter_output_(
+          UseShadowFilterOutput() &&
+          config_.filter.enable_shadow_filter_output_usage),
       use_smooth_signal_transitions_(UseSmoothSignalTransitions()),
       subtractor_(config, data_dumper_.get(), optimization_),
       suppression_gain_(config_, optimization_, sample_rate_hz),
diff --git a/modules/audio_processing/test/audio_processing_simulator.cc b/modules/audio_processing/test/audio_processing_simulator.cc
index 7ea7660..5e092ff 100644
--- a/modules/audio_processing/test/audio_processing_simulator.cc
+++ b/modules/audio_processing/test/audio_processing_simulator.cc
@@ -235,6 +235,8 @@
                 &cfg.filter.initial_state_seconds);
       ReadParam(section, "conservative_initial_phase",
                 &cfg.filter.conservative_initial_phase);
+      ReadParam(section, "enable_shadow_filter_output_usage",
+                &cfg.filter.enable_shadow_filter_output_usage);
     }
 
     if (rtc::GetValueFromJsonObject(root, "erle", &section)) {