Deprecate WebRTC-Audio-GainController2 fieldtrial
Bug: webrtc:7494 Change-Id: I315a6e5d203a7f7f86e27d5b1b1f7dd72ccf1b08 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/354100 Reviewed-by: Sam Zackrisson <saza@webrtc.org> Commit-Queue: Hanna Silen <silen@webrtc.org> Cr-Commit-Position: refs/heads/main@{#42468}
This commit is contained in:
parent
b2c4f5469c
commit
7ee37cf839
@ -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::GainController2ExperimentParams>
|
||||
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<bool> switch_to_agc2("switch_to_agc2", true);
|
||||
|
||||
// AGC2 input volume controller configuration.
|
||||
constexpr InputVolumeController::Config kDefaultInputVolumeControllerConfig;
|
||||
FieldTrialConstrained<int> min_input_volume(
|
||||
"min_input_volume", kDefaultInputVolumeControllerConfig.min_input_volume,
|
||||
0, 255);
|
||||
FieldTrialConstrained<int> clipped_level_min(
|
||||
"clipped_level_min",
|
||||
kDefaultInputVolumeControllerConfig.clipped_level_min, 0, 255);
|
||||
FieldTrialConstrained<int> clipped_level_step(
|
||||
"clipped_level_step",
|
||||
kDefaultInputVolumeControllerConfig.clipped_level_step, 0, 255);
|
||||
FieldTrialConstrained<double> clipped_ratio_threshold(
|
||||
"clipped_ratio_threshold",
|
||||
kDefaultInputVolumeControllerConfig.clipped_ratio_threshold, 0, 1);
|
||||
FieldTrialConstrained<int> clipped_wait_frames(
|
||||
"clipped_wait_frames",
|
||||
kDefaultInputVolumeControllerConfig.clipped_wait_frames, 0,
|
||||
absl::nullopt);
|
||||
FieldTrialParameter<bool> enable_clipping_predictor(
|
||||
"enable_clipping_predictor",
|
||||
kDefaultInputVolumeControllerConfig.enable_clipping_predictor);
|
||||
FieldTrialConstrained<int> target_range_max_dbfs(
|
||||
"target_range_max_dbfs",
|
||||
kDefaultInputVolumeControllerConfig.target_range_max_dbfs, -90, 30);
|
||||
FieldTrialConstrained<int> target_range_min_dbfs(
|
||||
"target_range_min_dbfs",
|
||||
kDefaultInputVolumeControllerConfig.target_range_min_dbfs, -90, 30);
|
||||
FieldTrialConstrained<int> update_input_volume_wait_frames(
|
||||
"update_input_volume_wait_frames",
|
||||
kDefaultInputVolumeControllerConfig.update_input_volume_wait_frames, 0,
|
||||
absl::nullopt);
|
||||
FieldTrialConstrained<double> speech_probability_threshold(
|
||||
"speech_probability_threshold",
|
||||
kDefaultInputVolumeControllerConfig.speech_probability_threshold, 0, 1);
|
||||
FieldTrialConstrained<double> speech_ratio_threshold(
|
||||
"speech_ratio_threshold",
|
||||
kDefaultInputVolumeControllerConfig.speech_ratio_threshold, 0, 1);
|
||||
|
||||
// AGC2 adaptive digital controller configuration.
|
||||
constexpr AudioProcessing::Config::GainController2::AdaptiveDigital
|
||||
kDefaultAdaptiveDigitalConfig;
|
||||
FieldTrialConstrained<double> headroom_db(
|
||||
"headroom_db", kDefaultAdaptiveDigitalConfig.headroom_db, 0,
|
||||
absl::nullopt);
|
||||
FieldTrialConstrained<double> max_gain_db(
|
||||
"max_gain_db", kDefaultAdaptiveDigitalConfig.max_gain_db, 0,
|
||||
absl::nullopt);
|
||||
FieldTrialConstrained<double> initial_gain_db(
|
||||
"initial_gain_db", kDefaultAdaptiveDigitalConfig.initial_gain_db, 0,
|
||||
absl::nullopt);
|
||||
FieldTrialConstrained<double> max_gain_change_db_per_second(
|
||||
"max_gain_change_db_per_second",
|
||||
kDefaultAdaptiveDigitalConfig.max_gain_change_db_per_second, 0,
|
||||
absl::nullopt);
|
||||
FieldTrialConstrained<double> max_output_noise_level_dbfs(
|
||||
"max_output_noise_level_dbfs",
|
||||
kDefaultAdaptiveDigitalConfig.max_output_noise_level_dbfs, absl::nullopt,
|
||||
0);
|
||||
|
||||
// Transient suppressor.
|
||||
FieldTrialParameter<bool> 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<float>(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<float>(
|
||||
speech_probability_threshold.Get()),
|
||||
.speech_ratio_threshold =
|
||||
static_cast<float>(speech_ratio_threshold.Get()),
|
||||
},
|
||||
.adaptive_digital_controller =
|
||||
{
|
||||
.headroom_db = static_cast<float>(headroom_db.Get()),
|
||||
.max_gain_db = static_cast<float>(max_gain_db.Get()),
|
||||
.initial_gain_db =
|
||||
static_cast<float>(initial_gain_db.Get()),
|
||||
.max_gain_change_db_per_second = static_cast<float>(
|
||||
max_gain_change_db_per_second.Get()),
|
||||
.max_output_noise_level_dbfs =
|
||||
static_cast<float>(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<AudioProcessingImpl::GainController2ExperimentParams>&
|
||||
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<GainController2ExperimentParams>& 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<GainController2>(
|
||||
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;
|
||||
}
|
||||
|
||||
@ -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<int> 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<Agc2Config> 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<GainController2ExperimentParams>
|
||||
gain_controller2_experiment_params_;
|
||||
|
||||
// Parses the "WebRTC-Audio-GainController2" field trial. If disabled, returns
|
||||
// an unspecified value.
|
||||
static absl::optional<GainController2ExperimentParams>
|
||||
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<GainController2ExperimentParams>& experiment_params);
|
||||
// Returns true if the APM VAD sub-module should be used.
|
||||
static bool UseApmVadSubModule(
|
||||
const AudioProcessing::Config& config,
|
||||
const absl::optional<GainController2ExperimentParams>& experiment_params);
|
||||
// Deprecated.
|
||||
// TODO(bugs.webrtc.org/7494): Remove.
|
||||
static bool UseApmVadSubModule(const AudioProcessing::Config& config);
|
||||
|
||||
TransientSuppressor::VadMode transient_suppressor_vad_mode_;
|
||||
|
||||
|
||||
@ -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<float, kSampleRateHz / 100> 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<AudioProcessing> 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<float, kSampleRateHz / 100> 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<AudioProcessing::Config> {};
|
||||
|
||||
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<float, kSampleRateHz / 100> 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<float, kSampleRateHz / 100> 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<float, kSampleRateHz / 100> 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<float, kSampleRateHz / 100> 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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user