diff --git a/modules/audio_processing/audio_processing_impl.cc b/modules/audio_processing/audio_processing_impl.cc index b6e79beb78..0e375c9b9b 100644 --- a/modules/audio_processing/audio_processing_impl.cc +++ b/modules/audio_processing/audio_processing_impl.cc @@ -586,11 +586,10 @@ int AudioProcessingImpl::InitializeLocked(const ProcessingConfig& config) { if (submodule_states_.RenderMultiBandSubModulesActive()) { // By default, downmix the render stream to mono for analysis. This has been // demonstrated to work well for AEC in most practical scenarios. - const bool experimental_multi_channel_render = - config_.pipeline.experimental_multi_channel && - constants_.experimental_multi_channel_render_support; + const bool multi_channel_render = config_.pipeline.multi_channel_render && + constants_.multi_channel_render_support; int render_processing_num_channels = - experimental_multi_channel_render + multi_channel_render ? formats_.api_format.reverse_input_stream().num_channels() : 1; formats_.render_processing_format = @@ -622,8 +621,10 @@ void AudioProcessingImpl::ApplyConfig(const AudioProcessing::Config& config) { rtc::CritScope cs_capture(&crit_capture_); const bool pipeline_config_changed = - config_.pipeline.experimental_multi_channel != - config.pipeline.experimental_multi_channel; + config_.pipeline.multi_channel_render != + config.pipeline.multi_channel_render || + config_.pipeline.multi_channel_capture != + config.pipeline.multi_channel_capture; const bool aec_config_changed = config_.echo_canceller.enabled != config.echo_canceller.enabled || @@ -769,11 +770,9 @@ size_t AudioProcessingImpl::num_input_channels() const { size_t AudioProcessingImpl::num_proc_channels() const { // Used as callback from submodules, hence locking is not allowed. - const bool experimental_multi_channel_capture = - config_.pipeline.experimental_multi_channel && - constants_.experimental_multi_channel_capture_support; - if (capture_nonlocked_.echo_controller_enabled && - !experimental_multi_channel_capture) { + const bool multi_channel_capture = config_.pipeline.multi_channel_capture && + constants_.multi_channel_capture_support; + if (capture_nonlocked_.echo_controller_enabled && !multi_channel_capture) { return 1; } return num_output_channels(); @@ -1291,10 +1290,9 @@ int AudioProcessingImpl::ProcessCaptureStreamLocked() { capture_buffer->SplitIntoFrequencyBands(); } - const bool experimental_multi_channel_capture = - config_.pipeline.experimental_multi_channel && - constants_.experimental_multi_channel_capture_support; - if (submodules_.echo_controller && !experimental_multi_channel_capture) { + const bool multi_channel_capture = config_.pipeline.multi_channel_capture && + constants_.multi_channel_capture_support; + if (submodules_.echo_controller && !multi_channel_capture) { // Force down-mixing of the number of channels after the detection of // capture signal saturation. // TODO(peah): Look into ensuring that this kind of tampering with the diff --git a/modules/audio_processing/audio_processing_impl.h b/modules/audio_processing/audio_processing_impl.h index 61bf151174..5f1d12ff32 100644 --- a/modules/audio_processing/audio_processing_impl.h +++ b/modules/audio_processing/audio_processing_impl.h @@ -374,8 +374,8 @@ class AudioProcessingImpl : public AudioProcessing { bool use_experimental_agc, bool use_experimental_agc_agc2_level_estimation, bool use_experimental_agc_agc2_digital_adaptive, - bool experimental_multi_channel_render_support, - bool experimental_multi_channel_capture_support) + bool multi_channel_render_support, + bool multi_channel_capture_support) : agc_startup_min_volume(agc_startup_min_volume), agc_clipped_level_min(agc_clipped_level_min), use_experimental_agc(use_experimental_agc), @@ -383,17 +383,15 @@ class AudioProcessingImpl : public AudioProcessing { use_experimental_agc_agc2_level_estimation), use_experimental_agc_agc2_digital_adaptive( use_experimental_agc_agc2_digital_adaptive), - experimental_multi_channel_render_support( - experimental_multi_channel_render_support), - experimental_multi_channel_capture_support( - experimental_multi_channel_capture_support) {} + multi_channel_render_support(multi_channel_render_support), + multi_channel_capture_support(multi_channel_capture_support) {} int agc_startup_min_volume; int agc_clipped_level_min; bool use_experimental_agc; bool use_experimental_agc_agc2_level_estimation; bool use_experimental_agc_agc2_digital_adaptive; - bool experimental_multi_channel_render_support; - bool experimental_multi_channel_capture_support; + bool multi_channel_render_support; + bool multi_channel_capture_support; } constants_; struct ApmCaptureState { diff --git a/modules/audio_processing/include/audio_processing.cc b/modules/audio_processing/include/audio_processing.cc index b085605b98..eccc365fc0 100644 --- a/modules/audio_processing/include/audio_processing.cc +++ b/modules/audio_processing/include/audio_processing.cc @@ -75,8 +75,9 @@ std::string AudioProcessing::Config::ToString() const { << "pipeline: {" << "maximum_internal_processing_rate: " << pipeline.maximum_internal_processing_rate - << ", experimental_multi_channel: " - << pipeline.experimental_multi_channel << "}, " + << ", multi_channel_render: " << pipeline.multi_channel_render << ", " + << ", multi_channel_capture: " << pipeline.multi_channel_capture + << "}, " << "pre_amplifier: { enabled: " << pre_amplifier.enabled << ", fixed_gain_factor: " << pre_amplifier.fixed_gain_factor << " }, high_pass_filter: { enabled: " << high_pass_filter.enabled diff --git a/modules/audio_processing/include/audio_processing.h b/modules/audio_processing/include/audio_processing.h index 113bd2a2b8..9ef4e2679a 100644 --- a/modules/audio_processing/include/audio_processing.h +++ b/modules/audio_processing/include/audio_processing.h @@ -256,8 +256,14 @@ class RTC_EXPORT AudioProcessing : public rtc::RefCountInterface { // default rate is currently selected based on the CPU architecture, but // that logic may change. int maximum_internal_processing_rate; - // Force multi-channel processing on playout and capture audio. This is an - // experimental feature, and is likely to change without warning. + // Allow multi-channel processing of render audio. + bool multi_channel_render = false; + // Allow multi-channel processing of capture audio when AEC3 is active + // or a custom AEC is injected.. + bool multi_channel_capture = false; + + // Deprecated. + // TODO(peah): Remove. bool experimental_multi_channel = false; } pipeline; diff --git a/modules/audio_processing/test/audio_processing_simulator.cc b/modules/audio_processing/test/audio_processing_simulator.cc index 38b97cabff..cb1d1ed37c 100644 --- a/modules/audio_processing/test/audio_processing_simulator.cc +++ b/modules/audio_processing/test/audio_processing_simulator.cc @@ -403,9 +403,13 @@ void AudioProcessingSimulator::CreateAudioProcessor() { if (settings_.use_ts) { config.Set(new ExperimentalNs(*settings_.use_ts)); } - if (settings_.experimental_multi_channel) { - apm_config.pipeline.experimental_multi_channel = - *settings_.experimental_multi_channel; + if (settings_.multi_channel_render) { + apm_config.pipeline.multi_channel_render = *settings_.multi_channel_render; + } + + if (settings_.multi_channel_capture) { + apm_config.pipeline.multi_channel_capture = + *settings_.multi_channel_capture; } if (settings_.use_agc2) { diff --git a/modules/audio_processing/test/audio_processing_simulator.h b/modules/audio_processing/test/audio_processing_simulator.h index 8ee2db8d40..5b26b5f494 100644 --- a/modules/audio_processing/test/audio_processing_simulator.h +++ b/modules/audio_processing/test/audio_processing_simulator.h @@ -85,7 +85,8 @@ struct SimulationSettings { absl::optional use_refined_adaptive_filter; int initial_mic_level; bool simulate_mic_gain = false; - absl::optional experimental_multi_channel; + absl::optional multi_channel_render; + absl::optional multi_channel_capture; absl::optional simulated_mic_kind; bool report_performance = false; absl::optional performance_report_output_filename; diff --git a/modules/audio_processing/test/audioproc_float_impl.cc b/modules/audio_processing/test/audioproc_float_impl.cc index 8301c4ecd4..4902acb9ee 100644 --- a/modules/audio_processing/test/audioproc_float_impl.cc +++ b/modules/audio_processing/test/audioproc_float_impl.cc @@ -217,9 +217,15 @@ ABSL_FLAG(int, 0, "Activate (1) or deactivate(0) the analog mic gain simulation"); ABSL_FLAG(int, - experimental_multi_channel, + multi_channel_render, kParameterNotSpecifiedValue, - "Activate (1) or deactivate(0) multi-channel audio in APM pipeline"); + "Activate (1) or deactivate(0) multi-channel render processing in " + "APM pipeline"); +ABSL_FLAG(int, + multi_channel_capture, + kParameterNotSpecifiedValue, + "Activate (1) or deactivate(0) multi-channel capture processing in " + "APM pipeline"); ABSL_FLAG(int, simulated_mic_kind, kParameterNotSpecifiedValue, @@ -443,8 +449,10 @@ SimulationSettings CreateSettings() { SetSettingIfSpecified(absl::GetFlag(FLAGS_aec_settings), &settings.aec_settings_filename); settings.initial_mic_level = absl::GetFlag(FLAGS_initial_mic_level); - SetSettingIfFlagSet(absl::GetFlag(FLAGS_experimental_multi_channel), - &settings.experimental_multi_channel); + SetSettingIfFlagSet(absl::GetFlag(FLAGS_multi_channel_render), + &settings.multi_channel_render); + SetSettingIfFlagSet(absl::GetFlag(FLAGS_multi_channel_capture), + &settings.multi_channel_capture); settings.simulate_mic_gain = absl::GetFlag(FLAGS_simulate_mic_gain); SetSettingIfSpecified(absl::GetFlag(FLAGS_simulated_mic_kind), &settings.simulated_mic_kind); diff --git a/test/fuzzers/audio_processing_configs_fuzzer.cc b/test/fuzzers/audio_processing_configs_fuzzer.cc index 57699dd5b3..c7ce0a9f33 100644 --- a/test/fuzzers/audio_processing_configs_fuzzer.cc +++ b/test/fuzzers/audio_processing_configs_fuzzer.cc @@ -122,7 +122,8 @@ std::unique_ptr CreateApm(test::FuzzDataHelper* fuzz_data, #endif webrtc::AudioProcessing::Config apm_config; - apm_config.pipeline.experimental_multi_channel = true; + apm_config.pipeline.multi_channel_render = true; + apm_config.pipeline.multi_channel_capture = true; apm_config.echo_canceller.enabled = use_aec || use_aecm; apm_config.echo_canceller.mobile_mode = use_aecm; apm_config.residual_echo_detector.enabled = red;