diff --git a/modules/audio_processing/BUILD.gn b/modules/audio_processing/BUILD.gn index f8fab87604..1d742c095a 100644 --- a/modules/audio_processing/BUILD.gn +++ b/modules/audio_processing/BUILD.gn @@ -108,13 +108,14 @@ rtc_library("gain_controller2") { ":apm_logging", ":audio_buffer", ":audio_frame_view", + "../../api:field_trials_view", "../../api/audio:audio_frame_api", "../../api/audio:audio_processing", + "../../api/environment", "../../common_audio", "../../rtc_base:checks", "../../rtc_base:logging", "../../rtc_base:stringutils", - "../../system_wrappers:field_trial", "agc2:adaptive_digital_gain_controller", "agc2:common", "agc2:cpu_features", diff --git a/modules/audio_processing/audio_processing_impl.cc b/modules/audio_processing/audio_processing_impl.cc index 44ee9c903a..a59d1b7f9d 100644 --- a/modules/audio_processing/audio_processing_impl.cc +++ b/modules/audio_processing/audio_processing_impl.cc @@ -431,7 +431,8 @@ AudioProcessingImpl::AudioProcessingImpl( std::unique_ptr echo_control_factory, rtc::scoped_refptr echo_detector, std::unique_ptr capture_analyzer) - : data_dumper_(new ApmDataDumper(instance_count_.fetch_add(1) + 1)), + : env_(env), + data_dumper_(new ApmDataDumper(instance_count_.fetch_add(1) + 1)), use_setup_specific_default_aec3_config_( UseSetupSpecificDefaultAec3Congfig(env.field_trials())), capture_runtime_settings_(RuntimeSettingQueueSize()), @@ -2038,7 +2039,7 @@ void AudioProcessingImpl::InitializeGainController2() { const InputVolumeController::Config input_volume_controller_config = InputVolumeController::Config{}; submodules_.gain_controller2 = std::make_unique( - config_.gain_controller2, input_volume_controller_config, + env_, config_.gain_controller2, input_volume_controller_config, proc_fullband_sample_rate_hz(), num_output_channels(), /*use_internal_vad=*/true); submodules_.gain_controller2->SetCaptureOutputUsed( diff --git a/modules/audio_processing/audio_processing_impl.h b/modules/audio_processing/audio_processing_impl.h index b3d5548aef..6026ade61b 100644 --- a/modules/audio_processing/audio_processing_impl.h +++ b/modules/audio_processing/audio_processing_impl.h @@ -178,6 +178,7 @@ class AudioProcessingImpl : public AudioProcessing { SwapQueue& runtime_settings_; }; + const Environment env_; const std::unique_ptr data_dumper_; static std::atomic instance_count_; const bool use_setup_specific_default_aec3_config_; diff --git a/modules/audio_processing/gain_controller2.cc b/modules/audio_processing/gain_controller2.cc index b8f72ce307..6e4a251456 100644 --- a/modules/audio_processing/gain_controller2.cc +++ b/modules/audio_processing/gain_controller2.cc @@ -14,6 +14,8 @@ #include #include "api/audio/audio_frame.h" +#include "api/environment/environment.h" +#include "api/field_trials_view.h" #include "common_audio/include/audio_util.h" #include "modules/audio_processing/agc2/agc2_common.h" #include "modules/audio_processing/agc2/cpu_features.h" @@ -23,7 +25,6 @@ #include "rtc_base/checks.h" #include "rtc_base/logging.h" #include "rtc_base/strings/string_builder.h" -#include "system_wrappers/include/field_trial.h" namespace webrtc { namespace { @@ -37,15 +38,16 @@ constexpr int kLogLimiterStatsPeriodNumFrames = kLogLimiterStatsPeriodMs / kFrameLengthMs; // Detects the available CPU features and applies any kill-switches. -AvailableCpuFeatures GetAllowedCpuFeatures() { +AvailableCpuFeatures GetAllowedCpuFeatures( + const FieldTrialsView& field_trials) { AvailableCpuFeatures features = GetAvailableCpuFeatures(); - if (field_trial::IsEnabled("WebRTC-Agc2SimdSse2KillSwitch")) { + if (field_trials.IsEnabled("WebRTC-Agc2SimdSse2KillSwitch")) { features.sse2 = false; } - if (field_trial::IsEnabled("WebRTC-Agc2SimdAvx2KillSwitch")) { + if (field_trials.IsEnabled("WebRTC-Agc2SimdAvx2KillSwitch")) { features.avx2 = false; } - if (field_trial::IsEnabled("WebRTC-Agc2SimdNeonKillSwitch")) { + if (field_trials.IsEnabled("WebRTC-Agc2SimdNeonKillSwitch")) { features.neon = false; } return features; @@ -85,12 +87,13 @@ AudioLevels ComputeAudioLevels(DeinterleavedView frame, std::atomic GainController2::instance_count_(0); GainController2::GainController2( + const Environment& env, const Agc2Config& config, const InputVolumeControllerConfig& input_volume_controller_config, int sample_rate_hz, int num_channels, bool use_internal_vad) - : cpu_features_(GetAllowedCpuFeatures()), + : cpu_features_(GetAllowedCpuFeatures(env.field_trials())), data_dumper_(instance_count_.fetch_add(1) + 1), fixed_gain_applier_( /*hard_clip_samples=*/false, diff --git a/modules/audio_processing/gain_controller2.h b/modules/audio_processing/gain_controller2.h index d192a20970..5594e80b0d 100644 --- a/modules/audio_processing/gain_controller2.h +++ b/modules/audio_processing/gain_controller2.h @@ -16,6 +16,7 @@ #include #include "api/audio/audio_processing.h" +#include "api/environment/environment.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" @@ -38,6 +39,7 @@ class GainController2 { // Ctor. If `use_internal_vad` is true, an internal voice activity // detector is used for digital adaptive gain. GainController2( + const Environment& env, const AudioProcessing::Config::GainController2& config, const InputVolumeController::Config& input_volume_controller_config, int sample_rate_hz, diff --git a/modules/audio_processing/gain_controller2_unittest.cc b/modules/audio_processing/gain_controller2_unittest.cc index 0af83654e4..b4aeab046e 100644 --- a/modules/audio_processing/gain_controller2_unittest.cc +++ b/modules/audio_processing/gain_controller2_unittest.cc @@ -16,6 +16,8 @@ #include #include +#include "api/environment/environment.h" +#include "api/environment/environment_factory.h" #include "modules/audio_processing/agc2/agc2_testing_common.h" #include "modules/audio_processing/audio_buffer.h" #include "modules/audio_processing/test/audio_buffer_tools.h" @@ -72,10 +74,11 @@ std::unique_ptr CreateAgc2FixedDigitalMode( config.adaptive_digital.enabled = false; config.fixed_digital.gain_db = fixed_gain_db; EXPECT_TRUE(GainController2::Validate(config)); - return std::make_unique( - config, InputVolumeControllerConfig{}, sample_rate_hz, - /*num_channels=*/1, - /*use_internal_vad=*/true); + return std::make_unique(CreateEnvironment(), config, + InputVolumeControllerConfig{}, + sample_rate_hz, + /*num_channels=*/1, + /*use_internal_vad=*/true); } constexpr InputVolumeControllerConfig kTestInputVolumeControllerConfig{ @@ -174,7 +177,8 @@ TEST(GainController2, config.input_volume_controller.enabled = false; auto gain_controller = std::make_unique( - config, InputVolumeControllerConfig{}, kSampleRateHz, kNumChannels, + CreateEnvironment(), config, InputVolumeControllerConfig{}, kSampleRateHz, + kNumChannels, /*use_internal_vad=*/true); EXPECT_FALSE(gain_controller->recommended_input_volume().has_value()); @@ -206,7 +210,8 @@ TEST( config.input_volume_controller.enabled = false; auto gain_controller = std::make_unique( - config, kTestInputVolumeControllerConfig, kSampleRateHz, kNumChannels, + CreateEnvironment(), config, kTestInputVolumeControllerConfig, + kSampleRateHz, kNumChannels, /*use_internal_vad=*/true); EXPECT_FALSE(gain_controller->recommended_input_volume().has_value()); @@ -238,7 +243,8 @@ TEST(GainController2, config.adaptive_digital.enabled = true; auto gain_controller = std::make_unique( - config, InputVolumeControllerConfig{}, kSampleRateHz, kNumChannels, + CreateEnvironment(), config, InputVolumeControllerConfig{}, kSampleRateHz, + kNumChannels, /*use_internal_vad=*/true); EXPECT_FALSE(gain_controller->recommended_input_volume().has_value()); @@ -271,7 +277,8 @@ TEST( config.adaptive_digital.enabled = true; auto gain_controller = std::make_unique( - config, kTestInputVolumeControllerConfig, kSampleRateHz, kNumChannels, + CreateEnvironment(), config, kTestInputVolumeControllerConfig, + kSampleRateHz, kNumChannels, /*use_internal_vad=*/true); EXPECT_FALSE(gain_controller->recommended_input_volume().has_value()); @@ -292,7 +299,7 @@ TEST( // Checks that the default config is applied. TEST(GainController2, ApplyDefaultConfig) { auto gain_controller2 = std::make_unique( - Agc2Config{}, InputVolumeControllerConfig{}, + CreateEnvironment(), Agc2Config{}, InputVolumeControllerConfig{}, /*sample_rate_hz=*/16000, /*num_channels=*/2, /*use_internal_vad=*/true); EXPECT_TRUE(gain_controller2.get()); @@ -409,8 +416,9 @@ TEST(GainController2, CheckFinalGainWithAdaptiveDigitalController) { Agc2Config config; config.fixed_digital.gain_db = 0.0f; config.adaptive_digital.enabled = true; - GainController2 agc2(config, /*input_volume_controller_config=*/{}, - kSampleRateHz, kStereo, + GainController2 agc2(CreateEnvironment(), config, + /*input_volume_controller_config=*/{}, kSampleRateHz, + kStereo, /*use_internal_vad=*/true); test::InputAudioFile input_file( @@ -464,10 +472,10 @@ TEST(GainController2DeathTest, AudioBuffer audio_buffer(kSampleRateHz, kStereo, kSampleRateHz, kStereo, kSampleRateHz, kStereo); // Create AGC2 so that the interval VAD is also created. - GainController2 agc2(/*config=*/{.adaptive_digital = {.enabled = true}}, - /*input_volume_controller_config=*/{}, kSampleRateHz, - kStereo, - /*use_internal_vad=*/true); + GainController2 agc2( + CreateEnvironment(), /*config=*/{.adaptive_digital = {.enabled = true}}, + /*input_volume_controller_config=*/{}, kSampleRateHz, kStereo, + /*use_internal_vad=*/true); EXPECT_DEATH(agc2.Process(/*speech_probability=*/0.123f, /*input_volume_changed=*/false, &audio_buffer), @@ -483,13 +491,15 @@ TEST(GainController2, constexpr int kStereo = 2; // Create AGC2 enabling only the adaptive digital controller. + const Environment env = CreateEnvironment(); Agc2Config config; config.fixed_digital.gain_db = 0.0f; config.adaptive_digital.enabled = true; - GainController2 agc2(config, /*input_volume_controller_config=*/{}, + GainController2 agc2(env, config, /*input_volume_controller_config=*/{}, kSampleRateHz, kStereo, /*use_internal_vad=*/false); - GainController2 agc2_reference(config, /*input_volume_controller_config=*/{}, + GainController2 agc2_reference(env, config, + /*input_volume_controller_config=*/{}, kSampleRateHz, kStereo, /*use_internal_vad=*/true); @@ -554,13 +564,15 @@ TEST(GainController2, constexpr int kStereo = 2; // Create AGC2 enabling only the adaptive digital controller. + const Environment env = CreateEnvironment(); Agc2Config config; config.fixed_digital.gain_db = 0.0f; config.adaptive_digital.enabled = true; - GainController2 agc2(config, /*input_volume_controller_config=*/{}, + GainController2 agc2(env, config, /*input_volume_controller_config=*/{}, kSampleRateHz, kStereo, /*use_internal_vad=*/false); - GainController2 agc2_reference(config, /*input_volume_controller_config=*/{}, + GainController2 agc2_reference(env, config, + /*input_volume_controller_config=*/{}, kSampleRateHz, kStereo, /*use_internal_vad=*/true); VoiceActivityDetectorWrapper vad(GetAvailableCpuFeatures(), kSampleRateHz);