diff --git a/modules/audio_processing/audio_processing_impl.cc b/modules/audio_processing/audio_processing_impl.cc index 0d11e418e6..e98316f44f 100644 --- a/modules/audio_processing/audio_processing_impl.cc +++ b/modules/audio_processing/audio_processing_impl.cc @@ -324,229 +324,10 @@ constexpr int kUnspecifiedDataDumpInputVolume = -100; // Throughout webrtc, it's assumed that success is represented by zero. static_assert(AudioProcessing::kNoError == 0, "kNoError must be zero"); -absl::optional -AudioProcessingImpl::GetGainController2ExperimentParams() { - constexpr char kFieldTrialName[] = "WebRTC-Audio-GainController2"; - - if (!field_trial::IsEnabled(kFieldTrialName)) { - return absl::nullopt; - } - - FieldTrialFlag enabled("Enabled", false); - - // Whether the gain control should switch to AGC2. Enabled by default. - FieldTrialParameter switch_to_agc2("switch_to_agc2", true); - - // AGC2 input volume controller configuration. - constexpr InputVolumeController::Config kDefaultInputVolumeControllerConfig; - FieldTrialConstrained min_input_volume( - "min_input_volume", kDefaultInputVolumeControllerConfig.min_input_volume, - 0, 255); - FieldTrialConstrained clipped_level_min( - "clipped_level_min", - kDefaultInputVolumeControllerConfig.clipped_level_min, 0, 255); - FieldTrialConstrained clipped_level_step( - "clipped_level_step", - kDefaultInputVolumeControllerConfig.clipped_level_step, 0, 255); - FieldTrialConstrained clipped_ratio_threshold( - "clipped_ratio_threshold", - kDefaultInputVolumeControllerConfig.clipped_ratio_threshold, 0, 1); - FieldTrialConstrained clipped_wait_frames( - "clipped_wait_frames", - kDefaultInputVolumeControllerConfig.clipped_wait_frames, 0, - absl::nullopt); - FieldTrialParameter enable_clipping_predictor( - "enable_clipping_predictor", - kDefaultInputVolumeControllerConfig.enable_clipping_predictor); - FieldTrialConstrained target_range_max_dbfs( - "target_range_max_dbfs", - kDefaultInputVolumeControllerConfig.target_range_max_dbfs, -90, 30); - FieldTrialConstrained target_range_min_dbfs( - "target_range_min_dbfs", - kDefaultInputVolumeControllerConfig.target_range_min_dbfs, -90, 30); - FieldTrialConstrained update_input_volume_wait_frames( - "update_input_volume_wait_frames", - kDefaultInputVolumeControllerConfig.update_input_volume_wait_frames, 0, - absl::nullopt); - FieldTrialConstrained speech_probability_threshold( - "speech_probability_threshold", - kDefaultInputVolumeControllerConfig.speech_probability_threshold, 0, 1); - FieldTrialConstrained speech_ratio_threshold( - "speech_ratio_threshold", - kDefaultInputVolumeControllerConfig.speech_ratio_threshold, 0, 1); - - // AGC2 adaptive digital controller configuration. - constexpr AudioProcessing::Config::GainController2::AdaptiveDigital - kDefaultAdaptiveDigitalConfig; - FieldTrialConstrained headroom_db( - "headroom_db", kDefaultAdaptiveDigitalConfig.headroom_db, 0, - absl::nullopt); - FieldTrialConstrained max_gain_db( - "max_gain_db", kDefaultAdaptiveDigitalConfig.max_gain_db, 0, - absl::nullopt); - FieldTrialConstrained initial_gain_db( - "initial_gain_db", kDefaultAdaptiveDigitalConfig.initial_gain_db, 0, - absl::nullopt); - FieldTrialConstrained max_gain_change_db_per_second( - "max_gain_change_db_per_second", - kDefaultAdaptiveDigitalConfig.max_gain_change_db_per_second, 0, - absl::nullopt); - FieldTrialConstrained max_output_noise_level_dbfs( - "max_output_noise_level_dbfs", - kDefaultAdaptiveDigitalConfig.max_output_noise_level_dbfs, absl::nullopt, - 0); - - // Transient suppressor. - FieldTrialParameter disallow_transient_suppressor_usage( - "disallow_transient_suppressor_usage", false); - - // Field-trial based override for the input volume controller and adaptive - // digital configs. - ParseFieldTrial( - {&enabled, &switch_to_agc2, &min_input_volume, &clipped_level_min, - &clipped_level_step, &clipped_ratio_threshold, &clipped_wait_frames, - &enable_clipping_predictor, &target_range_max_dbfs, - &target_range_min_dbfs, &update_input_volume_wait_frames, - &speech_probability_threshold, &speech_ratio_threshold, &headroom_db, - &max_gain_db, &initial_gain_db, &max_gain_change_db_per_second, - &max_output_noise_level_dbfs, &disallow_transient_suppressor_usage}, - field_trial::FindFullName(kFieldTrialName)); - // Checked already by `IsEnabled()` before parsing, therefore always true. - RTC_DCHECK(enabled); - - const bool do_not_change_agc_config = !switch_to_agc2.Get(); - if (do_not_change_agc_config && !disallow_transient_suppressor_usage.Get()) { - // Return an unspecifed value since, in this case, both the AGC2 and TS - // configurations won't be adjusted. - return absl::nullopt; - } - using Params = AudioProcessingImpl::GainController2ExperimentParams; - if (do_not_change_agc_config) { - // Return a value that leaves the AGC2 config unchanged and that always - // disables TS. - return Params{.agc2_config = absl::nullopt, - .disallow_transient_suppressor_usage = true}; - } - // Return a value that switches all the gain control to AGC2. - return Params{ - .agc2_config = - Params::Agc2Config{ - .input_volume_controller = - { - .min_input_volume = min_input_volume.Get(), - .clipped_level_min = clipped_level_min.Get(), - .clipped_level_step = clipped_level_step.Get(), - .clipped_ratio_threshold = - static_cast(clipped_ratio_threshold.Get()), - .clipped_wait_frames = clipped_wait_frames.Get(), - .enable_clipping_predictor = - enable_clipping_predictor.Get(), - .target_range_max_dbfs = target_range_max_dbfs.Get(), - .target_range_min_dbfs = target_range_min_dbfs.Get(), - .update_input_volume_wait_frames = - update_input_volume_wait_frames.Get(), - .speech_probability_threshold = static_cast( - speech_probability_threshold.Get()), - .speech_ratio_threshold = - static_cast(speech_ratio_threshold.Get()), - }, - .adaptive_digital_controller = - { - .headroom_db = static_cast(headroom_db.Get()), - .max_gain_db = static_cast(max_gain_db.Get()), - .initial_gain_db = - static_cast(initial_gain_db.Get()), - .max_gain_change_db_per_second = static_cast( - max_gain_change_db_per_second.Get()), - .max_output_noise_level_dbfs = - static_cast(max_output_noise_level_dbfs.Get()), - }}, - .disallow_transient_suppressor_usage = - disallow_transient_suppressor_usage.Get()}; -} - -AudioProcessing::Config AudioProcessingImpl::AdjustConfig( - const AudioProcessing::Config& config, - const absl::optional& - experiment_params) { - if (!experiment_params.has_value() || - (!experiment_params->agc2_config.has_value() && - !experiment_params->disallow_transient_suppressor_usage)) { - // When the experiment parameters are unspecified or when the AGC and TS - // configuration are not overridden, return the unmodified configuration. - return config; - } - - AudioProcessing::Config adjusted_config = config; - - // Override the transient suppressor configuration. - if (experiment_params->disallow_transient_suppressor_usage) { - adjusted_config.transient_suppression.enabled = false; - } - - // Override the auto gain control configuration if the AGC1 analog gain - // controller is active and `experiment_params->agc2_config` is specified. - const bool agc1_analog_enabled = - config.gain_controller1.enabled && - (config.gain_controller1.mode == - AudioProcessing::Config::GainController1::kAdaptiveAnalog || - config.gain_controller1.analog_gain_controller.enabled); - if (agc1_analog_enabled && experiment_params->agc2_config.has_value()) { - // Check that the unadjusted AGC config meets the preconditions. - const bool hybrid_agc_config_detected = - config.gain_controller1.enabled && - config.gain_controller1.analog_gain_controller.enabled && - !config.gain_controller1.analog_gain_controller - .enable_digital_adaptive && - config.gain_controller2.enabled && - config.gain_controller2.adaptive_digital.enabled; - const bool full_agc1_config_detected = - config.gain_controller1.enabled && - config.gain_controller1.analog_gain_controller.enabled && - config.gain_controller1.analog_gain_controller - .enable_digital_adaptive && - !config.gain_controller2.enabled; - const bool one_and_only_one_input_volume_controller = - hybrid_agc_config_detected != full_agc1_config_detected; - const bool agc2_input_volume_controller_enabled = - config.gain_controller2.enabled && - config.gain_controller2.input_volume_controller.enabled; - if (!one_and_only_one_input_volume_controller || - agc2_input_volume_controller_enabled) { - RTC_LOG(LS_ERROR) << "Cannot adjust AGC config (precondition failed)"; - if (!one_and_only_one_input_volume_controller) - RTC_LOG(LS_ERROR) - << "One and only one input volume controller must be enabled."; - if (agc2_input_volume_controller_enabled) - RTC_LOG(LS_ERROR) - << "The AGC2 input volume controller must be disabled."; - } else { - adjusted_config.gain_controller1.enabled = false; - adjusted_config.gain_controller1.analog_gain_controller.enabled = false; - - adjusted_config.gain_controller2.enabled = true; - adjusted_config.gain_controller2.input_volume_controller.enabled = true; - adjusted_config.gain_controller2.adaptive_digital = - experiment_params->agc2_config->adaptive_digital_controller; - adjusted_config.gain_controller2.adaptive_digital.enabled = true; - } - } - - return adjusted_config; -} - bool AudioProcessingImpl::UseApmVadSubModule( - const AudioProcessing::Config& config, - const absl::optional& experiment_params) { - // The VAD as an APM sub-module is needed only in one case, that is when TS - // and AGC2 are both enabled and when the AGC2 experiment is running and its - // parameters require to fully switch the gain control to AGC2. - return config.transient_suppression.enabled && - config.gain_controller2.enabled && - (config.gain_controller2.input_volume_controller.enabled || - config.gain_controller2.adaptive_digital.enabled) && - experiment_params.has_value() && - experiment_params->agc2_config.has_value(); + const AudioProcessing::Config& config) { + // Without "WebRTC-Audio-GainController2" always return false. + return false; } AudioProcessingImpl::SubmoduleStates::SubmoduleStates( @@ -666,14 +447,13 @@ AudioProcessingImpl::AudioProcessingImpl( : data_dumper_(new ApmDataDumper(instance_count_.fetch_add(1) + 1)), use_setup_specific_default_aec3_config_( UseSetupSpecificDefaultAec3Congfig()), - gain_controller2_experiment_params_(GetGainController2ExperimentParams()), transient_suppressor_vad_mode_(TransientSuppressor::VadMode::kDefault), capture_runtime_settings_(RuntimeSettingQueueSize()), render_runtime_settings_(RuntimeSettingQueueSize()), capture_runtime_settings_enqueuer_(&capture_runtime_settings_), render_runtime_settings_enqueuer_(&render_runtime_settings_), echo_control_factory_(std::move(echo_control_factory)), - config_(AdjustConfig(config, gain_controller2_experiment_params_)), + config_(config), submodule_states_(!!capture_post_processor, !!render_pre_processor, !!capture_analyzer), @@ -908,52 +688,44 @@ void AudioProcessingImpl::ApplyConfig(const AudioProcessing::Config& config) { MutexLock lock_render(&mutex_render_); MutexLock lock_capture(&mutex_capture_); - const auto adjusted_config = - AdjustConfig(config, gain_controller2_experiment_params_); - RTC_LOG(LS_INFO) << "AudioProcessing::ApplyConfig: " - << adjusted_config.ToString(); + RTC_LOG(LS_INFO) << "AudioProcessing::ApplyConfig: " << config.ToString(); const bool pipeline_config_changed = config_.pipeline.multi_channel_render != - adjusted_config.pipeline.multi_channel_render || + config.pipeline.multi_channel_render || config_.pipeline.multi_channel_capture != - adjusted_config.pipeline.multi_channel_capture || + config.pipeline.multi_channel_capture || config_.pipeline.maximum_internal_processing_rate != - adjusted_config.pipeline.maximum_internal_processing_rate || + config.pipeline.maximum_internal_processing_rate || config_.pipeline.capture_downmix_method != - adjusted_config.pipeline.capture_downmix_method; + config.pipeline.capture_downmix_method; const bool aec_config_changed = - config_.echo_canceller.enabled != - adjusted_config.echo_canceller.enabled || - config_.echo_canceller.mobile_mode != - adjusted_config.echo_canceller.mobile_mode; + config_.echo_canceller.enabled != config.echo_canceller.enabled || + config_.echo_canceller.mobile_mode != config.echo_canceller.mobile_mode; const bool agc1_config_changed = - config_.gain_controller1 != adjusted_config.gain_controller1; + config_.gain_controller1 != config.gain_controller1; const bool agc2_config_changed = - config_.gain_controller2 != adjusted_config.gain_controller2; + config_.gain_controller2 != config.gain_controller2; const bool ns_config_changed = - config_.noise_suppression.enabled != - adjusted_config.noise_suppression.enabled || - config_.noise_suppression.level != - adjusted_config.noise_suppression.level; + config_.noise_suppression.enabled != config.noise_suppression.enabled || + config_.noise_suppression.level != config.noise_suppression.level; const bool ts_config_changed = config_.transient_suppression.enabled != - adjusted_config.transient_suppression.enabled; + config.transient_suppression.enabled; const bool pre_amplifier_config_changed = - config_.pre_amplifier.enabled != adjusted_config.pre_amplifier.enabled || + config_.pre_amplifier.enabled != config.pre_amplifier.enabled || config_.pre_amplifier.fixed_gain_factor != - adjusted_config.pre_amplifier.fixed_gain_factor; + config.pre_amplifier.fixed_gain_factor; const bool gain_adjustment_config_changed = - config_.capture_level_adjustment != - adjusted_config.capture_level_adjustment; + config_.capture_level_adjustment != config.capture_level_adjustment; - config_ = adjusted_config; + config_ = config; if (aec_config_changed) { InitializeEchoController(); @@ -2157,7 +1929,7 @@ void AudioProcessingImpl::InitializeTransientSuppressor() { const TransientSuppressor::VadMode previous_vad_mode = transient_suppressor_vad_mode_; transient_suppressor_vad_mode_ = TransientSuppressor::VadMode::kDefault; - if (UseApmVadSubModule(config_, gain_controller2_experiment_params_)) { + if (UseApmVadSubModule(config_)) { transient_suppressor_vad_mode_ = TransientSuppressor::VadMode::kRnnVad; } const bool vad_mode_changed = @@ -2365,20 +2137,13 @@ void AudioProcessingImpl::InitializeGainController2() { submodules_.gain_controller2.reset(); return; } - // Override the input volume controller configuration if the AGC2 experiment - // is running and its parameters require to fully switch the gain control to + // Input volume controller configuration if the AGC2 is running + // and its parameters require to fully switch the gain control to // AGC2. - const bool input_volume_controller_config_overridden = - gain_controller2_experiment_params_.has_value() && - gain_controller2_experiment_params_->agc2_config.has_value(); const InputVolumeController::Config input_volume_controller_config = - input_volume_controller_config_overridden - ? gain_controller2_experiment_params_->agc2_config - ->input_volume_controller - : InputVolumeController::Config{}; + InputVolumeController::Config{}; // If the APM VAD sub-module is not used, let AGC2 use its internal VAD. - const bool use_internal_vad = - !UseApmVadSubModule(config_, gain_controller2_experiment_params_); + const bool use_internal_vad = !UseApmVadSubModule(config_); submodules_.gain_controller2 = std::make_unique( config_.gain_controller2, input_volume_controller_config, proc_fullband_sample_rate_hz(), num_output_channels(), use_internal_vad); @@ -2387,7 +2152,7 @@ void AudioProcessingImpl::InitializeGainController2() { } void AudioProcessingImpl::InitializeVoiceActivityDetector() { - if (!UseApmVadSubModule(config_, gain_controller2_experiment_params_)) { + if (!UseApmVadSubModule(config_)) { submodules_.voice_activity_detector.reset(); return; } diff --git a/modules/audio_processing/audio_processing_impl.h b/modules/audio_processing/audio_processing_impl.h index 51b9ffdaea..f03e27f5f0 100644 --- a/modules/audio_processing/audio_processing_impl.h +++ b/modules/audio_processing/audio_processing_impl.h @@ -163,9 +163,6 @@ class AudioProcessingImpl : public AudioProcessing { ReinitializeTransientSuppressor); FRIEND_TEST_ALL_PREFIXES(ApmWithSubmodulesExcludedTest, BitexactWithDisabledModules); - FRIEND_TEST_ALL_PREFIXES( - AudioProcessingImplGainController2FieldTrialParametrizedTest, - ConfigAdjustedWhenExperimentEnabled); void set_stream_analog_level_locked(int level) RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_capture_); @@ -194,46 +191,9 @@ class AudioProcessingImpl : public AudioProcessing { static std::atomic instance_count_; const bool use_setup_specific_default_aec3_config_; - // Parameters for the "GainController2" experiment which determines whether - // the following APM sub-modules are created and, if so, their configurations: - // AGC2 (`gain_controller2`), AGC1 (`gain_control`, `agc_manager`) and TS - // (`transient_suppressor`). - // TODO(bugs.webrtc.org/7494): Remove when the "WebRTC-Audio-GainController2" - // field trial is removed. - struct GainController2ExperimentParams { - struct Agc2Config { - InputVolumeController::Config input_volume_controller; - AudioProcessing::Config::GainController2::AdaptiveDigital - adaptive_digital_controller; - }; - // When `agc2_config` is specified, all gain control switches to AGC2 and - // the configuration is overridden. - absl::optional agc2_config; - // When true, the transient suppressor submodule is never created regardless - // of the APM configuration. - bool disallow_transient_suppressor_usage; - }; - // Specified when the "WebRTC-Audio-GainController2" field trial is specified. - // TODO(bugs.webrtc.org/7494): Remove when the "WebRTC-Audio-GainController2" - // field trial is removed. - const absl::optional - gain_controller2_experiment_params_; - - // Parses the "WebRTC-Audio-GainController2" field trial. If disabled, returns - // an unspecified value. - static absl::optional - GetGainController2ExperimentParams(); - - // When `experiment_params` is specified, returns an APM configuration - // modified according to the experiment parameters. Otherwise returns - // `config`. - static AudioProcessing::Config AdjustConfig( - const AudioProcessing::Config& config, - const absl::optional& experiment_params); - // Returns true if the APM VAD sub-module should be used. - static bool UseApmVadSubModule( - const AudioProcessing::Config& config, - const absl::optional& experiment_params); + // Deprecated. + // TODO(bugs.webrtc.org/7494): Remove. + static bool UseApmVadSubModule(const AudioProcessing::Config& config); TransientSuppressor::VadMode transient_suppressor_vad_mode_; diff --git a/modules/audio_processing/audio_processing_impl_unittest.cc b/modules/audio_processing/audio_processing_impl_unittest.cc index 8bcc94c9c2..b6676b6687 100644 --- a/modules/audio_processing/audio_processing_impl_unittest.cc +++ b/modules/audio_processing/audio_processing_impl_unittest.cc @@ -520,64 +520,6 @@ TEST(AudioProcessingImplTest, apm->ProcessStream(frame.data(), stream_config, stream_config, frame.data()); } -TEST(AudioProcessingImplTest, - ProcessWithAgc2AndTransientSuppressorVadModeDefault) { - webrtc::test::ScopedFieldTrials field_trials( - "WebRTC-Audio-GainController2/Disabled/"); - auto apm = AudioProcessingBuilder() - .SetConfig({.gain_controller1{.enabled = false}}) - .Create(); - ASSERT_EQ(apm->Initialize(), AudioProcessing::kNoError); - webrtc::AudioProcessing::Config apm_config; - apm_config.gain_controller1.enabled = false; - apm_config.gain_controller2.enabled = true; - apm_config.gain_controller2.adaptive_digital.enabled = true; - apm_config.transient_suppression.enabled = true; - apm->ApplyConfig(apm_config); - constexpr int kSampleRateHz = 48000; - constexpr int kNumChannels = 1; - std::array buffer; - float* channel_pointers[] = {buffer.data()}; - StreamConfig stream_config(/*sample_rate_hz=*/kSampleRateHz, - /*num_channels=*/kNumChannels); - Random random_generator(2341U); - constexpr int kFramesToProcess = 10; - for (int i = 0; i < kFramesToProcess; ++i) { - RandomizeSampleVector(&random_generator, buffer); - ASSERT_EQ(apm->ProcessStream(channel_pointers, stream_config, stream_config, - channel_pointers), - kNoErr); - } -} - -TEST(AudioProcessingImplTest, - ProcessWithAgc2AndTransientSuppressorVadModeRnnVad) { - webrtc::test::ScopedFieldTrials field_trials( - "WebRTC-Audio-GainController2/Enabled,switch_to_agc2:true/"); - rtc::scoped_refptr apm = AudioProcessingBuilder().Create(); - ASSERT_EQ(apm->Initialize(), AudioProcessing::kNoError); - webrtc::AudioProcessing::Config apm_config; - apm_config.gain_controller1.enabled = false; - apm_config.gain_controller2.enabled = true; - apm_config.gain_controller2.adaptive_digital.enabled = true; - apm_config.transient_suppression.enabled = true; - apm->ApplyConfig(apm_config); - constexpr int kSampleRateHz = 48000; - constexpr int kNumChannels = 1; - std::array buffer; - float* channel_pointers[] = {buffer.data()}; - StreamConfig stream_config(/*sample_rate_hz=*/kSampleRateHz, - /*num_channels=*/kNumChannels); - Random random_generator(2341U); - constexpr int kFramesToProcess = 10; - for (int i = 0; i < kFramesToProcess; ++i) { - RandomizeSampleVector(&random_generator, buffer); - ASSERT_EQ(apm->ProcessStream(channel_pointers, stream_config, stream_config, - channel_pointers), - kNoErr); - } -} - TEST(AudioProcessingImplTest, EchoControllerObservesPlayoutVolumeChange) { // Tests that the echo controller observes an echo path gain change when a // playout volume change is reported. @@ -1060,320 +1002,11 @@ TEST(AudioProcessingImplTest, EXPECT_EQ(ProcessInputVolume(*apm, kOneFrame, /*initial_volume=*/135), 135); } -TEST(AudioProcessingImplTest, - Agc2FieldTrialDoNotSwitchToFullAgc2WhenNoAgcIsActive) { - constexpr AudioProcessing::Config kOriginal{ - .gain_controller1{.enabled = false}, - .gain_controller2{.enabled = false}, - }; - webrtc::test::ScopedFieldTrials field_trials( - "WebRTC-Audio-GainController2/Enabled,switch_to_agc2:true/"); - - // Test config application via `AudioProcessing` ctor. - auto adjusted = - AudioProcessingBuilder().SetConfig(kOriginal).Create()->GetConfig(); - EXPECT_EQ(adjusted.gain_controller1, kOriginal.gain_controller1); - EXPECT_EQ(adjusted.gain_controller2, kOriginal.gain_controller2); - - // Test config application via `AudioProcessing::ApplyConfig()`. - auto apm = AudioProcessingBuilder().Create(); - apm->ApplyConfig(kOriginal); - adjusted = apm->GetConfig(); - EXPECT_EQ(adjusted.gain_controller1, kOriginal.gain_controller1); - EXPECT_EQ(adjusted.gain_controller2, kOriginal.gain_controller2); -} - -TEST(AudioProcessingImplTest, - Agc2FieldTrialDoNotSwitchToFullAgc2WithAgc1Agc2InputVolumeControllers) { - constexpr AudioProcessing::Config kOriginal{ - .gain_controller1{.enabled = true, - .analog_gain_controller{.enabled = true}}, - .gain_controller2{.enabled = true, - .input_volume_controller{.enabled = true}}, - }; - webrtc::test::ScopedFieldTrials field_trials( - "WebRTC-Audio-GainController2/Enabled,switch_to_agc2:true/"); - - // Test config application via `AudioProcessing` ctor. - auto adjusted = - AudioProcessingBuilder().SetConfig(kOriginal).Create()->GetConfig(); - EXPECT_EQ(adjusted.gain_controller1, kOriginal.gain_controller1); - EXPECT_EQ(adjusted.gain_controller2, kOriginal.gain_controller2); - - // Test config application via `AudioProcessing::ApplyConfig()`. - auto apm = AudioProcessingBuilder().Create(); - apm->ApplyConfig(kOriginal); - adjusted = apm->GetConfig(); - EXPECT_EQ(adjusted.gain_controller1, kOriginal.gain_controller1); - EXPECT_EQ(adjusted.gain_controller2, kOriginal.gain_controller2); -} - -class Agc2FieldTrialParametrizedTest +class Agc2ParametrizedTest : public ::testing::TestWithParam {}; -TEST_P(Agc2FieldTrialParametrizedTest, DoNotChangeConfigIfDisabled) { - const AudioProcessing::Config original = GetParam(); - webrtc::test::ScopedFieldTrials field_trials( - "WebRTC-Audio-GainController2/Disabled/"); - - // Test config application via `AudioProcessing` ctor. - auto adjusted = - AudioProcessingBuilder().SetConfig(original).Create()->GetConfig(); - EXPECT_EQ(adjusted.gain_controller1, original.gain_controller1); - EXPECT_EQ(adjusted.gain_controller2, original.gain_controller2); - - // Test config application via `AudioProcessing::ApplyConfig()`. - auto apm = AudioProcessingBuilder().Create(); - apm->ApplyConfig(original); - adjusted = apm->GetConfig(); - EXPECT_EQ(adjusted.gain_controller1, original.gain_controller1); - EXPECT_EQ(adjusted.gain_controller2, original.gain_controller2); -} - -TEST_P(Agc2FieldTrialParametrizedTest, DoNotChangeConfigIfNoOverride) { - const AudioProcessing::Config original = GetParam(); - webrtc::test::ScopedFieldTrials field_trials( - "WebRTC-Audio-GainController2/Enabled," - "switch_to_agc2:false," - "disallow_transient_suppressor_usage:false/"); - - // Test config application via `AudioProcessing` ctor. - auto adjusted = - AudioProcessingBuilder().SetConfig(original).Create()->GetConfig(); - EXPECT_EQ(adjusted.gain_controller1, original.gain_controller1); - EXPECT_EQ(adjusted.gain_controller2, original.gain_controller2); - - // Test config application via `AudioProcessing::ApplyConfig()`. - auto apm = AudioProcessingBuilder().Create(); - apm->ApplyConfig(original); - adjusted = apm->GetConfig(); - EXPECT_EQ(adjusted.gain_controller1, original.gain_controller1); - EXPECT_EQ(adjusted.gain_controller2, original.gain_controller2); -} - -TEST_P(Agc2FieldTrialParametrizedTest, DoNotSwitchToFullAgc2) { - const AudioProcessing::Config original = GetParam(); - webrtc::test::ScopedFieldTrials field_trials( - "WebRTC-Audio-GainController2/Enabled,switch_to_agc2:false/"); - - // Test config application via `AudioProcessing` ctor. - auto adjusted = - AudioProcessingBuilder().SetConfig(original).Create()->GetConfig(); - EXPECT_EQ(adjusted.gain_controller1, original.gain_controller1); - EXPECT_EQ(adjusted.gain_controller2, original.gain_controller2); - - // Test config application via `AudioProcessing::ApplyConfig()`. - auto apm = AudioProcessingBuilder().Create(); - apm->ApplyConfig(original); - adjusted = apm->GetConfig(); - EXPECT_EQ(adjusted.gain_controller1, original.gain_controller1); - EXPECT_EQ(adjusted.gain_controller2, original.gain_controller2); -} - -TEST_P(Agc2FieldTrialParametrizedTest, SwitchToFullAgc2) { - const AudioProcessing::Config original = GetParam(); - webrtc::test::ScopedFieldTrials field_trials( - "WebRTC-Audio-GainController2/Enabled,switch_to_agc2:true/"); - - // Test config application via `AudioProcessing` ctor. - auto adjusted = - AudioProcessingBuilder().SetConfig(original).Create()->GetConfig(); - EXPECT_FALSE(adjusted.gain_controller1.enabled); - EXPECT_TRUE(adjusted.gain_controller2.enabled); - EXPECT_TRUE(adjusted.gain_controller2.input_volume_controller.enabled); - EXPECT_TRUE(adjusted.gain_controller2.adaptive_digital.enabled); - - // Test config application via `AudioProcessing::ApplyConfig()`. - auto apm = AudioProcessingBuilder().Create(); - apm->ApplyConfig(original); - adjusted = apm->GetConfig(); - EXPECT_FALSE(adjusted.gain_controller1.enabled); - EXPECT_TRUE(adjusted.gain_controller2.enabled); - EXPECT_TRUE(adjusted.gain_controller2.input_volume_controller.enabled); - EXPECT_TRUE(adjusted.gain_controller2.adaptive_digital.enabled); -} - -TEST_P(Agc2FieldTrialParametrizedTest, - SwitchToFullAgc2AndOverrideInputVolumeControllerParameters) { - const AudioProcessing::Config original = GetParam(); - webrtc::test::ScopedFieldTrials field_trials( - "WebRTC-Audio-GainController2/Enabled,switch_to_agc2:true," - "min_input_volume:123," - "clipped_level_min:20," - "clipped_level_step:30," - "clipped_ratio_threshold:0.4," - "clipped_wait_frames:50," - "enable_clipping_predictor:true," - "target_range_max_dbfs:-6," - "target_range_min_dbfs:-70," - "update_input_volume_wait_frames:80," - "speech_probability_threshold:0.9," - "speech_ratio_threshold:1.0/"); - - // Test config application via `AudioProcessing` ctor. - auto adjusted = - AudioProcessingBuilder().SetConfig(original).Create()->GetConfig(); - EXPECT_FALSE(adjusted.gain_controller1.enabled); - EXPECT_TRUE(adjusted.gain_controller2.enabled); - EXPECT_TRUE(adjusted.gain_controller2.input_volume_controller.enabled); - EXPECT_TRUE(adjusted.gain_controller2.adaptive_digital.enabled); - - // Test config application via `AudioProcessing::ApplyConfig()`. - auto apm = AudioProcessingBuilder().Create(); - apm->ApplyConfig(original); - adjusted = apm->GetConfig(); - EXPECT_FALSE(adjusted.gain_controller1.enabled); - EXPECT_TRUE(adjusted.gain_controller2.enabled); - EXPECT_TRUE(adjusted.gain_controller2.input_volume_controller.enabled); - EXPECT_TRUE(adjusted.gain_controller2.adaptive_digital.enabled); -} - -TEST_P(Agc2FieldTrialParametrizedTest, - SwitchToFullAgc2AndOverrideAdaptiveDigitalControllerParameters) { - const AudioProcessing::Config original = GetParam(); - webrtc::test::ScopedFieldTrials field_trials( - "WebRTC-Audio-GainController2/Enabled,switch_to_agc2:true," - "headroom_db:10," - "max_gain_db:20," - "initial_gain_db:7," - "max_gain_change_db_per_second:5," - "max_output_noise_level_dbfs:-40/"); - - // Test config application via `AudioProcessing` ctor. - auto adjusted = - AudioProcessingBuilder().SetConfig(original).Create()->GetConfig(); - EXPECT_FALSE(adjusted.gain_controller1.enabled); - EXPECT_TRUE(adjusted.gain_controller2.enabled); - EXPECT_TRUE(adjusted.gain_controller2.input_volume_controller.enabled); - EXPECT_TRUE(adjusted.gain_controller2.adaptive_digital.enabled); - ASSERT_NE(adjusted.gain_controller2.adaptive_digital, - original.gain_controller2.adaptive_digital); - EXPECT_EQ(adjusted.gain_controller2.adaptive_digital.headroom_db, 10); - EXPECT_EQ(adjusted.gain_controller2.adaptive_digital.max_gain_db, 20); - EXPECT_EQ(adjusted.gain_controller2.adaptive_digital.initial_gain_db, 7); - EXPECT_EQ( - adjusted.gain_controller2.adaptive_digital.max_gain_change_db_per_second, - 5); - EXPECT_EQ( - adjusted.gain_controller2.adaptive_digital.max_output_noise_level_dbfs, - -40); - - // Test config application via `AudioProcessing::ApplyConfig()`. - auto apm = AudioProcessingBuilder().Create(); - apm->ApplyConfig(original); - adjusted = apm->GetConfig(); - EXPECT_FALSE(adjusted.gain_controller1.enabled); - EXPECT_TRUE(adjusted.gain_controller2.enabled); - EXPECT_TRUE(adjusted.gain_controller2.input_volume_controller.enabled); - EXPECT_TRUE(adjusted.gain_controller2.adaptive_digital.enabled); - ASSERT_NE(adjusted.gain_controller2.adaptive_digital, - original.gain_controller2.adaptive_digital); - EXPECT_EQ(adjusted.gain_controller2.adaptive_digital.headroom_db, 10); - EXPECT_EQ(adjusted.gain_controller2.adaptive_digital.max_gain_db, 20); - EXPECT_EQ(adjusted.gain_controller2.adaptive_digital.initial_gain_db, 7); - EXPECT_EQ( - adjusted.gain_controller2.adaptive_digital.max_gain_change_db_per_second, - 5); - EXPECT_EQ( - adjusted.gain_controller2.adaptive_digital.max_output_noise_level_dbfs, - -40); -} - -TEST_P(Agc2FieldTrialParametrizedTest, ProcessSucceedsWithTs) { - AudioProcessing::Config config = GetParam(); - if (!config.transient_suppression.enabled) { - GTEST_SKIP() << "TS is disabled, skip."; - } - - webrtc::test::ScopedFieldTrials field_trials( - "WebRTC-Audio-GainController2/Disabled/"); - auto apm = AudioProcessingBuilder().SetConfig(config).Create(); - - constexpr int kSampleRateHz = 48000; - constexpr int kNumChannels = 1; - std::array buffer; - float* channel_pointers[] = {buffer.data()}; - StreamConfig stream_config(kSampleRateHz, kNumChannels); - Random random_generator(2341U); - constexpr int kFramesToProcess = 10; - int volume = 100; - for (int i = 0; i < kFramesToProcess; ++i) { - SCOPED_TRACE(i); - RandomizeSampleVector(&random_generator, buffer); - apm->set_stream_analog_level(volume); - ASSERT_EQ(apm->ProcessStream(channel_pointers, stream_config, stream_config, - channel_pointers), - kNoErr); - volume = apm->recommended_stream_analog_level(); - } -} - -TEST_P(Agc2FieldTrialParametrizedTest, ProcessSucceedsWithoutTs) { - webrtc::test::ScopedFieldTrials field_trials( - "WebRTC-Audio-GainController2/Enabled," - "switch_to_agc2:false," - "disallow_transient_suppressor_usage:true/"); +TEST_P(Agc2ParametrizedTest, ProcessSucceedsWhenOneAgcEnabled) { auto apm = AudioProcessingBuilder().SetConfig(GetParam()).Create(); - - constexpr int kSampleRateHz = 48000; - constexpr int kNumChannels = 1; - std::array buffer; - float* channel_pointers[] = {buffer.data()}; - StreamConfig stream_config(kSampleRateHz, kNumChannels); - Random random_generator(2341U); - constexpr int kFramesToProcess = 10; - int volume = 100; - for (int i = 0; i < kFramesToProcess; ++i) { - SCOPED_TRACE(i); - RandomizeSampleVector(&random_generator, buffer); - apm->set_stream_analog_level(volume); - ASSERT_EQ(apm->ProcessStream(channel_pointers, stream_config, stream_config, - channel_pointers), - kNoErr); - volume = apm->recommended_stream_analog_level(); - } -} - -TEST_P(Agc2FieldTrialParametrizedTest, - ProcessSucceedsWhenSwitchToFullAgc2WithTs) { - AudioProcessing::Config config = GetParam(); - if (!config.transient_suppression.enabled) { - GTEST_SKIP() << "TS is disabled, skip."; - } - - webrtc::test::ScopedFieldTrials field_trials( - "WebRTC-Audio-GainController2/Enabled," - "switch_to_agc2:true," - "disallow_transient_suppressor_usage:false/"); - auto apm = AudioProcessingBuilder().SetConfig(config).Create(); - - constexpr int kSampleRateHz = 48000; - constexpr int kNumChannels = 1; - std::array buffer; - float* channel_pointers[] = {buffer.data()}; - StreamConfig stream_config(kSampleRateHz, kNumChannels); - Random random_generator(2341U); - constexpr int kFramesToProcess = 10; - int volume = 100; - for (int i = 0; i < kFramesToProcess; ++i) { - SCOPED_TRACE(i); - RandomizeSampleVector(&random_generator, buffer); - apm->set_stream_analog_level(volume); - ASSERT_EQ(apm->ProcessStream(channel_pointers, stream_config, stream_config, - channel_pointers), - kNoErr); - volume = apm->recommended_stream_analog_level(); - } -} - -TEST_P(Agc2FieldTrialParametrizedTest, - ProcessSucceedsWhenSwitchToFullAgc2WithoutTs) { - webrtc::test::ScopedFieldTrials field_trials( - "WebRTC-Audio-GainController2/Enabled," - "switch_to_agc2:true," - "disallow_transient_suppressor_usage:true/"); - auto apm = AudioProcessingBuilder().SetConfig(GetParam()).Create(); - constexpr int kSampleRateHz = 48000; constexpr int kNumChannels = 1; std::array buffer; @@ -1395,7 +1028,7 @@ TEST_P(Agc2FieldTrialParametrizedTest, INSTANTIATE_TEST_SUITE_P( AudioProcessingImplTest, - Agc2FieldTrialParametrizedTest, + Agc2ParametrizedTest, ::testing::Values( // Full AGC1, TS disabled. AudioProcessing::Config{ @@ -1430,6 +1063,26 @@ INSTANTIATE_TEST_SUITE_P( .analog_gain_controller = {.enabled = true, .enable_digital_adaptive = false}}, .gain_controller2 = {.enabled = true, + .adaptive_digital = {.enabled = true}}}, + // Full AGC2, TS disabled. + AudioProcessing::Config{ + .transient_suppression = {.enabled = false}, + .gain_controller1 = + {.enabled = false, + .analog_gain_controller = {.enabled = false, + .enable_digital_adaptive = false}}, + .gain_controller2 = {.enabled = true, + .input_volume_controller = {.enabled = true}, + .adaptive_digital = {.enabled = true}}}, + // Full AGC2, TS enabled. + AudioProcessing::Config{ + .transient_suppression = {.enabled = true}, + .gain_controller1 = + {.enabled = false, + .analog_gain_controller = {.enabled = false, + .enable_digital_adaptive = false}}, + .gain_controller2 = {.enabled = true, + .input_volume_controller = {.enabled = true}, .adaptive_digital = {.enabled = true}}})); TEST(AudioProcessingImplTest, CanDisableTransientSuppressor) { @@ -1464,100 +1117,4 @@ TEST(AudioProcessingImplTest, CanEnableTs) { EXPECT_TRUE(adjusted.transient_suppression.enabled); } -TEST(AudioProcessingImplTest, CanDisableTsWithAgc2FieldTrialDisabled) { - constexpr AudioProcessing::Config kOriginal = { - .transient_suppression = {.enabled = false}}; - webrtc::test::ScopedFieldTrials field_trials( - "WebRTC-Audio-GainController2/Disabled/"); - - // Test config application via `AudioProcessing` ctor. - auto adjusted = - AudioProcessingBuilder().SetConfig(kOriginal).Create()->GetConfig(); - EXPECT_FALSE(adjusted.transient_suppression.enabled); - - // Test config application via `AudioProcessing::ApplyConfig()`. - auto apm = AudioProcessingBuilder().Create(); - apm->ApplyConfig(kOriginal); - adjusted = apm->GetConfig(); - EXPECT_FALSE(apm->GetConfig().transient_suppression.enabled); -} - -TEST(AudioProcessingImplTest, CanEnableTsWithAgc2FieldTrialDisabled) { - constexpr AudioProcessing::Config kOriginal = { - .transient_suppression = {.enabled = true}}; - webrtc::test::ScopedFieldTrials field_trials( - "WebRTC-Audio-GainController2/Disabled/"); - - // Test config application via `AudioProcessing` ctor. - auto adjusted = - AudioProcessingBuilder().SetConfig(kOriginal).Create()->GetConfig(); - EXPECT_TRUE(adjusted.transient_suppression.enabled); - - // Test config application via `AudioProcessing::ApplyConfig()`. - auto apm = AudioProcessingBuilder().Create(); - apm->ApplyConfig(kOriginal); - adjusted = apm->GetConfig(); - EXPECT_TRUE(adjusted.transient_suppression.enabled); -} - -TEST(AudioProcessingImplTest, - CanDisableTsWithAgc2FieldTrialEnabledAndUsageAllowed) { - constexpr AudioProcessing::Config kOriginal = { - .transient_suppression = {.enabled = false}}; - webrtc::test::ScopedFieldTrials field_trials( - "WebRTC-Audio-GainController2/Enabled," - "disallow_transient_suppressor_usage:false/"); - - // Test config application via `AudioProcessing` ctor. - auto adjusted = - AudioProcessingBuilder().SetConfig(kOriginal).Create()->GetConfig(); - EXPECT_FALSE(adjusted.transient_suppression.enabled); - - // Test config application via `AudioProcessing::ApplyConfig()`. - auto apm = AudioProcessingBuilder().Create(); - apm->ApplyConfig(kOriginal); - adjusted = apm->GetConfig(); - EXPECT_FALSE(adjusted.transient_suppression.enabled); -} - -TEST(AudioProcessingImplTest, - CanEnableTsWithAgc2FieldTrialEnabledAndUsageAllowed) { - constexpr AudioProcessing::Config kOriginal = { - .transient_suppression = {.enabled = true}}; - webrtc::test::ScopedFieldTrials field_trials( - "WebRTC-Audio-GainController2/Enabled," - "disallow_transient_suppressor_usage:false/"); - - // Test config application via `AudioProcessing` ctor. - auto adjusted = - AudioProcessingBuilder().SetConfig(kOriginal).Create()->GetConfig(); - EXPECT_TRUE(adjusted.transient_suppression.enabled); - - // Test config application via `AudioProcessing::ApplyConfig()`. - auto apm = AudioProcessingBuilder().Create(); - apm->ApplyConfig(kOriginal); - adjusted = apm->GetConfig(); - EXPECT_TRUE(adjusted.transient_suppression.enabled); -} - -TEST(AudioProcessingImplTest, - CannotEnableTsWithAgc2FieldTrialEnabledAndUsageDisallowed) { - constexpr AudioProcessing::Config kOriginal = { - .transient_suppression = {.enabled = true}}; - webrtc::test::ScopedFieldTrials field_trials( - "WebRTC-Audio-GainController2/Enabled," - "disallow_transient_suppressor_usage:true/"); - - // Test config application via `AudioProcessing` ctor. - auto adjusted = - AudioProcessingBuilder().SetConfig(kOriginal).Create()->GetConfig(); - EXPECT_FALSE(adjusted.transient_suppression.enabled); - - // Test config application via `AudioProcessing::ApplyConfig()`. - auto apm = AudioProcessingBuilder().Create(); - apm->ApplyConfig(kOriginal); - adjusted = apm->GetConfig(); - EXPECT_FALSE(apm->GetConfig().transient_suppression.enabled); -} - } // namespace webrtc