Remove AudioProcessing::gain_control() getter This change also resolves a bug in audioproc_f: The implicit ApplyConfig calls to enable gain control settings in aec_dump_simulator.cc:377-406 [1] are overwritten by the ApplyConfig call on line 500 using a config from line 292. Compared to a ToT build including a fix for that bug, these changes are bitexact on a large number of aecdumps. [1] https://cs.chromium.org/chromium/src/third_party/webrtc/modules/audio_processing/test/aec_dump_based_simulator.cc?l=377&rcl=8bbf9e2c6e40feb8efcbf276b43945a14d651e9b Bug: webrtc:9878 Change-Id: Id427d34e838c999d996d58193977ac2a9198edd6 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/156463 Commit-Queue: Sam Zackrisson <saza@webrtc.org> Reviewed-by: Ivo Creusen <ivoc@webrtc.org> Cr-Commit-Position: refs/heads/master@{#29481}
diff --git a/modules/audio_processing/BUILD.gn b/modules/audio_processing/BUILD.gn index 6fa6585..df06c14 100644 --- a/modules/audio_processing/BUILD.gn +++ b/modules/audio_processing/BUILD.gn
@@ -49,7 +49,6 @@ ":audio_generator_interface", ":audio_processing_statistics", ":config", - ":gain_control_interface", "../../api:scoped_refptr", "../../api/audio:aec3_config", "../../api/audio:echo_control", @@ -58,6 +57,7 @@ "../../rtc_base:rtc_base_approved", "../../rtc_base/system:arch", "../../rtc_base/system:rtc_export", + "agc:gain_control_interface", "//third_party/abseil-cpp/absl/types:optional", ] } @@ -170,8 +170,6 @@ ":audio_processing_c", ":audio_processing_statistics", ":config", - ":gain_control_config_proxy", - ":gain_control_interface", ":high_pass_filter", ":noise_suppression_proxy", "../../api:array_view", @@ -197,6 +195,7 @@ "aecm:aecm_core", "agc", "agc:agc_legacy_c", + "agc:gain_control_interface", "agc2:adaptive_digital", "agc2:fixed_digital", "agc2:gain_applier", @@ -223,25 +222,6 @@ ] } -rtc_source_set("gain_control_interface") { - sources = [ - "include/gain_control.h", - ] -} - -rtc_source_set("gain_control_config_proxy") { - sources = [ - "gain_control_config_proxy.cc", - "gain_control_config_proxy.h", - ] - deps = [ - ":api", - ":gain_control_interface", - "../../rtc_base:criticalsection", - "../../rtc_base:macromagic", - ] -} - rtc_source_set("noise_suppression_proxy") { sources = [ "noise_suppression_proxy.cc", @@ -434,7 +414,6 @@ "config_unittest.cc", "echo_cancellation_impl_unittest.cc", "echo_control_mobile_unittest.cc", - "gain_control_config_proxy_unittest.cc", "gain_controller2_unittest.cc", "splitting_filter_unittest.cc", "test/fake_recording_device_unittest.cc", @@ -459,7 +438,6 @@ ":audioproc_test_utils", ":config", ":file_audio_generator_unittests", - ":gain_control_config_proxy", ":high_pass_filter", ":mocks", "../../api:array_view",
diff --git a/modules/audio_processing/agc/BUILD.gn b/modules/audio_processing/agc/BUILD.gn index f8ed539..7e363ca 100644 --- a/modules/audio_processing/agc/BUILD.gn +++ b/modules/audio_processing/agc/BUILD.gn
@@ -8,6 +8,12 @@ import("../../../webrtc.gni") +rtc_source_set("gain_control_interface") { + sources = [ + "gain_control.h", + ] +} + rtc_source_set("agc") { sources = [ "agc_manager_direct.cc", @@ -15,10 +21,10 @@ ] configs += [ "..:apm_debug_dump" ] deps = [ + ":gain_control_interface", ":gain_map", ":level_estimation", "..:apm_logging", - "..:gain_control_interface", "../../../common_audio", "../../../common_audio:common_audio_c", "../../../rtc_base:checks", @@ -100,6 +106,7 @@ deps = [ ":agc", + ":gain_control_interface", ":level_estimation", "..:mocks", "../../../test:fileutils",
diff --git a/modules/audio_processing/agc/agc_manager_direct.cc b/modules/audio_processing/agc/agc_manager_direct.cc index 4b0de78..f913560 100644 --- a/modules/audio_processing/agc/agc_manager_direct.cc +++ b/modules/audio_processing/agc/agc_manager_direct.cc
@@ -18,9 +18,9 @@ #endif #include "common_audio/include/audio_util.h" +#include "modules/audio_processing/agc/gain_control.h" #include "modules/audio_processing/agc/gain_map_internal.h" #include "modules/audio_processing/agc2/adaptive_mode_level_estimator_agc.h" -#include "modules/audio_processing/include/gain_control.h" #include "rtc_base/checks.h" #include "rtc_base/logging.h" #include "rtc_base/numerics/safe_minmax.h"
diff --git a/modules/audio_processing/agc/agc_manager_direct_unittest.cc b/modules/audio_processing/agc/agc_manager_direct_unittest.cc index cfa7f69..615a8d8 100644 --- a/modules/audio_processing/agc/agc_manager_direct_unittest.cc +++ b/modules/audio_processing/agc/agc_manager_direct_unittest.cc
@@ -10,6 +10,7 @@ #include "modules/audio_processing/agc/agc_manager_direct.h" +#include "modules/audio_processing/agc/gain_control.h" #include "modules/audio_processing/agc/mock_agc.h" #include "modules/audio_processing/include/mock_audio_processing.h" #include "test/gmock.h" @@ -31,6 +32,27 @@ constexpr int kClippedMin = 165; // Arbitrary, but different from the default. const float kAboveClippedThreshold = 0.2f; +class MockGainControl : public GainControl { + public: + virtual ~MockGainControl() {} + MOCK_METHOD1(Enable, int(bool enable)); + MOCK_CONST_METHOD0(is_enabled, bool()); + MOCK_METHOD1(set_stream_analog_level, int(int level)); + MOCK_CONST_METHOD0(stream_analog_level, int()); + MOCK_METHOD1(set_mode, int(Mode mode)); + MOCK_CONST_METHOD0(mode, Mode()); + MOCK_METHOD1(set_target_level_dbfs, int(int level)); + MOCK_CONST_METHOD0(target_level_dbfs, int()); + MOCK_METHOD1(set_compression_gain_db, int(int gain)); + MOCK_CONST_METHOD0(compression_gain_db, int()); + MOCK_METHOD1(enable_limiter, int(bool enable)); + MOCK_CONST_METHOD0(is_limiter_enabled, bool()); + MOCK_METHOD2(set_analog_level_limits, int(int minimum, int maximum)); + MOCK_CONST_METHOD0(analog_level_minimum, int()); + MOCK_CONST_METHOD0(analog_level_maximum, int()); + MOCK_CONST_METHOD0(stream_is_saturated, bool()); +}; + class TestVolumeCallbacks : public VolumeCallbacks { public: TestVolumeCallbacks() : volume_(0) {} @@ -89,7 +111,7 @@ } MockAgc* agc_; - test::MockGainControl gctrl_; + MockGainControl gctrl_; TestVolumeCallbacks volume_; AgcManagerDirect manager_; }; @@ -684,7 +706,7 @@ TEST(AgcManagerDirectStandaloneTest, DisableDigitalDisablesDigital) { auto agc = std::unique_ptr<Agc>(new ::testing::NiceMock<MockAgc>()); - test::MockGainControl gctrl; + MockGainControl gctrl; TestVolumeCallbacks volume; AgcManagerDirect manager(agc.release(), &gctrl, &volume, kInitialVolume,
diff --git a/modules/audio_processing/include/gain_control.h b/modules/audio_processing/agc/gain_control.h similarity index 96% rename from modules/audio_processing/include/gain_control.h rename to modules/audio_processing/agc/gain_control.h index 69208a7..f31cbec 100644 --- a/modules/audio_processing/include/gain_control.h +++ b/modules/audio_processing/agc/gain_control.h
@@ -8,8 +8,8 @@ * be found in the AUTHORS file in the root of the source tree. */ -#ifndef MODULES_AUDIO_PROCESSING_INCLUDE_GAIN_CONTROL_H_ -#define MODULES_AUDIO_PROCESSING_INCLUDE_GAIN_CONTROL_H_ +#ifndef MODULES_AUDIO_PROCESSING_AGC_GAIN_CONTROL_H_ +#define MODULES_AUDIO_PROCESSING_AGC_GAIN_CONTROL_H_ namespace webrtc { @@ -105,4 +105,4 @@ }; } // namespace webrtc -#endif // MODULES_AUDIO_PROCESSING_INCLUDE_GAIN_CONTROL_H_ +#endif // MODULES_AUDIO_PROCESSING_AGC_GAIN_CONTROL_H_
diff --git a/modules/audio_processing/audio_processing_impl.cc b/modules/audio_processing/audio_processing_impl.cc index 0582ece..39de770 100644 --- a/modules/audio_processing/audio_processing_impl.cc +++ b/modules/audio_processing/audio_processing_impl.cc
@@ -28,7 +28,6 @@ #include "modules/audio_processing/common.h" #include "modules/audio_processing/echo_cancellation_impl.h" #include "modules/audio_processing/echo_control_mobile_impl.h" -#include "modules/audio_processing/gain_control_config_proxy.h" #include "modules/audio_processing/gain_control_for_experimental_agc.h" #include "modules/audio_processing/gain_control_impl.h" #include "modules/audio_processing/gain_controller2.h" @@ -263,7 +262,6 @@ std::unique_ptr<GainControlImpl> gain_control; std::unique_ptr<GainControlForExperimentalAgc> gain_control_for_experimental_agc; - std::unique_ptr<GainControlConfigProxy> gain_control_config_proxy; // Accessed internally from both render and capture. std::unique_ptr<TransientSuppressor> transient_suppressor; @@ -412,8 +410,6 @@ public_submodules_->gain_control_for_experimental_agc.reset( new GainControlForExperimentalAgc( public_submodules_->gain_control.get())); - public_submodules_->gain_control_config_proxy.reset( - new GainControlConfigProxy(&crit_capture_, this, agc1())); // If no echo detector is injected, use the ResidualEchoDetector. if (!private_submodules_->echo_detector) { @@ -1828,10 +1824,6 @@ return stats; } -GainControl* AudioProcessingImpl::gain_control() const { - return public_submodules_->gain_control_config_proxy.get(); -} - NoiseSuppression* AudioProcessingImpl::noise_suppression() const { return public_submodules_->noise_suppression_proxy.get(); }
diff --git a/modules/audio_processing/audio_processing_impl.h b/modules/audio_processing/audio_processing_impl.h index aa577a0..8af8b22 100644 --- a/modules/audio_processing/audio_processing_impl.h +++ b/modules/audio_processing/audio_processing_impl.h
@@ -16,6 +16,7 @@ #include <vector> #include "api/function_view.h" +#include "modules/audio_processing/agc/gain_control.h" #include "modules/audio_processing/audio_buffer.h" #include "modules/audio_processing/include/aec_dump.h" #include "modules/audio_processing/include/audio_processing.h" @@ -119,7 +120,6 @@ // would offer no protection (the submodules are // created only once in a single-treaded manner // during APM creation). - GainControl* gain_control() const override; NoiseSuppression* noise_suppression() const override; // TODO(peah): Remove MutateConfig once the new API allows that.
diff --git a/modules/audio_processing/audio_processing_impl_locking_unittest.cc b/modules/audio_processing/audio_processing_impl_locking_unittest.cc index c974a3c..08b1ee8 100644 --- a/modules/audio_processing/audio_processing_impl_locking_unittest.cc +++ b/modules/audio_processing/audio_processing_impl_locking_unittest.cc
@@ -535,17 +535,14 @@ void AudioProcessingImplLockTest::SetUp() { test_config_ = static_cast<TestConfig>(GetParam()); - ASSERT_EQ(apm_->kNoError, apm_->gain_control()->Enable(true)); - - ASSERT_EQ(apm_->kNoError, - apm_->gain_control()->set_mode(GainControl::kAdaptiveDigital)); - ASSERT_EQ(apm_->kNoError, apm_->gain_control()->Enable(true)); - AudioProcessing::Config apm_config = apm_->GetConfig(); apm_config.echo_canceller.enabled = (test_config_.aec_type != AecType::AecTurnedOff); apm_config.echo_canceller.mobile_mode = (test_config_.aec_type == AecType::BasicWebRtcAecSettingsWithAecMobile); + apm_config.gain_controller1.enabled = true; + apm_config.gain_controller1.mode = + AudioProcessing::Config::GainController1::kAdaptiveDigital; apm_config.noise_suppression.enabled = true; apm_config.voice_detection.enabled = true; apm_config.level_estimation.enabled = true; @@ -590,7 +587,7 @@ } else { EXPECT_FALSE(apm_config.echo_canceller.enabled); } - EXPECT_TRUE(apm_->gain_control()->is_enabled()); + EXPECT_TRUE(apm_config.gain_controller1.enabled); EXPECT_TRUE(apm_config.noise_suppression.enabled); // The below return values are not testable. @@ -697,7 +694,7 @@ apm_->set_stream_delay_ms(30); // Set the analog level. - apm_->gain_control()->set_stream_analog_level(80); + apm_->set_stream_analog_level(80); // Call the specified capture side API processing method. int result = AudioProcessing::kNoError; @@ -722,7 +719,7 @@ } // Retrieve the new analog level. - apm_->gain_control()->stream_analog_level(); + apm_->recommended_stream_analog_level(); // Check the return code for error. ASSERT_EQ(AudioProcessing::kNoError, result);
diff --git a/modules/audio_processing/audio_processing_impl_unittest.cc b/modules/audio_processing/audio_processing_impl_unittest.cc index 292b632..b4f78e5 100644 --- a/modules/audio_processing/audio_processing_impl_unittest.cc +++ b/modules/audio_processing/audio_processing_impl_unittest.cc
@@ -221,9 +221,9 @@ AudioProcessingBuilder() .SetEchoControlFactory(std::move(echo_control_factory)) .Create()); - apm->gain_control()->Enable(false); // Disable AGC. - apm->gain_control()->set_mode(GainControl::Mode::kFixedDigital); + // Disable AGC. webrtc::AudioProcessing::Config apm_config; + apm_config.gain_controller1.enabled = false; apm_config.gain_controller2.enabled = false; apm_config.pre_amplifier.enabled = true; apm_config.pre_amplifier.fixed_gain_factor = 1.f; @@ -264,9 +264,11 @@ AudioProcessingBuilder() .SetEchoControlFactory(std::move(echo_control_factory)) .Create()); - apm->gain_control()->Enable(true); // Enable AGC. - apm->gain_control()->set_mode(GainControl::Mode::kAdaptiveAnalog); webrtc::AudioProcessing::Config apm_config; + // Enable AGC1. + apm_config.gain_controller1.enabled = true; + apm_config.gain_controller1.mode = + AudioProcessing::Config::GainController1::kAdaptiveAnalog; apm_config.gain_controller2.enabled = false; apm_config.pre_amplifier.enabled = false; apm->ApplyConfig(apm_config); @@ -280,14 +282,14 @@ MockEchoControl* echo_control_mock = echo_control_factory_ptr->GetNext(); - const int initial_analog_gain = apm->gain_control()->stream_analog_level(); + const int initial_analog_gain = apm->recommended_stream_analog_level(); EXPECT_CALL(*echo_control_mock, AnalyzeCapture(testing::_)).Times(1); EXPECT_CALL(*echo_control_mock, ProcessCapture(NotNull(), false)).Times(1); apm->ProcessStream(&frame); // Force an analog gain change if it did not happen. - if (initial_analog_gain == apm->gain_control()->stream_analog_level()) { - apm->gain_control()->set_stream_analog_level(initial_analog_gain + 1); + if (initial_analog_gain == apm->recommended_stream_analog_level()) { + apm->set_stream_analog_level(initial_analog_gain + 1); } EXPECT_CALL(*echo_control_mock, AnalyzeCapture(testing::_)).Times(1); @@ -305,8 +307,11 @@ AudioProcessingBuilder() .SetEchoControlFactory(std::move(echo_control_factory)) .Create()); - apm->gain_control()->Enable(false); // Disable AGC. - apm->gain_control()->set_mode(GainControl::Mode::kFixedDigital); + // Disable AGC. + webrtc::AudioProcessing::Config apm_config; + apm_config.gain_controller1.enabled = false; + apm_config.gain_controller2.enabled = false; + apm->ApplyConfig(apm_config); AudioFrame frame; constexpr int16_t kAudioLevel = 10000;
diff --git a/modules/audio_processing/audio_processing_performance_unittest.cc b/modules/audio_processing/audio_processing_performance_unittest.cc index 24026f1..8fcf992 100644 --- a/modules/audio_processing/audio_processing_performance_unittest.cc +++ b/modules/audio_processing/audio_processing_performance_unittest.cc
@@ -446,14 +446,13 @@ void SetUp() override { // Lambda function for setting the default APM runtime settings for desktop. auto set_default_desktop_apm_runtime_settings = [](AudioProcessing* apm) { - ASSERT_EQ(apm->kNoError, apm->gain_control()->Enable(true)); - ASSERT_EQ(apm->kNoError, - apm->gain_control()->set_mode(GainControl::kAdaptiveDigital)); - ASSERT_EQ(apm->kNoError, apm->gain_control()->Enable(true)); ASSERT_EQ(apm->kNoError, apm->noise_suppression()->Enable(true)); AudioProcessing::Config apm_config = apm->GetConfig(); apm_config.echo_canceller.enabled = true; apm_config.echo_canceller.mobile_mode = false; + apm_config.gain_controller1.enabled = true; + apm_config.gain_controller1.mode = + AudioProcessing::Config::GainController1::kAdaptiveDigital; apm_config.level_estimation.enabled = true; apm_config.voice_detection.enabled = true; apm->ApplyConfig(apm_config); @@ -461,14 +460,13 @@ // Lambda function for setting the default APM runtime settings for mobile. auto set_default_mobile_apm_runtime_settings = [](AudioProcessing* apm) { - ASSERT_EQ(apm->kNoError, apm->gain_control()->Enable(true)); - ASSERT_EQ(apm->kNoError, - apm->gain_control()->set_mode(GainControl::kAdaptiveDigital)); - ASSERT_EQ(apm->kNoError, apm->gain_control()->Enable(true)); ASSERT_EQ(apm->kNoError, apm->noise_suppression()->Enable(true)); AudioProcessing::Config apm_config = apm->GetConfig(); apm_config.echo_canceller.enabled = true; apm_config.echo_canceller.mobile_mode = true; + apm_config.gain_controller1.mode = + AudioProcessing::Config::GainController1::kAdaptiveDigital; + apm_config.level_estimation.enabled = true; apm_config.level_estimation.enabled = true; apm_config.voice_detection.enabled = true; apm->ApplyConfig(apm_config); @@ -477,13 +475,10 @@ // Lambda function for turning off all of the APM runtime settings // submodules. auto turn_off_default_apm_runtime_settings = [](AudioProcessing* apm) { - ASSERT_EQ(apm->kNoError, apm->gain_control()->Enable(false)); - ASSERT_EQ(apm->kNoError, - apm->gain_control()->set_mode(GainControl::kAdaptiveDigital)); - ASSERT_EQ(apm->kNoError, apm->gain_control()->Enable(false)); ASSERT_EQ(apm->kNoError, apm->noise_suppression()->Enable(false)); AudioProcessing::Config apm_config = apm->GetConfig(); apm_config.echo_canceller.enabled = false; + apm_config.gain_controller1.enabled = false; apm_config.level_estimation.enabled = false; apm_config.voice_detection.enabled = false; apm->ApplyConfig(apm_config);
diff --git a/modules/audio_processing/audio_processing_unittest.cc b/modules/audio_processing/audio_processing_unittest.cc index caa7bab..78a7220 100644 --- a/modules/audio_processing/audio_processing_unittest.cc +++ b/modules/audio_processing/audio_processing_unittest.cc
@@ -560,7 +560,7 @@ void ApmTest::ProcessWithDefaultStreamParameters(AudioFrame* frame) { EXPECT_EQ(apm_->kNoError, apm_->set_stream_delay_ms(0)); - EXPECT_EQ(apm_->kNoError, apm_->gain_control()->set_stream_analog_level(127)); + apm_->set_stream_analog_level(127); EXPECT_EQ(apm_->kNoError, apm_->ProcessStream(frame)); } @@ -678,22 +678,24 @@ EXPECT_EQ(apm_->kNoError, ProcessStreamChooser(format)); // -- Missing AGC level -- - EXPECT_EQ(apm_->kNoError, apm_->gain_control()->Enable(true)); + AudioProcessing::Config apm_config = apm_->GetConfig(); + apm_config.gain_controller1.enabled = true; + apm_->ApplyConfig(apm_config); EXPECT_EQ(apm_->kStreamParameterNotSetError, ProcessStreamChooser(format)); // Resets after successful ProcessStream(). - EXPECT_EQ(apm_->kNoError, apm_->gain_control()->set_stream_analog_level(127)); + apm_->set_stream_analog_level(127); EXPECT_EQ(apm_->kNoError, ProcessStreamChooser(format)); EXPECT_EQ(apm_->kStreamParameterNotSetError, ProcessStreamChooser(format)); // Other stream parameters set correctly. - AudioProcessing::Config apm_config = apm_->GetConfig(); apm_config.echo_canceller.enabled = true; apm_config.echo_canceller.mobile_mode = false; apm_->ApplyConfig(apm_config); EXPECT_EQ(apm_->kNoError, apm_->set_stream_delay_ms(100)); EXPECT_EQ(apm_->kStreamParameterNotSetError, ProcessStreamChooser(format)); - EXPECT_EQ(apm_->kNoError, apm_->gain_control()->Enable(false)); + apm_config.gain_controller1.enabled = false; + apm_->ApplyConfig(apm_config); // -- Missing delay -- EXPECT_EQ(apm_->kNoError, ProcessStreamChooser(format)); @@ -705,10 +707,12 @@ EXPECT_EQ(apm_->kNoError, ProcessStreamChooser(format)); // Other stream parameters set correctly. - EXPECT_EQ(apm_->kNoError, apm_->gain_control()->Enable(true)); - EXPECT_EQ(apm_->kNoError, apm_->gain_control()->set_stream_analog_level(127)); + apm_config.gain_controller1.enabled = true; + apm_->ApplyConfig(apm_config); + apm_->set_stream_analog_level(127); EXPECT_EQ(apm_->kNoError, ProcessStreamChooser(format)); - EXPECT_EQ(apm_->kNoError, apm_->gain_control()->Enable(false)); + apm_config.gain_controller1.enabled = false; + apm_->ApplyConfig(apm_config); // -- No stream parameters -- EXPECT_EQ(apm_->kNoError, AnalyzeReverseStreamChooser(format)); @@ -716,7 +720,7 @@ // -- All there -- EXPECT_EQ(apm_->kNoError, apm_->set_stream_delay_ms(100)); - EXPECT_EQ(apm_->kNoError, apm_->gain_control()->set_stream_analog_level(127)); + apm_->set_stream_analog_level(127); EXPECT_EQ(apm_->kNoError, ProcessStreamChooser(format)); } @@ -839,117 +843,129 @@ } TEST_F(ApmTest, GainControl) { + AudioProcessing::Config config = apm_->GetConfig(); + config.gain_controller1.enabled = false; + apm_->ApplyConfig(config); + config.gain_controller1.enabled = true; + apm_->ApplyConfig(config); + // Testing gain modes - EXPECT_EQ(apm_->kNoError, - apm_->gain_control()->set_mode(apm_->gain_control()->mode())); - - GainControl::Mode mode[] = {GainControl::kAdaptiveAnalog, - GainControl::kAdaptiveDigital, - GainControl::kFixedDigital}; - for (size_t i = 0; i < arraysize(mode); i++) { - EXPECT_EQ(apm_->kNoError, apm_->gain_control()->set_mode(mode[i])); - EXPECT_EQ(mode[i], apm_->gain_control()->mode()); + for (auto mode : + {AudioProcessing::Config::GainController1::kAdaptiveDigital, + AudioProcessing::Config::GainController1::kFixedDigital, + AudioProcessing::Config::GainController1::kAdaptiveAnalog}) { + config.gain_controller1.mode = mode; + apm_->ApplyConfig(config); + apm_->set_stream_analog_level(100); + EXPECT_EQ(apm_->kNoError, ProcessStreamChooser(kFloatFormat)); } - // Testing target levels - EXPECT_EQ(apm_->kNoError, apm_->gain_control()->set_target_level_dbfs( - apm_->gain_control()->target_level_dbfs())); - int level_dbfs[] = {0, 6, 31}; - for (size_t i = 0; i < arraysize(level_dbfs); i++) { - EXPECT_EQ(apm_->kNoError, - apm_->gain_control()->set_target_level_dbfs(level_dbfs[i])); - EXPECT_EQ(level_dbfs[i], apm_->gain_control()->target_level_dbfs()); + // Testing target levels + for (int target_level_dbfs : {0, 15, 31}) { + config.gain_controller1.target_level_dbfs = target_level_dbfs; + apm_->ApplyConfig(config); + apm_->set_stream_analog_level(100); + EXPECT_EQ(apm_->kNoError, ProcessStreamChooser(kFloatFormat)); } // Testing compression gains - EXPECT_EQ(apm_->kNoError, apm_->gain_control()->set_compression_gain_db( - apm_->gain_control()->compression_gain_db())); - - int gain_db[] = {0, 10, 90}; - for (size_t i = 0; i < arraysize(gain_db); i++) { - EXPECT_EQ(apm_->kNoError, - apm_->gain_control()->set_compression_gain_db(gain_db[i])); - ProcessStreamChooser(kFloatFormat); - EXPECT_EQ(gain_db[i], apm_->gain_control()->compression_gain_db()); + for (int compression_gain_db : {0, 10, 90}) { + config.gain_controller1.compression_gain_db = compression_gain_db; + apm_->ApplyConfig(config); + apm_->set_stream_analog_level(100); + EXPECT_EQ(apm_->kNoError, ProcessStreamChooser(kFloatFormat)); } // Testing limiter off/on - EXPECT_EQ(apm_->kNoError, apm_->gain_control()->enable_limiter(false)); - EXPECT_FALSE(apm_->gain_control()->is_limiter_enabled()); - EXPECT_EQ(apm_->kNoError, apm_->gain_control()->enable_limiter(true)); - EXPECT_TRUE(apm_->gain_control()->is_limiter_enabled()); + for (bool enable : {false, true}) { + config.gain_controller1.enable_limiter = enable; + apm_->ApplyConfig(config); + apm_->set_stream_analog_level(100); + EXPECT_EQ(apm_->kNoError, ProcessStreamChooser(kFloatFormat)); + } // Testing level limits - EXPECT_EQ(apm_->kNoError, apm_->gain_control()->set_analog_level_limits( - apm_->gain_control()->analog_level_minimum(), - apm_->gain_control()->analog_level_maximum())); - - int min_level[] = {0, 255, 1024}; - for (size_t i = 0; i < arraysize(min_level); i++) { - EXPECT_EQ(apm_->kNoError, apm_->gain_control()->set_analog_level_limits( - min_level[i], 1024)); - EXPECT_EQ(min_level[i], apm_->gain_control()->analog_level_minimum()); + std::array<int, 4> kMinLevels = {0, 0, 255, 65000}; + std::array<int, 4> kMaxLevels = {255, 1024, 65535, 65535}; + for (size_t i = 0; i < kMinLevels.size(); ++i) { + int min_level = kMinLevels[i]; + int max_level = kMaxLevels[i]; + config.gain_controller1.analog_level_minimum = min_level; + config.gain_controller1.analog_level_maximum = max_level; + apm_->ApplyConfig(config); + apm_->set_stream_analog_level((min_level + max_level) / 2); + EXPECT_EQ(apm_->kNoError, ProcessStreamChooser(kFloatFormat)); } - - int max_level[] = {0, 1024, 65535}; - for (size_t i = 0; i < arraysize(min_level); i++) { - EXPECT_EQ(apm_->kNoError, - apm_->gain_control()->set_analog_level_limits(0, max_level[i])); - EXPECT_EQ(max_level[i], apm_->gain_control()->analog_level_maximum()); - } - - // TODO(ajm): stream_is_saturated() and stream_analog_level() - - // Turn AGC off - EXPECT_EQ(apm_->kNoError, apm_->gain_control()->Enable(false)); - EXPECT_FALSE(apm_->gain_control()->is_enabled()); } #if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID) TEST_F(ApmTest, GainControlDiesOnTooLowTargetLevelDbfs) { - EXPECT_DEATH(apm_->gain_control()->set_target_level_dbfs(-1), ""); + auto config = apm_->GetConfig(); + config.gain_controller1.target_level_dbfs = -1; + EXPECT_DEATH(apm_->ApplyConfig(config), ""); } TEST_F(ApmTest, GainControlDiesOnTooHighTargetLevelDbfs) { - EXPECT_DEATH(apm_->gain_control()->set_target_level_dbfs(32), ""); + auto config = apm_->GetConfig(); + config.gain_controller1.target_level_dbfs = 32; + EXPECT_DEATH(apm_->ApplyConfig(config), ""); } TEST_F(ApmTest, GainControlDiesOnTooLowCompressionGainDb) { - EXPECT_DEATH(apm_->gain_control()->set_compression_gain_db(-1), ""); + auto config = apm_->GetConfig(); + config.gain_controller1.compression_gain_db = -1; + EXPECT_DEATH(apm_->ApplyConfig(config), ""); } TEST_F(ApmTest, GainControlDiesOnTooHighCompressionGainDb) { - EXPECT_DEATH(apm_->gain_control()->set_compression_gain_db(91), ""); + auto config = apm_->GetConfig(); + config.gain_controller1.compression_gain_db = 91; + EXPECT_DEATH(apm_->ApplyConfig(config), ""); } TEST_F(ApmTest, GainControlDiesOnTooLowAnalogLevelLowerLimit) { - EXPECT_DEATH(apm_->gain_control()->set_analog_level_limits(-1, 512), ""); + auto config = apm_->GetConfig(); + config.gain_controller1.analog_level_minimum = -1; + EXPECT_DEATH(apm_->ApplyConfig(config), ""); } TEST_F(ApmTest, GainControlDiesOnTooHighAnalogLevelUpperLimit) { - EXPECT_DEATH(apm_->gain_control()->set_analog_level_limits(512, 65536), ""); + auto config = apm_->GetConfig(); + config.gain_controller1.analog_level_maximum = 65536; + EXPECT_DEATH(apm_->ApplyConfig(config), ""); } TEST_F(ApmTest, GainControlDiesOnInvertedAnalogLevelLimits) { - EXPECT_DEATH(apm_->gain_control()->set_analog_level_limits(512, 255), ""); + auto config = apm_->GetConfig(); + config.gain_controller1.analog_level_minimum = 512; + config.gain_controller1.analog_level_maximum = 255; + EXPECT_DEATH(apm_->ApplyConfig(config), ""); } TEST_F(ApmTest, ApmDiesOnTooLowAnalogLevel) { - apm_->gain_control()->set_analog_level_limits(255, 512); + auto config = apm_->GetConfig(); + config.gain_controller1.analog_level_minimum = 255; + config.gain_controller1.analog_level_maximum = 512; + apm_->ApplyConfig(config); EXPECT_DEATH(apm_->set_stream_analog_level(254), ""); } TEST_F(ApmTest, ApmDiesOnTooHighAnalogLevel) { - apm_->gain_control()->set_analog_level_limits(255, 512); + auto config = apm_->GetConfig(); + config.gain_controller1.analog_level_minimum = 255; + config.gain_controller1.analog_level_maximum = 512; + apm_->ApplyConfig(config); EXPECT_DEATH(apm_->set_stream_analog_level(513), ""); } #endif void ApmTest::RunQuantizedVolumeDoesNotGetStuckTest(int sample_rate) { Init(sample_rate, sample_rate, sample_rate, 2, 2, 2, false); - EXPECT_EQ(apm_->kNoError, - apm_->gain_control()->set_mode(GainControl::kAdaptiveAnalog)); - EXPECT_EQ(apm_->kNoError, apm_->gain_control()->Enable(true)); + auto config = apm_->GetConfig(); + config.gain_controller1.enabled = true; + config.gain_controller1.mode = + AudioProcessing::Config::GainController1::kAdaptiveAnalog; + apm_->ApplyConfig(config); int out_analog_level = 0; for (int i = 0; i < 2000; ++i) { @@ -958,10 +974,9 @@ ScaleFrame(frame_, 0.25); // Always pass in the same volume. - EXPECT_EQ(apm_->kNoError, - apm_->gain_control()->set_stream_analog_level(100)); + apm_->set_stream_analog_level(100); EXPECT_EQ(apm_->kNoError, apm_->ProcessStream(frame_)); - out_analog_level = apm_->gain_control()->stream_analog_level(); + out_analog_level = apm_->recommended_stream_analog_level(); } // Ensure the AGC is still able to reach the maximum. @@ -978,9 +993,11 @@ void ApmTest::RunManualVolumeChangeIsPossibleTest(int sample_rate) { Init(sample_rate, sample_rate, sample_rate, 2, 2, 2, false); - EXPECT_EQ(apm_->kNoError, - apm_->gain_control()->set_mode(GainControl::kAdaptiveAnalog)); - EXPECT_EQ(apm_->kNoError, apm_->gain_control()->Enable(true)); + auto config = apm_->GetConfig(); + config.gain_controller1.enabled = true; + config.gain_controller1.mode = + AudioProcessing::Config::GainController1::kAdaptiveAnalog; + apm_->ApplyConfig(config); int out_analog_level = 100; for (int i = 0; i < 1000; ++i) { @@ -988,10 +1005,9 @@ // Ensure the audio is at a low level, so the AGC will try to increase it. ScaleFrame(frame_, 0.25); - EXPECT_EQ(apm_->kNoError, - apm_->gain_control()->set_stream_analog_level(out_analog_level)); + apm_->set_stream_analog_level(out_analog_level); EXPECT_EQ(apm_->kNoError, apm_->ProcessStream(frame_)); - out_analog_level = apm_->gain_control()->stream_analog_level(); + out_analog_level = apm_->recommended_stream_analog_level(); } // Ensure the volume was raised. @@ -1004,10 +1020,9 @@ ReadFrameWithRewind(near_file_, frame_); ScaleFrame(frame_, 0.25); - EXPECT_EQ(apm_->kNoError, - apm_->gain_control()->set_stream_analog_level(out_analog_level)); + apm_->set_stream_analog_level(out_analog_level); EXPECT_EQ(apm_->kNoError, apm_->ProcessStream(frame_)); - out_analog_level = apm_->gain_control()->stream_analog_level(); + out_analog_level = apm_->recommended_stream_analog_level(); // Check that AGC respected the manually adjusted volume. EXPECT_LT(out_analog_level, highest_level_reached); } @@ -1051,9 +1066,9 @@ AudioProcessing::Config config = apm_->GetConfig(); EXPECT_FALSE(config.echo_canceller.enabled); EXPECT_FALSE(config.high_pass_filter.enabled); + EXPECT_FALSE(config.gain_controller1.enabled); EXPECT_FALSE(config.level_estimation.enabled); EXPECT_FALSE(config.voice_detection.enabled); - EXPECT_FALSE(apm_->gain_control()->is_enabled()); EXPECT_FALSE(apm_->noise_suppression()->is_enabled()); } @@ -1125,10 +1140,9 @@ frame_->vad_activity_ = AudioFrame::kVadUnknown; ASSERT_EQ(kNoErr, apm_->set_stream_delay_ms(0)); - ASSERT_EQ(kNoErr, - apm_->gain_control()->set_stream_analog_level(analog_level)); + apm_->set_stream_analog_level(analog_level); ASSERT_EQ(kNoErr, apm_->ProcessStream(frame_)); - analog_level = apm_->gain_control()->stream_analog_level(); + analog_level = apm_->recommended_stream_analog_level(); VerifyChannelsAreEqual(frame_->data(), frame_->samples_per_channel_); } @@ -1258,7 +1272,7 @@ // ProcessStream could have changed this for the output frame. frame_->num_channels_ = apm_->num_input_channels(); - EXPECT_NOERR(apm_->gain_control()->set_stream_analog_level(msg.level())); + apm_->set_stream_analog_level(msg.level()); EXPECT_NOERR(apm_->set_stream_delay_ms(msg.delay())); if (msg.has_keypress()) { apm_->set_stream_key_pressed(msg.keypress()); @@ -1485,7 +1499,6 @@ int frame_count = 0; int has_voice_count = 0; - int is_saturated_count = 0; int analog_level = 127; int analog_level_average = 0; int max_output_average = 0; @@ -1501,8 +1514,7 @@ frame_->vad_activity_ = AudioFrame::kVadUnknown; EXPECT_EQ(apm_->kNoError, apm_->set_stream_delay_ms(0)); - EXPECT_EQ(apm_->kNoError, - apm_->gain_control()->set_stream_analog_level(analog_level)); + apm_->set_stream_analog_level(analog_level); EXPECT_EQ(apm_->kNoError, apm_->ProcessStream(frame_)); @@ -1512,11 +1524,8 @@ max_output_average += MaxAudioFrame(*frame_); - analog_level = apm_->gain_control()->stream_analog_level(); + analog_level = apm_->recommended_stream_analog_level(); analog_level_average += analog_level; - if (apm_->gain_control()->stream_is_saturated()) { - is_saturated_count++; - } AudioProcessingStats stats = apm_->GetStatistics(/*has_remote_tracks=*/false); EXPECT_TRUE(stats.voice_detected); @@ -1602,7 +1611,6 @@ #endif EXPECT_NEAR(test->has_voice_count(), has_voice_count - kHasVoiceCountOffset, kHasVoiceCountNear); - EXPECT_NEAR(test->is_saturated_count(), is_saturated_count, kIntNear); EXPECT_NEAR(test->analog_level_average(), analog_level_average, kIntNear); EXPECT_NEAR(test->max_output_average(), @@ -1616,7 +1624,6 @@ #endif } else { test->set_has_voice_count(has_voice_count); - test->set_is_saturated_count(is_saturated_count); test->set_analog_level_average(analog_level_average); test->set_max_output_average(max_output_average); @@ -1828,7 +1835,7 @@ processing_config.reverse_output_stream(), rev_out_cb.channels())); EXPECT_NOERR(ap->set_stream_delay_ms(0)); - EXPECT_NOERR(ap->gain_control()->set_stream_analog_level(analog_level)); + ap->set_stream_analog_level(analog_level); EXPECT_NOERR(ap->ProcessStream( fwd_cb.channels(), fwd_cb.num_frames(), input_rate, @@ -1852,7 +1859,7 @@ ASSERT_EQ(rev_out_length, fwrite(float_data.get(), sizeof(float_data[0]), rev_out_length, rev_out_file)); - analog_level = ap->gain_control()->stream_analog_level(); + analog_level = ap->recommended_stream_analog_level(); } fclose(far_file); fclose(near_file); @@ -2421,11 +2428,11 @@ AudioProcessing::Config apm_config; apm_config.residual_echo_detector.enabled = true; apm_config.high_pass_filter.enabled = false; + apm_config.gain_controller1.enabled = false; apm_config.gain_controller2.enabled = false; apm_config.echo_canceller.enabled = true; apm_config.echo_canceller.mobile_mode = mobile_aec; apm->ApplyConfig(apm_config); - EXPECT_EQ(apm->gain_control()->Enable(false), 0); EXPECT_EQ(apm->noise_suppression()->Enable(false), 0); return apm; }
diff --git a/modules/audio_processing/gain_control_config_proxy.cc b/modules/audio_processing/gain_control_config_proxy.cc deleted file mode 100644 index 28e2117..0000000 --- a/modules/audio_processing/gain_control_config_proxy.cc +++ /dev/null
@@ -1,132 +0,0 @@ -/* - * Copyright (c) 2019 The WebRTC project authors. All Rights Reserved. - * - * Use of this source code is governed by a BSD-style license - * that can be found in the LICENSE file in the root of the source - * tree. An additional intellectual property rights grant can be found - * in the file PATENTS. All contributing project authors may - * be found in the AUTHORS file in the root of the source tree. - */ - -#include "modules/audio_processing/gain_control_config_proxy.h" - -namespace webrtc { -namespace { - -AudioProcessing::Config::GainController1::Mode InterfaceModeToConfigMode( - GainControl::Mode agc_mode) { - using AgcConfig = AudioProcessing::Config::GainController1; - switch (agc_mode) { - case GainControl::kAdaptiveAnalog: - return AgcConfig::kAdaptiveAnalog; - case GainControl::kAdaptiveDigital: - return AgcConfig::kAdaptiveDigital; - case GainControl::kFixedDigital: - return AgcConfig::kFixedDigital; - } -} -} // namespace - -GainControlConfigProxy::GainControlConfigProxy( - rtc::CriticalSection* crit_capture, - AudioProcessing* apm, - GainControl* agc) - : crit_capture_(crit_capture), apm_(apm), agc_(agc) { - RTC_DCHECK(apm); - RTC_DCHECK(agc); - RTC_DCHECK(crit_capture); -} - -GainControlConfigProxy::~GainControlConfigProxy() = default; - -int GainControlConfigProxy::set_stream_analog_level(int level) { - apm_->set_stream_analog_level(level); - return AudioProcessing::kNoError; -} - -int GainControlConfigProxy::stream_analog_level() const { - return apm_->recommended_stream_analog_level(); -} - -int GainControlConfigProxy::Enable(bool enable) { - auto apm_config = apm_->GetConfig(); - apm_config.gain_controller1.enabled = enable; - apm_->ApplyConfig(apm_config); - return AudioProcessing::kNoError; -} - -int GainControlConfigProxy::set_mode(Mode mode) { - auto config = apm_->GetConfig(); - config.gain_controller1.mode = InterfaceModeToConfigMode(mode); - apm_->ApplyConfig(config); - return AudioProcessing::kNoError; -} - -int GainControlConfigProxy::set_target_level_dbfs(int level) { - auto config = apm_->GetConfig(); - config.gain_controller1.target_level_dbfs = level; - apm_->ApplyConfig(config); - return AudioProcessing::kNoError; -} - -int GainControlConfigProxy::set_compression_gain_db(int gain) { - apm_->SetRuntimeSetting( - AudioProcessing::RuntimeSetting::CreateCompressionGainDb(gain)); - return AudioProcessing::kNoError; -} - -int GainControlConfigProxy::enable_limiter(bool enable) { - auto config = apm_->GetConfig(); - config.gain_controller1.enable_limiter = enable; - apm_->ApplyConfig(config); - return AudioProcessing::kNoError; -} - -int GainControlConfigProxy::set_analog_level_limits(int minimum, int maximum) { - auto config = apm_->GetConfig(); - config.gain_controller1.analog_level_minimum = minimum; - config.gain_controller1.analog_level_maximum = maximum; - apm_->ApplyConfig(config); - return AudioProcessing::kNoError; -} - -bool GainControlConfigProxy::is_limiter_enabled() const { - rtc::CritScope cs_capture(crit_capture_); - return agc_->is_limiter_enabled(); -} - -int GainControlConfigProxy::compression_gain_db() const { - rtc::CritScope cs_capture(crit_capture_); - return agc_->compression_gain_db(); -} - -bool GainControlConfigProxy::is_enabled() const { - rtc::CritScope cs_capture(crit_capture_); - return agc_->is_enabled(); -} - -GainControl::Mode GainControlConfigProxy::mode() const { - rtc::CritScope cs_capture(crit_capture_); - return agc_->mode(); -} - -int GainControlConfigProxy::target_level_dbfs() const { - rtc::CritScope cs_capture(crit_capture_); - return agc_->target_level_dbfs(); -} - -int GainControlConfigProxy::analog_level_minimum() const { - rtc::CritScope cs_capture(crit_capture_); - return agc_->analog_level_minimum(); -} - -int GainControlConfigProxy::analog_level_maximum() const { - rtc::CritScope cs_capture(crit_capture_); - return agc_->analog_level_maximum(); -} - -bool GainControlConfigProxy::stream_is_saturated() const { - rtc::CritScope cs_capture(crit_capture_); - return agc_->stream_is_saturated(); -} -} // namespace webrtc
diff --git a/modules/audio_processing/gain_control_config_proxy.h b/modules/audio_processing/gain_control_config_proxy.h deleted file mode 100644 index 04ed536..0000000 --- a/modules/audio_processing/gain_control_config_proxy.h +++ /dev/null
@@ -1,62 +0,0 @@ -/* - * Copyright (c) 2019 The WebRTC project authors. All Rights Reserved. - * - * Use of this source code is governed by a BSD-style license - * that can be found in the LICENSE file in the root of the source - * tree. An additional intellectual property rights grant can be found - * in the file PATENTS. All contributing project authors may - * be found in the AUTHORS file in the root of the source tree. - */ - -#ifndef MODULES_AUDIO_PROCESSING_GAIN_CONTROL_CONFIG_PROXY_H_ -#define MODULES_AUDIO_PROCESSING_GAIN_CONTROL_CONFIG_PROXY_H_ - -#include "modules/audio_processing/include/audio_processing.h" -#include "modules/audio_processing/include/gain_control.h" -#include "rtc_base/critical_section.h" -#include "rtc_base/thread_annotations.h" - -namespace webrtc { - -// This class forwards all gain control configuration to the audio processing -// module, for compatibility with AudioProcessing::Config. -class GainControlConfigProxy : public GainControl { - public: - GainControlConfigProxy(rtc::CriticalSection* crit_capture, - AudioProcessing* apm, - GainControl* agc); - GainControlConfigProxy(const GainControlConfigProxy&) = delete; - GainControlConfigProxy& operator=(const GainControlConfigProxy&) = delete; - - ~GainControlConfigProxy() override; - - private: - // GainControl API during processing. - int set_stream_analog_level(int level) override; - int stream_analog_level() const override; - - // GainControl config setters. - int Enable(bool enable) override; - int set_mode(Mode mode) override; - int set_target_level_dbfs(int level) override; - int set_compression_gain_db(int gain) override; - int enable_limiter(bool enable) override; - int set_analog_level_limits(int minimum, int maximum) override; - - // GainControl config getters. - bool is_enabled() const override; - bool is_limiter_enabled() const override; - int compression_gain_db() const override; - int target_level_dbfs() const override; - int analog_level_minimum() const override; - int analog_level_maximum() const override; - bool stream_is_saturated() const override; - Mode mode() const override; - - rtc::CriticalSection* crit_capture_ = nullptr; - AudioProcessing* apm_ = nullptr; - GainControl* agc_ RTC_GUARDED_BY(crit_capture_) = nullptr; -}; - -} // namespace webrtc -#endif // MODULES_AUDIO_PROCESSING_GAIN_CONTROL_CONFIG_PROXY_H_
diff --git a/modules/audio_processing/gain_control_config_proxy_unittest.cc b/modules/audio_processing/gain_control_config_proxy_unittest.cc deleted file mode 100644 index 5bd341f..0000000 --- a/modules/audio_processing/gain_control_config_proxy_unittest.cc +++ /dev/null
@@ -1,163 +0,0 @@ -/* - * Copyright (c) 2019 The WebRTC project authors. All Rights Reserved. - * - * Use of this source code is governed by a BSD-style license - * that can be found in the LICENSE file in the root of the source - * tree. An additional intellectual property rights grant can be found - * in the file PATENTS. All contributing project authors may - * be found in the AUTHORS file in the root of the source tree. - */ - -#include "modules/audio_processing/gain_control_config_proxy.h" - -#include "modules/audio_processing/include/audio_processing.h" -#include "modules/audio_processing/include/mock_audio_processing.h" -#include "rtc_base/critical_section.h" -#include "rtc_base/ref_counted_object.h" -#include "test/gtest.h" - -namespace webrtc { -class GainControlConfigProxyTest : public ::testing::Test { - protected: - GainControlConfigProxyTest() - : apm_(new rtc::RefCountedObject< - ::testing::StrictMock<test::MockAudioProcessing>>()), - agc_(), - proxy_(&lock_, apm_, &agc_) { - EXPECT_CALL(*apm_, GetConfig()) - .WillRepeatedly(::testing::ReturnPointee(&apm_config_)); - EXPECT_CALL(*apm_, ApplyConfig(::testing::_)) - .WillRepeatedly(::testing::SaveArg<0>(&apm_config_)); - } - - GainControl* proxy() { return &proxy_; } - - rtc::scoped_refptr<testing::StrictMock<test::MockAudioProcessing>> apm_; - ::testing::StrictMock<test::MockGainControl> agc_; - AudioProcessing::Config apm_config_; - - private: - rtc::CriticalSection lock_; - GainControlConfigProxy proxy_; -}; - -// GainControl API during processing. -TEST_F(GainControlConfigProxyTest, SetStreamAnalogLevel) { - EXPECT_CALL(*apm_, set_stream_analog_level(100)); - proxy()->set_stream_analog_level(100); -} - -TEST_F(GainControlConfigProxyTest, StreamAnalogLevel) { - EXPECT_CALL(*apm_, recommended_stream_analog_level()) - .WillOnce(::testing::Return(100)); - EXPECT_EQ(100, proxy()->stream_analog_level()); -} - -// GainControl config setters. -TEST_F(GainControlConfigProxyTest, SetEnable) { - proxy()->Enable(true); - EXPECT_TRUE(apm_config_.gain_controller1.enabled); - - proxy()->Enable(false); - EXPECT_FALSE(apm_config_.gain_controller1.enabled); -} - -TEST_F(GainControlConfigProxyTest, SetMode) { - proxy()->set_mode(GainControl::Mode::kAdaptiveAnalog); - EXPECT_EQ(apm_config_.gain_controller1.kAdaptiveAnalog, - apm_config_.gain_controller1.mode); - - proxy()->set_mode(GainControl::Mode::kAdaptiveDigital); - EXPECT_EQ(apm_config_.gain_controller1.kAdaptiveDigital, - apm_config_.gain_controller1.mode); - - proxy()->set_mode(GainControl::Mode::kFixedDigital); - EXPECT_EQ(apm_config_.gain_controller1.kFixedDigital, - apm_config_.gain_controller1.mode); -} - -TEST_F(GainControlConfigProxyTest, SetTargetLevelDbfs) { - proxy()->set_target_level_dbfs(17); - EXPECT_EQ(17, apm_config_.gain_controller1.target_level_dbfs); -} - -TEST_F(GainControlConfigProxyTest, SetCompressionGainDb) { - AudioProcessing::RuntimeSetting setting; - EXPECT_CALL(*apm_, SetRuntimeSetting(::testing::_)) - .WillOnce(::testing::SaveArg<0>(&setting)); - proxy()->set_compression_gain_db(17); - EXPECT_EQ(AudioProcessing::RuntimeSetting::Type::kCaptureCompressionGain, - setting.type()); - float value; - setting.GetFloat(&value); - EXPECT_EQ(17, static_cast<int>(value + .5f)); -} - -TEST_F(GainControlConfigProxyTest, SetEnableLimiter) { - proxy()->enable_limiter(true); - EXPECT_TRUE(apm_config_.gain_controller1.enable_limiter); - proxy()->enable_limiter(false); - EXPECT_FALSE(apm_config_.gain_controller1.enable_limiter); -} - -TEST_F(GainControlConfigProxyTest, SetAnalogLevelLimits) { - proxy()->set_analog_level_limits(100, 300); - EXPECT_EQ(100, apm_config_.gain_controller1.analog_level_minimum); - EXPECT_EQ(300, apm_config_.gain_controller1.analog_level_maximum); -} - -TEST_F(GainControlConfigProxyTest, GetEnabled) { - EXPECT_CALL(agc_, is_enabled()) - .WillOnce(::testing::Return(true)) - .WillOnce(::testing::Return(false)); - EXPECT_TRUE(proxy()->is_enabled()); - EXPECT_FALSE(proxy()->is_enabled()); -} - -TEST_F(GainControlConfigProxyTest, GetLimiterEnabled) { - EXPECT_CALL(agc_, is_enabled()) - .WillOnce(::testing::Return(true)) - .WillOnce(::testing::Return(false)); - EXPECT_TRUE(proxy()->is_enabled()); - EXPECT_FALSE(proxy()->is_enabled()); -} - -TEST_F(GainControlConfigProxyTest, GetCompressionGainDb) { - EXPECT_CALL(agc_, compression_gain_db()).WillOnce(::testing::Return(17)); - EXPECT_EQ(17, proxy()->compression_gain_db()); -} - -TEST_F(GainControlConfigProxyTest, GetTargetLevelDbfs) { - EXPECT_CALL(agc_, target_level_dbfs()).WillOnce(::testing::Return(17)); - EXPECT_EQ(17, proxy()->target_level_dbfs()); -} - -TEST_F(GainControlConfigProxyTest, GetAnalogLevelMinimum) { - EXPECT_CALL(agc_, analog_level_minimum()).WillOnce(::testing::Return(17)); - EXPECT_EQ(17, proxy()->analog_level_minimum()); -} - -TEST_F(GainControlConfigProxyTest, GetAnalogLevelMaximum) { - EXPECT_CALL(agc_, analog_level_maximum()).WillOnce(::testing::Return(17)); - EXPECT_EQ(17, proxy()->analog_level_maximum()); -} - -TEST_F(GainControlConfigProxyTest, GetStreamIsSaturated) { - EXPECT_CALL(agc_, stream_is_saturated()) - .WillOnce(::testing::Return(true)) - .WillOnce(::testing::Return(false)); - EXPECT_TRUE(proxy()->stream_is_saturated()); - EXPECT_FALSE(proxy()->stream_is_saturated()); -} - -TEST_F(GainControlConfigProxyTest, GetMode) { - EXPECT_CALL(agc_, mode()) - .WillOnce(::testing::Return(GainControl::Mode::kAdaptiveAnalog)) - .WillOnce(::testing::Return(GainControl::Mode::kAdaptiveDigital)) - .WillOnce(::testing::Return(GainControl::Mode::kFixedDigital)); - EXPECT_EQ(GainControl::Mode::kAdaptiveAnalog, proxy()->mode()); - EXPECT_EQ(GainControl::Mode::kAdaptiveDigital, proxy()->mode()); - EXPECT_EQ(GainControl::Mode::kFixedDigital, proxy()->mode()); -} - -} // namespace webrtc
diff --git a/modules/audio_processing/gain_control_for_experimental_agc.h b/modules/audio_processing/gain_control_for_experimental_agc.h index 59328cd..a8bc808 100644 --- a/modules/audio_processing/gain_control_for_experimental_agc.h +++ b/modules/audio_processing/gain_control_for_experimental_agc.h
@@ -12,7 +12,7 @@ #define MODULES_AUDIO_PROCESSING_GAIN_CONTROL_FOR_EXPERIMENTAL_AGC_H_ #include "modules/audio_processing/agc/agc_manager_direct.h" -#include "modules/audio_processing/include/audio_processing.h" +#include "modules/audio_processing/agc/gain_control.h" #include "rtc_base/thread_checker.h" namespace webrtc {
diff --git a/modules/audio_processing/gain_control_impl.h b/modules/audio_processing/gain_control_impl.h index 99b43b5..4ec1941 100644 --- a/modules/audio_processing/gain_control_impl.h +++ b/modules/audio_processing/gain_control_impl.h
@@ -19,7 +19,7 @@ #include "absl/types/optional.h" #include "api/array_view.h" -#include "modules/audio_processing/include/gain_control.h" +#include "modules/audio_processing/agc/gain_control.h" #include "rtc_base/constructor_magic.h" namespace webrtc {
diff --git a/modules/audio_processing/include/audio_processing.h b/modules/audio_processing/include/audio_processing.h index e46deea..79cbc28 100644 --- a/modules/audio_processing/include/audio_processing.h +++ b/modules/audio_processing/include/audio_processing.h
@@ -30,7 +30,6 @@ #include "modules/audio_processing/include/audio_generator.h" #include "modules/audio_processing/include/audio_processing_statistics.h" #include "modules/audio_processing/include/config.h" -#include "modules/audio_processing/include/gain_control.h" #include "rtc_base/arraysize.h" #include "rtc_base/deprecation.h" #include "rtc_base/ref_count.h" @@ -48,7 +47,6 @@ class ProcessingConfig; class EchoDetector; -class GainControl; class NoiseSuppression; class CustomAudioAnalyzer; class CustomProcessing; @@ -190,19 +188,24 @@ // AudioProcessing::Config config; // config.echo_canceller.enabled = true; // config.echo_canceller.mobile_mode = false; -// config.high_pass_filter.enabled = true; +// +// config.gain_controller1.enabled = true; +// config.gain_controller1.mode = +// AudioProcessing::Config::GainController1::kAdaptiveAnalog; +// config.gain_controller1.analog_level_minimum = 0; +// config.gain_controller1.analog_level_maximum = 255; +// // config.gain_controller2.enabled = true; +// +// config.high_pass_filter.enabled = true; +// +// config.voice_detection.enabled = true; +// // apm->ApplyConfig(config) // // apm->noise_reduction()->set_level(kHighSuppression); // apm->noise_reduction()->Enable(true); // -// apm->gain_control()->set_analog_level_limits(0, 255); -// apm->gain_control()->set_mode(kAdaptiveAnalog); -// apm->gain_control()->Enable(true); -// -// apm->voice_detection()->Enable(true); -// // // Start a voice call... // // // ... Render frame arrives bound for the audio HAL ... @@ -211,12 +214,12 @@ // // ... Capture frame arrives from the audio HAL ... // // Call required set_stream_ functions. // apm->set_stream_delay_ms(delay_ms); -// apm->gain_control()->set_stream_analog_level(analog_level); +// apm->set_stream_analog_level(analog_level); // // apm->ProcessStream(capture_frame); // // // Call required stream_ functions. -// analog_level = apm->gain_control()->stream_analog_level(); +// analog_level = apm->recommended_stream_analog_level(); // has_voice = apm->stream_has_voice(); // // // Repeate render and capture processing for the duration of the call... @@ -683,7 +686,6 @@ // These provide access to the component interfaces and should never return // NULL. The pointers will be valid for the lifetime of the APM instance. // The memory for these objects is entirely managed internally. - virtual GainControl* gain_control() const = 0; virtual NoiseSuppression* noise_suppression() const = 0; // Returns the last applied configuration.
diff --git a/modules/audio_processing/include/mock_audio_processing.h b/modules/audio_processing/include/mock_audio_processing.h index a404dca..baf500f 100644 --- a/modules/audio_processing/include/mock_audio_processing.h +++ b/modules/audio_processing/include/mock_audio_processing.h
@@ -22,27 +22,6 @@ namespace webrtc { namespace test { -class MockGainControl : public GainControl { - public: - virtual ~MockGainControl() {} - MOCK_METHOD1(Enable, int(bool enable)); - MOCK_CONST_METHOD0(is_enabled, bool()); - MOCK_METHOD1(set_stream_analog_level, int(int level)); - MOCK_CONST_METHOD0(stream_analog_level, int()); - MOCK_METHOD1(set_mode, int(Mode mode)); - MOCK_CONST_METHOD0(mode, Mode()); - MOCK_METHOD1(set_target_level_dbfs, int(int level)); - MOCK_CONST_METHOD0(target_level_dbfs, int()); - MOCK_METHOD1(set_compression_gain_db, int(int gain)); - MOCK_CONST_METHOD0(compression_gain_db, int()); - MOCK_METHOD1(enable_limiter, int(bool enable)); - MOCK_CONST_METHOD0(is_limiter_enabled, bool()); - MOCK_METHOD2(set_analog_level_limits, int(int minimum, int maximum)); - MOCK_CONST_METHOD0(analog_level_minimum, int()); - MOCK_CONST_METHOD0(analog_level_maximum, int()); - MOCK_CONST_METHOD0(stream_is_saturated, bool()); -}; - class MockNoiseSuppression : public NoiseSuppression { public: virtual ~MockNoiseSuppression() {} @@ -87,8 +66,7 @@ class MockAudioProcessing : public ::testing::NiceMock<AudioProcessing> { public: MockAudioProcessing() - : gain_control_(new ::testing::NiceMock<MockGainControl>()), - noise_suppression_(new ::testing::NiceMock<MockNoiseSuppression>()) {} + : noise_suppression_(new ::testing::NiceMock<MockNoiseSuppression>()) {} virtual ~MockAudioProcessing() {} @@ -154,7 +132,6 @@ MOCK_METHOD0(UpdateHistogramsOnCallEnd, void()); MOCK_CONST_METHOD1(GetStatistics, AudioProcessingStats(bool)); - virtual MockGainControl* gain_control() const { return gain_control_.get(); } virtual MockNoiseSuppression* noise_suppression() const { return noise_suppression_.get(); } @@ -162,7 +139,6 @@ MOCK_CONST_METHOD0(GetConfig, AudioProcessing::Config()); private: - std::unique_ptr<MockGainControl> gain_control_; std::unique_ptr<MockNoiseSuppression> noise_suppression_; };
diff --git a/modules/audio_processing/test/aec_dump_based_simulator.cc b/modules/audio_processing/test/aec_dump_based_simulator.cc index ba39274..e56694e 100644 --- a/modules/audio_processing/test/aec_dump_based_simulator.cc +++ b/modules/audio_processing/test/aec_dump_based_simulator.cc
@@ -376,8 +376,7 @@ if (msg.has_agc_enabled() || settings_.use_agc) { bool enable = settings_.use_agc ? *settings_.use_agc : msg.agc_enabled(); - RTC_CHECK_EQ(AudioProcessing::kNoError, - ap_->gain_control()->Enable(enable)); + apm_config.gain_controller1.enabled = enable; if (settings_.use_verbose_logging) { std::cout << " agc_enabled: " << (enable ? "true" : "false") << std::endl; @@ -386,9 +385,9 @@ if (msg.has_agc_mode() || settings_.agc_mode) { int mode = settings_.agc_mode ? *settings_.agc_mode : msg.agc_mode(); - RTC_CHECK_EQ(AudioProcessing::kNoError, - ap_->gain_control()->set_mode( - static_cast<webrtc::GainControl::Mode>(mode))); + apm_config.gain_controller1.mode = + static_cast<webrtc::AudioProcessing::Config::GainController1::Mode>( + mode); if (settings_.use_verbose_logging) { std::cout << " agc_mode: " << mode << std::endl; } @@ -397,8 +396,7 @@ if (msg.has_agc_limiter_enabled() || settings_.use_agc_limiter) { bool enable = settings_.use_agc_limiter ? *settings_.use_agc_limiter : msg.agc_limiter_enabled(); - RTC_CHECK_EQ(AudioProcessing::kNoError, - ap_->gain_control()->enable_limiter(enable)); + apm_config.gain_controller1.enable_limiter = enable; if (settings_.use_verbose_logging) { std::cout << " agc_limiter_enabled: " << (enable ? "true" : "false") << std::endl;
diff --git a/modules/audio_processing/test/audio_processing_simulator.cc b/modules/audio_processing/test/audio_processing_simulator.cc index 4a0e007..ccd3505 100644 --- a/modules/audio_processing/test/audio_processing_simulator.cc +++ b/modules/audio_processing/test/audio_processing_simulator.cc
@@ -188,15 +188,12 @@ } // Notify the current mic level to AGC. - RTC_CHECK_EQ(AudioProcessing::kNoError, - ap_->gain_control()->set_stream_analog_level( - fake_recording_device_.MicLevel())); + ap_->set_stream_analog_level(fake_recording_device_.MicLevel()); } else { // Notify the current mic level to AGC. - RTC_CHECK_EQ(AudioProcessing::kNoError, - ap_->gain_control()->set_stream_analog_level( - settings_.aec_dump_input_filename ? aec_dump_mic_level_ - : analog_mic_level_)); + ap_->set_stream_analog_level(settings_.aec_dump_input_filename + ? aec_dump_mic_level_ + : analog_mic_level_); } // Process the current audio frame. @@ -218,7 +215,7 @@ // Store the mic level suggested by AGC. // Note that when the analog gain is simulated and an AEC dump is used as // input, |analog_mic_level_| will not be used with set_stream_analog_level(). - analog_mic_level_ = ap_->gain_control()->stream_analog_level(); + analog_mic_level_ = ap_->recommended_stream_analog_level(); if (settings_.simulate_mic_gain) { fake_recording_device_.SetMicLevel(analog_mic_level_); } @@ -463,6 +460,25 @@ apm_config.voice_detection.enabled = *settings_.use_vad; } + if (settings_.use_agc) { + apm_config.gain_controller1.enabled = *settings_.use_agc; + } + if (settings_.agc_mode) { + apm_config.gain_controller1.mode = + static_cast<webrtc::AudioProcessing::Config::GainController1::Mode>( + *settings_.agc_mode); + } + if (settings_.use_agc_limiter) { + apm_config.gain_controller1.enable_limiter = *settings_.use_agc_limiter; + } + if (settings_.agc_target_level) { + apm_config.gain_controller1.target_level_dbfs = *settings_.agc_target_level; + } + if (settings_.agc_compression_gain) { + apm_config.gain_controller1.compression_gain_db = + *settings_.agc_compression_gain; + } + if (settings_.use_refined_adaptive_filter) { config.Set<RefinedAdaptiveFilter>( new RefinedAdaptiveFilter(*settings_.use_refined_adaptive_filter)); @@ -498,34 +514,10 @@ ap_->ApplyConfig(apm_config); - if (settings_.use_agc) { - RTC_CHECK_EQ(AudioProcessing::kNoError, - ap_->gain_control()->Enable(*settings_.use_agc)); - } if (settings_.use_ns) { RTC_CHECK_EQ(AudioProcessing::kNoError, ap_->noise_suppression()->Enable(*settings_.use_ns)); } - if (settings_.use_agc_limiter) { - RTC_CHECK_EQ(AudioProcessing::kNoError, ap_->gain_control()->enable_limiter( - *settings_.use_agc_limiter)); - } - if (settings_.agc_target_level) { - RTC_CHECK_EQ(AudioProcessing::kNoError, - ap_->gain_control()->set_target_level_dbfs( - *settings_.agc_target_level)); - } - if (settings_.agc_compression_gain) { - RTC_CHECK_EQ(AudioProcessing::kNoError, - ap_->gain_control()->set_compression_gain_db( - *settings_.agc_compression_gain)); - } - if (settings_.agc_mode) { - RTC_CHECK_EQ( - AudioProcessing::kNoError, - ap_->gain_control()->set_mode( - static_cast<webrtc::GainControl::Mode>(*settings_.agc_mode))); - } if (settings_.ns_level) { RTC_CHECK_EQ( AudioProcessing::kNoError,
diff --git a/modules/audio_processing/test/audio_processing_simulator.h b/modules/audio_processing/test/audio_processing_simulator.h index c7087be..340c9d3 100644 --- a/modules/audio_processing/test/audio_processing_simulator.h +++ b/modules/audio_processing/test/audio_processing_simulator.h
@@ -57,7 +57,6 @@ absl::optional<bool> use_hpf; absl::optional<bool> use_ns; absl::optional<bool> use_ts; - absl::optional<bool> use_ie; absl::optional<bool> use_vad; absl::optional<bool> use_le; absl::optional<bool> use_all;
diff --git a/modules/audio_processing/test/audioproc_float_impl.cc b/modules/audio_processing/test/audioproc_float_impl.cc index 2b24823..6428e9d 100644 --- a/modules/audio_processing/test/audioproc_float_impl.cc +++ b/modules/audio_processing/test/audioproc_float_impl.cc
@@ -338,7 +338,6 @@ if (absl::GetFlag(FLAGS_all_default)) { settings.use_le = true; settings.use_vad = true; - settings.use_ie = false; settings.use_ts = true; settings.use_ns = true; settings.use_hpf = true;
diff --git a/modules/audio_processing/test/debug_dump_replayer.cc b/modules/audio_processing/test/debug_dump_replayer.cc index 9c1257a..45600f0 100644 --- a/modules/audio_processing/test/debug_dump_replayer.cc +++ b/modules/audio_processing/test/debug_dump_replayer.cc
@@ -119,8 +119,7 @@ // APM should have been created. RTC_CHECK(apm_.get()); - RTC_CHECK_EQ(AudioProcessing::kNoError, - apm_->gain_control()->set_stream_analog_level(msg.level())); + apm_->set_stream_analog_level(msg.level()); RTC_CHECK_EQ(AudioProcessing::kNoError, apm_->set_stream_delay_ms(msg.delay())); @@ -237,21 +236,17 @@ static_cast<AudioProcessing::Config::NoiseSuppression::Level>( msg.ns_level()); - apm_->ApplyConfig(apm_config); - // AGC configs. RTC_CHECK(msg.has_agc_enabled()); - RTC_CHECK_EQ(AudioProcessing::kNoError, - apm_->gain_control()->Enable(msg.agc_enabled())); - RTC_CHECK(msg.has_agc_mode()); - RTC_CHECK_EQ(AudioProcessing::kNoError, - apm_->gain_control()->set_mode( - static_cast<GainControl::Mode>(msg.agc_mode()))); - RTC_CHECK(msg.has_agc_limiter_enabled()); - RTC_CHECK_EQ(AudioProcessing::kNoError, - apm_->gain_control()->enable_limiter(msg.agc_limiter_enabled())); + apm_config.gain_controller1.enabled = msg.agc_enabled(); + apm_config.gain_controller1.mode = + static_cast<AudioProcessing::Config::GainController1::Mode>( + msg.agc_mode()); + apm_config.gain_controller1.enable_limiter = msg.agc_limiter_enabled(); + + apm_->ApplyConfig(apm_config); } void DebugDumpReplayer::LoadNextMessage() {
diff --git a/modules/audio_processing/test/debug_dump_test.cc b/modules/audio_processing/test/debug_dump_test.cc index ff08e5d..b769a66 100644 --- a/modules/audio_processing/test/debug_dump_test.cc +++ b/modules/audio_processing/test/debug_dump_test.cc
@@ -529,8 +529,9 @@ generator.StartRecording(); generator.Process(100); - GainControl* agc = generator.apm()->gain_control(); - EXPECT_EQ(AudioProcessing::kNoError, agc->Enable(!agc->is_enabled())); + AudioProcessing::Config apm_config = generator.apm()->GetConfig(); + apm_config.gain_controller1.enabled = !apm_config.gain_controller1.enabled; + generator.apm()->ApplyConfig(apm_config); generator.Process(100); generator.StopRecording();