diff --git a/modules/audio_processing/BUILD.gn b/modules/audio_processing/BUILD.gn index 44082f7617..79a02551e4 100644 --- a/modules/audio_processing/BUILD.gn +++ b/modules/audio_processing/BUILD.gn @@ -138,7 +138,7 @@ rtc_library("gain_controller2") { "../../rtc_base:logging", "../../rtc_base:stringutils", "../../system_wrappers:field_trial", - "agc2:adaptive_digital_gain_applier", + "agc2:adaptive_digital_gain_controller", "agc2:cpu_features", "agc2:fixed_digital", "agc2:gain_applier", @@ -420,7 +420,7 @@ if (rtc_include_tests) { "../audio_coding:neteq_input_audio_tools", "aec_dump:mock_aec_dump_unittests", "agc:agc_unittests", - "agc2:adaptive_digital_gain_applier_unittest", + "agc2:adaptive_digital_gain_controller_unittest", "agc2:biquad_filter_unittests", "agc2:fixed_digital_unittests", "agc2:gain_applier_unittest", diff --git a/modules/audio_processing/agc2/BUILD.gn b/modules/audio_processing/agc2/BUILD.gn index b26d692449..220f4d0e9a 100644 --- a/modules/audio_processing/agc2/BUILD.gn +++ b/modules/audio_processing/agc2/BUILD.gn @@ -32,10 +32,10 @@ rtc_library("speech_level_estimator") { ] } -rtc_library("adaptive_digital_gain_applier") { +rtc_library("adaptive_digital_gain_controller") { sources = [ - "adaptive_digital_gain_applier.cc", - "adaptive_digital_gain_applier.h", + "adaptive_digital_gain_controller.cc", + "adaptive_digital_gain_controller.h", ] visibility = [ @@ -309,14 +309,14 @@ rtc_library("speech_level_estimator_unittest") { ] } -rtc_library("adaptive_digital_gain_applier_unittest") { +rtc_library("adaptive_digital_gain_controller_unittest") { testonly = true configs += [ "..:apm_debug_dump" ] - sources = [ "adaptive_digital_gain_applier_unittest.cc" ] + sources = [ "adaptive_digital_gain_controller_unittest.cc" ] deps = [ - ":adaptive_digital_gain_applier", + ":adaptive_digital_gain_controller", ":common", ":test_utils", "..:api", diff --git a/modules/audio_processing/agc2/adaptive_digital_gain_applier.cc b/modules/audio_processing/agc2/adaptive_digital_gain_controller.cc similarity index 96% rename from modules/audio_processing/agc2/adaptive_digital_gain_applier.cc rename to modules/audio_processing/agc2/adaptive_digital_gain_controller.cc index a34f598874..b8a99da6b0 100644 --- a/modules/audio_processing/agc2/adaptive_digital_gain_applier.cc +++ b/modules/audio_processing/agc2/adaptive_digital_gain_controller.cc @@ -8,7 +8,7 @@ * be found in the AUTHORS file in the root of the source tree. */ -#include "modules/audio_processing/agc2/adaptive_digital_gain_applier.h" +#include "modules/audio_processing/agc2/adaptive_digital_gain_controller.h" #include @@ -116,7 +116,7 @@ void CopyAudio(AudioFrameView src, } // namespace -AdaptiveDigitalGainApplier::AdaptiveDigitalGainApplier( +AdaptiveDigitalGainController::AdaptiveDigitalGainController( ApmDataDumper* apm_data_dumper, const AudioProcessing::Config::GainController2::AdaptiveDigital& config, int sample_rate_hz, @@ -139,8 +139,8 @@ AdaptiveDigitalGainApplier::AdaptiveDigitalGainApplier( Initialize(sample_rate_hz, num_channels); } -void AdaptiveDigitalGainApplier::Initialize(int sample_rate_hz, - int num_channels) { +void AdaptiveDigitalGainController::Initialize(int sample_rate_hz, + int num_channels) { if (!config_.dry_run) { return; } @@ -163,8 +163,8 @@ void AdaptiveDigitalGainApplier::Initialize(int sample_rate_hz, } } -void AdaptiveDigitalGainApplier::Process(const FrameInfo& info, - AudioFrameView frame) { +void AdaptiveDigitalGainController::Process(const FrameInfo& info, + AudioFrameView frame) { RTC_DCHECK_GE(info.speech_level_dbfs, -150.0f); RTC_DCHECK_GE(frame.num_channels(), 1); RTC_DCHECK( diff --git a/modules/audio_processing/agc2/adaptive_digital_gain_applier.h b/modules/audio_processing/agc2/adaptive_digital_gain_controller.h similarity index 68% rename from modules/audio_processing/agc2/adaptive_digital_gain_applier.h rename to modules/audio_processing/agc2/adaptive_digital_gain_controller.h index 0b1cceb776..05b2ef95d5 100644 --- a/modules/audio_processing/agc2/adaptive_digital_gain_applier.h +++ b/modules/audio_processing/agc2/adaptive_digital_gain_controller.h @@ -8,8 +8,8 @@ * be found in the AUTHORS file in the root of the source tree. */ -#ifndef MODULES_AUDIO_PROCESSING_AGC2_ADAPTIVE_DIGITAL_GAIN_APPLIER_H_ -#define MODULES_AUDIO_PROCESSING_AGC2_ADAPTIVE_DIGITAL_GAIN_APPLIER_H_ +#ifndef MODULES_AUDIO_PROCESSING_AGC2_ADAPTIVE_DIGITAL_GAIN_CONTROLLER_H_ +#define MODULES_AUDIO_PROCESSING_AGC2_ADAPTIVE_DIGITAL_GAIN_CONTROLLER_H_ #include @@ -21,30 +21,29 @@ namespace webrtc { class ApmDataDumper; -// TODO(bugs.webrtc.org/7494): Split into `GainAdaptor` and `GainApplier`. // Selects the target digital gain, decides when and how quickly to adapt to the // target and applies the current gain to 10 ms frames. -class AdaptiveDigitalGainApplier { +class AdaptiveDigitalGainController { public: // Information about a frame to process. struct FrameInfo { - float speech_probability; // Probability of speech in the [0, 1] range. - float speech_level_dbfs; // Estimated speech level (dBFS). - bool speech_level_reliable; // True with reliable speech level estimation. - float noise_rms_dbfs; // Estimated noise RMS level (dBFS). - float headroom_db; // Headroom (dB). + float speech_probability; // Probability of speech in the [0, 1] range. + float speech_level_dbfs; // Estimated speech level (dBFS). + bool speech_level_reliable; // True with reliable speech level estimation. + float noise_rms_dbfs; // Estimated noise RMS level (dBFS). + float headroom_db; // Headroom (dB). // TODO(bugs.webrtc.org/7494): Remove `limiter_envelope_dbfs`. float limiter_envelope_dbfs; // Envelope level from the limiter (dBFS). }; - AdaptiveDigitalGainApplier( + AdaptiveDigitalGainController( ApmDataDumper* apm_data_dumper, const AudioProcessing::Config::GainController2::AdaptiveDigital& config, int sample_rate_hz, int num_channels); - AdaptiveDigitalGainApplier(const AdaptiveDigitalGainApplier&) = delete; - AdaptiveDigitalGainApplier& operator=(const AdaptiveDigitalGainApplier&) = - delete; + AdaptiveDigitalGainController(const AdaptiveDigitalGainController&) = delete; + AdaptiveDigitalGainController& operator=( + const AdaptiveDigitalGainController&) = delete; void Initialize(int sample_rate_hz, int num_channels); @@ -69,4 +68,4 @@ class AdaptiveDigitalGainApplier { } // namespace webrtc -#endif // MODULES_AUDIO_PROCESSING_AGC2_ADAPTIVE_DIGITAL_GAIN_APPLIER_H_ +#endif // MODULES_AUDIO_PROCESSING_AGC2_ADAPTIVE_DIGITAL_GAIN_CONTROLLER_H_ diff --git a/modules/audio_processing/agc2/adaptive_digital_gain_applier_unittest.cc b/modules/audio_processing/agc2/adaptive_digital_gain_controller_unittest.cc similarity index 83% rename from modules/audio_processing/agc2/adaptive_digital_gain_applier_unittest.cc rename to modules/audio_processing/agc2/adaptive_digital_gain_controller_unittest.cc index ea7485f512..832be1e2b4 100644 --- a/modules/audio_processing/agc2/adaptive_digital_gain_applier_unittest.cc +++ b/modules/audio_processing/agc2/adaptive_digital_gain_controller_unittest.cc @@ -8,7 +8,7 @@ * be found in the AUTHORS file in the root of the source tree. */ -#include "modules/audio_processing/agc2/adaptive_digital_gain_applier.h" +#include "modules/audio_processing/agc2/adaptive_digital_gain_controller.h" #include #include @@ -48,28 +48,28 @@ using AdaptiveDigitalConfig = constexpr AdaptiveDigitalConfig kDefaultConfig{}; -// Helper to create initialized `AdaptiveDigitalGainApplier` objects. +// Helper to create initialized `AdaptiveDigitalGainController` objects. struct GainApplierHelper { GainApplierHelper(const AdaptiveDigitalConfig& config, int sample_rate_hz, int num_channels) : apm_data_dumper(0), gain_applier( - std::make_unique(&apm_data_dumper, - config, - sample_rate_hz, - num_channels)) {} + std::make_unique(&apm_data_dumper, + config, + sample_rate_hz, + num_channels)) {} ApmDataDumper apm_data_dumper; - std::unique_ptr gain_applier; + std::unique_ptr gain_applier; }; // Returns a `FrameInfo` sample to simulate noiseless speech detected with // maximum probability and with level, headroom and limiter envelope chosen // so that the resulting gain equals the default initial adaptive digital gain // i.e., no gain adaptation is expected. -AdaptiveDigitalGainApplier::FrameInfo GetFrameInfoToNotAdapt( +AdaptiveDigitalGainController::FrameInfo GetFrameInfoToNotAdapt( const AdaptiveDigitalConfig& config) { - AdaptiveDigitalGainApplier::FrameInfo info; + AdaptiveDigitalGainController::FrameInfo info; info.speech_probability = kMaxSpeechProbability; info.speech_level_dbfs = -config.initial_gain_db - config.headroom_db; info.speech_level_reliable = true; @@ -79,7 +79,8 @@ AdaptiveDigitalGainApplier::FrameInfo GetFrameInfoToNotAdapt( return info; } -TEST(GainController2AdaptiveGainApplier, GainApplierShouldNotCrash) { +TEST(GainController2AdaptiveDigitalGainControllerTest, + GainApplierShouldNotCrash) { GainApplierHelper helper(kDefaultConfig, /*sample_rate_hz=*/48000, kStereo); // Make one call with reasonable audio level values and settings. VectorFloatFrame fake_audio(kStereo, kFrameLen10ms48kHz, 10000.0f); @@ -88,7 +89,7 @@ TEST(GainController2AdaptiveGainApplier, GainApplierShouldNotCrash) { } // Checks that the maximum allowed gain is applied. -TEST(GainController2AdaptiveGainApplier, MaxGainApplied) { +TEST(GainController2AdaptiveDigitalGainControllerTest, MaxGainApplied) { constexpr int kNumFramesToAdapt = static_cast(kDefaultConfig.max_gain_db / GetMaxGainChangePerFrameDb( @@ -96,7 +97,7 @@ TEST(GainController2AdaptiveGainApplier, MaxGainApplied) { kNumExtraFrames; GainApplierHelper helper(kDefaultConfig, /*sample_rate_hz=*/8000, kMono); - AdaptiveDigitalGainApplier::FrameInfo info = + AdaptiveDigitalGainController::FrameInfo info = GetFrameInfoToNotAdapt(kDefaultConfig); info.speech_level_dbfs = -60.0f; float applied_gain; @@ -109,7 +110,7 @@ TEST(GainController2AdaptiveGainApplier, MaxGainApplied) { EXPECT_NEAR(applied_gain_db, kDefaultConfig.max_gain_db, 0.1f); } -TEST(GainController2AdaptiveGainApplier, GainDoesNotChangeFast) { +TEST(GainController2AdaptiveDigitalGainControllerTest, GainDoesNotChangeFast) { GainApplierHelper helper(kDefaultConfig, /*sample_rate_hz=*/8000, kMono); constexpr float initial_level_dbfs = -25.0f; @@ -125,7 +126,7 @@ TEST(GainController2AdaptiveGainApplier, GainDoesNotChangeFast) { for (int i = 0; i < kNumFramesToAdapt; ++i) { SCOPED_TRACE(i); VectorFloatFrame fake_audio(kMono, kFrameLen10ms8kHz, 1.0f); - AdaptiveDigitalGainApplier::FrameInfo info = + AdaptiveDigitalGainController::FrameInfo info = GetFrameInfoToNotAdapt(kDefaultConfig); info.speech_level_dbfs = initial_level_dbfs; helper.gain_applier->Process(info, fake_audio.float_frame_view()); @@ -139,7 +140,7 @@ TEST(GainController2AdaptiveGainApplier, GainDoesNotChangeFast) { for (int i = 0; i < kNumFramesToAdapt; ++i) { SCOPED_TRACE(i); VectorFloatFrame fake_audio(kMono, kFrameLen10ms8kHz, 1.0f); - AdaptiveDigitalGainApplier::FrameInfo info = + AdaptiveDigitalGainController::FrameInfo info = GetFrameInfoToNotAdapt(kDefaultConfig); info.speech_level_dbfs = 0.f; helper.gain_applier->Process(info, fake_audio.float_frame_view()); @@ -150,13 +151,13 @@ TEST(GainController2AdaptiveGainApplier, GainDoesNotChangeFast) { } } -TEST(GainController2AdaptiveGainApplier, GainIsRampedInAFrame) { +TEST(GainController2AdaptiveDigitalGainControllerTest, GainIsRampedInAFrame) { GainApplierHelper helper(kDefaultConfig, /*sample_rate_hz=*/48000, kMono); constexpr float initial_level_dbfs = -25.0f; VectorFloatFrame fake_audio(kMono, kFrameLen10ms48kHz, 1.0f); - AdaptiveDigitalGainApplier::FrameInfo info = + AdaptiveDigitalGainController::FrameInfo info = GetFrameInfoToNotAdapt(kDefaultConfig); info.speech_level_dbfs = initial_level_dbfs; helper.gain_applier->Process(info, fake_audio.float_frame_view()); @@ -176,7 +177,7 @@ TEST(GainController2AdaptiveGainApplier, GainIsRampedInAFrame) { EXPECT_LE(maximal_difference, max_change_per_sample); } -TEST(GainController2AdaptiveGainApplier, NoiseLimitsGain) { +TEST(GainController2AdaptiveDigitalGainControllerTest, NoiseLimitsGain) { GainApplierHelper helper(kDefaultConfig, /*sample_rate_hz=*/48000, kMono); constexpr float initial_level_dbfs = -25.0f; @@ -190,7 +191,7 @@ TEST(GainController2AdaptiveGainApplier, NoiseLimitsGain) { for (int i = 0; i < num_initial_frames + num_frames; ++i) { VectorFloatFrame fake_audio(kMono, kFrameLen10ms48kHz, 1.0f); - AdaptiveDigitalGainApplier::FrameInfo info = + AdaptiveDigitalGainController::FrameInfo info = GetFrameInfoToNotAdapt(kDefaultConfig); info.speech_level_dbfs = initial_level_dbfs; info.noise_rms_dbfs = kWithNoiseDbfs; @@ -207,18 +208,19 @@ TEST(GainController2AdaptiveGainApplier, NoiseLimitsGain) { } } -TEST(GainController2GainApplier, CanHandlePositiveSpeechLevels) { +TEST(GainController2AdaptiveDigitalGainControllerTest, + CanHandlePositiveSpeechLevels) { GainApplierHelper helper(kDefaultConfig, /*sample_rate_hz=*/48000, kStereo); // Make one call with positive audio level values and settings. VectorFloatFrame fake_audio(kStereo, kFrameLen10ms48kHz, 10000.0f); - AdaptiveDigitalGainApplier::FrameInfo info = + AdaptiveDigitalGainController::FrameInfo info = GetFrameInfoToNotAdapt(kDefaultConfig); info.speech_level_dbfs = 5.0f; helper.gain_applier->Process(info, fake_audio.float_frame_view()); } -TEST(GainController2GainApplier, AudioLevelLimitsGain) { +TEST(GainController2AdaptiveDigitalGainControllerTest, AudioLevelLimitsGain) { GainApplierHelper helper(kDefaultConfig, /*sample_rate_hz=*/48000, kMono); constexpr float initial_level_dbfs = -25.0f; @@ -232,7 +234,7 @@ TEST(GainController2GainApplier, AudioLevelLimitsGain) { for (int i = 0; i < num_initial_frames + num_frames; ++i) { VectorFloatFrame fake_audio(kMono, kFrameLen10ms48kHz, 1.0f); - AdaptiveDigitalGainApplier::FrameInfo info = + AdaptiveDigitalGainController::FrameInfo info = GetFrameInfoToNotAdapt(kDefaultConfig); info.speech_level_dbfs = initial_level_dbfs; info.limiter_envelope_dbfs = 1.0f; @@ -250,19 +252,21 @@ TEST(GainController2GainApplier, AudioLevelLimitsGain) { } } -class AdaptiveDigitalGainApplierTest : public ::testing::TestWithParam { +class AdaptiveDigitalGainControllerParametrizedTest + : public ::testing::TestWithParam { protected: int adjacent_speech_frames_threshold() const { return GetParam(); } }; -TEST_P(AdaptiveDigitalGainApplierTest, +TEST_P(AdaptiveDigitalGainControllerParametrizedTest, DoNotIncreaseGainWithTooFewSpeechFrames) { AdaptiveDigitalConfig config; config.adjacent_speech_frames_threshold = adjacent_speech_frames_threshold(); GainApplierHelper helper(config, /*sample_rate_hz=*/48000, kMono); // Lower the speech level so that the target gain will be increased. - AdaptiveDigitalGainApplier::FrameInfo info = GetFrameInfoToNotAdapt(config); + AdaptiveDigitalGainController::FrameInfo info = + GetFrameInfoToNotAdapt(config); info.speech_level_dbfs -= 12.0f; float prev_gain = 0.0f; @@ -278,13 +282,15 @@ TEST_P(AdaptiveDigitalGainApplierTest, } } -TEST_P(AdaptiveDigitalGainApplierTest, IncreaseGainWithEnoughSpeechFrames) { +TEST_P(AdaptiveDigitalGainControllerParametrizedTest, + IncreaseGainWithEnoughSpeechFrames) { AdaptiveDigitalConfig config; config.adjacent_speech_frames_threshold = adjacent_speech_frames_threshold(); GainApplierHelper helper(config, /*sample_rate_hz=*/48000, kMono); // Lower the speech level so that the target gain will be increased. - AdaptiveDigitalGainApplier::FrameInfo info = GetFrameInfoToNotAdapt(config); + AdaptiveDigitalGainController::FrameInfo info = + GetFrameInfoToNotAdapt(config); info.speech_level_dbfs -= 12.0f; float prev_gain = 0.0f; @@ -304,17 +310,19 @@ TEST_P(AdaptiveDigitalGainApplierTest, IncreaseGainWithEnoughSpeechFrames) { } INSTANTIATE_TEST_SUITE_P(GainController2, - AdaptiveDigitalGainApplierTest, + AdaptiveDigitalGainControllerParametrizedTest, ::testing::Values(1, 7, 31)); // Checks that the input is never modified when running in dry run mode. -TEST(GainController2GainApplier, DryRunDoesNotChangeInput) { +TEST(GainController2AdaptiveDigitalGainControllerTest, + DryRunDoesNotChangeInput) { AdaptiveDigitalConfig config; config.dry_run = true; GainApplierHelper helper(config, /*sample_rate_hz=*/8000, kMono); // Simulate an input signal with log speech level. - AdaptiveDigitalGainApplier::FrameInfo info = GetFrameInfoToNotAdapt(config); + AdaptiveDigitalGainController::FrameInfo info = + GetFrameInfoToNotAdapt(config); info.speech_level_dbfs = -60.0f; const int num_frames_to_adapt = static_cast( @@ -332,12 +340,14 @@ TEST(GainController2GainApplier, DryRunDoesNotChangeInput) { } // Checks that no sample is modified before and after the sample rate changes. -TEST(GainController2GainApplier, DryRunHandlesSampleRateChange) { +TEST(GainController2AdaptiveDigitalGainControllerTest, + DryRunHandlesSampleRateChange) { AdaptiveDigitalConfig config; config.dry_run = true; GainApplierHelper helper(config, /*sample_rate_hz=*/8000, kMono); - AdaptiveDigitalGainApplier::FrameInfo info = GetFrameInfoToNotAdapt(config); + AdaptiveDigitalGainController::FrameInfo info = + GetFrameInfoToNotAdapt(config); info.speech_level_dbfs = -60.0f; constexpr float kPcmSamples = 123.456f; VectorFloatFrame fake_audio_8k(kMono, kFrameLen10ms8kHz, kPcmSamples); @@ -351,12 +361,14 @@ TEST(GainController2GainApplier, DryRunHandlesSampleRateChange) { // Checks that no sample is modified before and after the number of channels // changes. -TEST(GainController2GainApplier, DryRunHandlesNumChannelsChange) { +TEST(GainController2AdaptiveDigitalGainControllerTest, + DryRunHandlesNumChannelsChange) { AdaptiveDigitalConfig config; config.dry_run = true; GainApplierHelper helper(config, /*sample_rate_hz=*/8000, kMono); - AdaptiveDigitalGainApplier::FrameInfo info = GetFrameInfoToNotAdapt(config); + AdaptiveDigitalGainController::FrameInfo info = + GetFrameInfoToNotAdapt(config); info.speech_level_dbfs = -60.0f; constexpr float kPcmSamples = 123.456f; VectorFloatFrame fake_audio_8k(kMono, kFrameLen10ms8kHz, kPcmSamples); diff --git a/modules/audio_processing/gain_controller2.cc b/modules/audio_processing/gain_controller2.cc index 6a57dca066..d25ce7a094 100644 --- a/modules/audio_processing/gain_controller2.cc +++ b/modules/audio_processing/gain_controller2.cc @@ -128,8 +128,10 @@ GainController2::GainController2( config.adaptive_digital.adjacent_speech_frames_threshold, &data_dumper_); // Create controller. - adaptive_digital_controller_ = std::make_unique( - &data_dumper_, config.adaptive_digital, sample_rate_hz, num_channels); + adaptive_digital_controller_ = + std::make_unique( + &data_dumper_, config.adaptive_digital, sample_rate_hz, + num_channels); } } diff --git a/modules/audio_processing/gain_controller2.h b/modules/audio_processing/gain_controller2.h index fa4743c280..7f22f4df8a 100644 --- a/modules/audio_processing/gain_controller2.h +++ b/modules/audio_processing/gain_controller2.h @@ -15,7 +15,7 @@ #include #include -#include "modules/audio_processing/agc2/adaptive_digital_gain_applier.h" +#include "modules/audio_processing/agc2/adaptive_digital_gain_controller.h" #include "modules/audio_processing/agc2/cpu_features.h" #include "modules/audio_processing/agc2/gain_applier.h" #include "modules/audio_processing/agc2/input_volume_controller.h" @@ -92,8 +92,7 @@ class GainController2 { std::unique_ptr input_volume_controller_; // TODO(bugs.webrtc.org/7494): Rename to `CrestFactorEstimator`. std::unique_ptr saturation_protector_; - // TODO(bugs.webrtc.org/7494): Rename to `AdaptiveDigitalGainController`. - std::unique_ptr adaptive_digital_controller_; + std::unique_ptr adaptive_digital_controller_; Limiter limiter_; int calls_since_last_limiter_log_;