diff --git a/modules/audio_processing/agc2/adaptive_mode_level_estimator.cc b/modules/audio_processing/agc2/adaptive_mode_level_estimator.cc index 273b3fdb3f..246b34707a 100644 --- a/modules/audio_processing/agc2/adaptive_mode_level_estimator.cc +++ b/modules/audio_processing/agc2/adaptive_mode_level_estimator.cc @@ -13,6 +13,7 @@ #include "modules/audio_processing/agc2/agc2_common.h" #include "modules/audio_processing/logging/apm_data_dumper.h" #include "rtc_base/checks.h" +#include "rtc_base/logging.h" #include "rtc_base/numerics/safe_minmax.h" namespace webrtc { @@ -23,14 +24,10 @@ using LevelEstimatorType = // Combines a level estimation with the saturation protector margins. float ComputeLevelEstimateDbfs(float level_estimate_dbfs, - bool use_saturation_protector, float saturation_margin_db, float extra_saturation_margin_db) { return rtc::SafeClamp( - level_estimate_dbfs + - (use_saturation_protector - ? (saturation_margin_db + extra_saturation_margin_db) - : 0.f), + level_estimate_dbfs + saturation_margin_db + extra_saturation_margin_db, -90.f, 30.f); } @@ -68,7 +65,6 @@ AdaptiveModeLevelEstimator::AdaptiveModeLevelEstimator( apm_data_dumper, AudioProcessing::Config::GainController2::LevelEstimator::kRms, kDefaultAdjacentSpeechFramesThreshold, - kDefaultUseSaturationProtector, kDefaultInitialSaturationMarginDb, kDefaultExtraSaturationMarginDb) {} @@ -80,25 +76,25 @@ AdaptiveModeLevelEstimator::AdaptiveModeLevelEstimator( : AdaptiveModeLevelEstimator(apm_data_dumper, level_estimator, kDefaultAdjacentSpeechFramesThreshold, - use_saturation_protector, kDefaultInitialSaturationMarginDb, - extra_saturation_margin_db) {} + extra_saturation_margin_db) { + if (!use_saturation_protector) { + RTC_LOG(LS_WARNING) << "The saturation protector cannot be disabled."; + } +} AdaptiveModeLevelEstimator::AdaptiveModeLevelEstimator( ApmDataDumper* apm_data_dumper, AudioProcessing::Config::GainController2::LevelEstimator level_estimator, int adjacent_speech_frames_threshold, - bool use_saturation_protector, float initial_saturation_margin_db, float extra_saturation_margin_db) : apm_data_dumper_(apm_data_dumper), level_estimator_type_(level_estimator), adjacent_speech_frames_threshold_(adjacent_speech_frames_threshold), - use_saturation_protector_(use_saturation_protector), initial_saturation_margin_db_(initial_saturation_margin_db), extra_saturation_margin_db_(extra_saturation_margin_db), level_dbfs_(ComputeLevelEstimateDbfs(kInitialSpeechLevelEstimateDbfs, - use_saturation_protector_, initial_saturation_margin_db_, extra_saturation_margin_db_)) { RTC_DCHECK(apm_data_dumper_); @@ -157,16 +153,13 @@ void AdaptiveModeLevelEstimator::Update( const float level_dbfs = preliminary_state_.level_dbfs.GetRatio(); - if (use_saturation_protector_) { - UpdateSaturationProtectorState(vad_level.peak_dbfs, level_dbfs, - preliminary_state_.saturation_protector); - } + UpdateSaturationProtectorState(vad_level.peak_dbfs, level_dbfs, + preliminary_state_.saturation_protector); if (num_adjacent_speech_frames_ >= adjacent_speech_frames_threshold_) { // `preliminary_state_` is now reliable. Update the last level estimation. level_dbfs_ = ComputeLevelEstimateDbfs( - level_dbfs, use_saturation_protector_, - preliminary_state_.saturation_protector.margin_db, + level_dbfs, preliminary_state_.saturation_protector.margin_db, extra_saturation_margin_db_); } } @@ -190,9 +183,9 @@ bool AdaptiveModeLevelEstimator::IsConfident() const { void AdaptiveModeLevelEstimator::Reset() { ResetLevelEstimatorState(preliminary_state_); ResetLevelEstimatorState(reliable_state_); - level_dbfs_ = ComputeLevelEstimateDbfs( - kInitialSpeechLevelEstimateDbfs, use_saturation_protector_, - initial_saturation_margin_db_, extra_saturation_margin_db_); + level_dbfs_ = ComputeLevelEstimateDbfs(kInitialSpeechLevelEstimateDbfs, + initial_saturation_margin_db_, + extra_saturation_margin_db_); num_adjacent_speech_frames_ = 0; } diff --git a/modules/audio_processing/agc2/adaptive_mode_level_estimator.h b/modules/audio_processing/agc2/adaptive_mode_level_estimator.h index 99b9fc9c3c..ccea406079 100644 --- a/modules/audio_processing/agc2/adaptive_mode_level_estimator.h +++ b/modules/audio_processing/agc2/adaptive_mode_level_estimator.h @@ -29,7 +29,8 @@ class AdaptiveModeLevelEstimator { AdaptiveModeLevelEstimator(const AdaptiveModeLevelEstimator&) = delete; AdaptiveModeLevelEstimator& operator=(const AdaptiveModeLevelEstimator&) = delete; - // Deprecated ctor. + // Deprecated ctor. `use_saturation_protector` is ignored and the saturation + // protector will be used regardless of what is passed. AdaptiveModeLevelEstimator( ApmDataDumper* apm_data_dumper, AudioProcessing::Config::GainController2::LevelEstimator level_estimator, @@ -40,7 +41,6 @@ class AdaptiveModeLevelEstimator { ApmDataDumper* apm_data_dumper, AudioProcessing::Config::GainController2::LevelEstimator level_estimator, int adjacent_speech_frames_threshold, - bool use_saturation_protector, float initial_saturation_margin_db, float extra_saturation_margin_db); @@ -65,7 +65,7 @@ class AdaptiveModeLevelEstimator { float denominator; float GetRatio() const; }; - // TODO(crbug.com/webrtc/7494): Remove if saturation protector always used. + // TODO(crbug.com/webrtc/7494): Remove time_to_full_buffer_ms if redundant. int time_to_full_buffer_ms; Ratio level_dbfs; SaturationProtectorState saturation_protector; @@ -81,7 +81,6 @@ class AdaptiveModeLevelEstimator { const AudioProcessing::Config::GainController2::LevelEstimator level_estimator_type_; const int adjacent_speech_frames_threshold_; - const bool use_saturation_protector_; const float initial_saturation_margin_db_; const float extra_saturation_margin_db_; LevelEstimatorState preliminary_state_; diff --git a/modules/audio_processing/agc2/adaptive_mode_level_estimator_unittest.cc b/modules/audio_processing/agc2/adaptive_mode_level_estimator_unittest.cc index 0b5b2041e0..991ac84886 100644 --- a/modules/audio_processing/agc2/adaptive_mode_level_estimator_unittest.cc +++ b/modules/audio_processing/agc2/adaptive_mode_level_estimator_unittest.cc @@ -50,7 +50,6 @@ struct TestLevelEstimator { &data_dumper, AudioProcessing::Config::GainController2::LevelEstimator::kRms, /*min_consecutive_speech_frames=*/1, - /*use_saturation_protector=*/true, kInitialSaturationMarginDb, kExtraSaturationMarginDb)) {} ApmDataDumper data_dumper; @@ -192,7 +191,6 @@ TEST(AutomaticGainController2AdaptiveModeLevelEstimator, struct TestConfig { int min_consecutive_speech_frames; - bool use_saturation_protector; float initial_saturation_margin_db; float extra_saturation_margin_db; }; @@ -206,8 +204,8 @@ TEST_P(AdaptiveModeLevelEstimatorTest, DoNotAdaptToShortSpeechSegments) { AdaptiveModeLevelEstimator level_estimator( &apm_data_dumper, AudioProcessing::Config::GainController2::LevelEstimator::kRms, - params.min_consecutive_speech_frames, params.use_saturation_protector, - params.initial_saturation_margin_db, params.extra_saturation_margin_db); + params.min_consecutive_speech_frames, params.initial_saturation_margin_db, + params.extra_saturation_margin_db); const float initial_level = level_estimator.level_dbfs(); ASSERT_LT(initial_level, kVadDataSpeech.rms_dbfs); for (int i = 0; i < params.min_consecutive_speech_frames - 1; ++i) { @@ -225,8 +223,8 @@ TEST_P(AdaptiveModeLevelEstimatorTest, AdaptToEnoughSpeechSegments) { AdaptiveModeLevelEstimator level_estimator( &apm_data_dumper, AudioProcessing::Config::GainController2::LevelEstimator::kRms, - params.min_consecutive_speech_frames, params.use_saturation_protector, - params.initial_saturation_margin_db, params.extra_saturation_margin_db); + params.min_consecutive_speech_frames, params.initial_saturation_margin_db, + params.extra_saturation_margin_db); const float initial_level = level_estimator.level_dbfs(); ASSERT_LT(initial_level, kVadDataSpeech.rms_dbfs); for (int i = 0; i < params.min_consecutive_speech_frames; ++i) { @@ -237,10 +235,8 @@ TEST_P(AdaptiveModeLevelEstimatorTest, AdaptToEnoughSpeechSegments) { INSTANTIATE_TEST_SUITE_P(AutomaticGainController2, AdaptiveModeLevelEstimatorTest, - ::testing::Values(TestConfig{1, false, 0.f, 0.f}, - TestConfig{1, true, 0.f, 0.f}, - TestConfig{9, false, 0.f, 0.f}, - TestConfig{9, true, 0.f, 0.f})); + ::testing::Values(TestConfig{1, 0.f, 0.f}, + TestConfig{9, 0.f, 0.f})); } // namespace } // namespace webrtc diff --git a/modules/audio_processing/agc2/agc2_common.h b/modules/audio_processing/agc2/agc2_common.h index 4a99dd2f2e..cffe8b5989 100644 --- a/modules/audio_processing/agc2/agc2_common.h +++ b/modules/audio_processing/agc2/agc2_common.h @@ -54,7 +54,6 @@ constexpr float kDefaultSmoothedVadProbabilityAttack = 1.f; constexpr int kDefaultAdjacentSpeechFramesThreshold = 1; // Saturation Protector settings. -constexpr bool kDefaultUseSaturationProtector = true; constexpr float kDefaultInitialSaturationMarginDb = 20.f; constexpr float kDefaultExtraSaturationMarginDb = 2.f;