| Index: webrtc/modules/audio_processing/audio_processing_impl.cc
|
| diff --git a/webrtc/modules/audio_processing/audio_processing_impl.cc b/webrtc/modules/audio_processing/audio_processing_impl.cc
|
| index 819a18b62d958f38e7b4a5f6b5f92687c8cf59bb..6183f03d4f980b934fc69a47504d0b655462b42d 100644
|
| --- a/webrtc/modules/audio_processing/audio_processing_impl.cc
|
| +++ b/webrtc/modules/audio_processing/audio_processing_impl.cc
|
| @@ -31,6 +31,7 @@
|
| #include "webrtc/modules/audio_processing/gain_control_impl.h"
|
| #include "webrtc/modules/audio_processing/high_pass_filter_impl.h"
|
| #include "webrtc/modules/audio_processing/intelligibility/intelligibility_enhancer.h"
|
| +#include "webrtc/modules/audio_processing/level_controller/level_controller.h"
|
| #include "webrtc/modules/audio_processing/level_estimator_impl.h"
|
| #include "webrtc/modules/audio_processing/noise_suppression_impl.h"
|
| #include "webrtc/modules/audio_processing/transient/transient_suppressor.h"
|
| @@ -132,6 +133,7 @@ struct AudioProcessingImpl::ApmPrivateSubmodules {
|
| // Accessed internally from capture or during initialization
|
| std::unique_ptr<Beamformer<float>> beamformer;
|
| std::unique_ptr<AgcManagerDirect> agc_manager;
|
| + std::unique_ptr<LevelController> level_controller;
|
| };
|
|
|
| AudioProcessing* AudioProcessing::Create() {
|
| @@ -175,8 +177,8 @@ AudioProcessingImpl::AudioProcessingImpl(const Config& config,
|
| config.Get<Beamforming>().array_geometry,
|
| config.Get<Beamforming>().target_direction),
|
| capture_nonlocked_(config.Get<Beamforming>().enabled,
|
| - config.Get<Intelligibility>().enabled)
|
| -{
|
| + config.Get<Intelligibility>().enabled,
|
| + config.Get<LevelControl>().enabled) {
|
| {
|
| rtc::CritScope cs_render(&crit_render_);
|
| rtc::CritScope cs_capture(&crit_capture_);
|
| @@ -198,6 +200,8 @@ AudioProcessingImpl::AudioProcessingImpl(const Config& config,
|
| public_submodules_->gain_control_for_experimental_agc.reset(
|
| new GainControlForExperimentalAgc(
|
| public_submodules_->gain_control.get(), &crit_capture_));
|
| +
|
| + private_submodules_->level_controller.reset(new LevelController());
|
| }
|
|
|
| SetExtraOptions(config);
|
| @@ -322,6 +326,7 @@ int AudioProcessingImpl::InitializeLocked() {
|
| InitializeNoiseSuppression();
|
| InitializeLevelEstimator();
|
| InitializeVoiceDetection();
|
| + InitializeLevelController();
|
|
|
| #ifdef WEBRTC_AUDIOPROC_DEBUG_DUMP
|
| if (debug_dump_.debug_file->is_open()) {
|
| @@ -408,6 +413,20 @@ void AudioProcessingImpl::SetExtraOptions(const Config& config) {
|
| InitializeTransient();
|
| }
|
|
|
| + if (capture_nonlocked_.level_controller_enabled !=
|
| + config.Get<LevelControl>().enabled) {
|
| + capture_nonlocked_.level_controller_enabled =
|
| + config.Get<LevelControl>().enabled;
|
| + LOG(LS_INFO) << "Level controller activated: "
|
| + << config.Get<LevelControl>().enabled;
|
| +
|
| + // TODO(peah): Remove the explicit deactivation once
|
| + // the upcoming changes for the level controller tuning
|
| + // are landed.
|
| + capture_nonlocked_.level_controller_enabled = false;
|
| + InitializeLevelController();
|
| + }
|
| +
|
| if(capture_nonlocked_.intelligibility_enabled !=
|
| config.Get<Intelligibility>().enabled) {
|
| capture_nonlocked_.intelligibility_enabled =
|
| @@ -759,6 +778,10 @@ int AudioProcessingImpl::ProcessStreamLocked() {
|
| capture_.key_pressed);
|
| }
|
|
|
| + if (capture_nonlocked_.level_controller_enabled) {
|
| + private_submodules_->level_controller->Process(ca);
|
| + }
|
| +
|
| // The level estimator operates on the recombined data.
|
| public_submodules_->level_estimator->ProcessStream(ca);
|
|
|
| @@ -1118,7 +1141,8 @@ bool AudioProcessingImpl::output_copy_needed() const {
|
| // Check if we've upmixed or downmixed the audio.
|
| return ((formats_.api_format.output_stream().num_channels() !=
|
| formats_.api_format.input_stream().num_channels()) ||
|
| - is_fwd_processed() || capture_.transient_suppressor_enabled);
|
| + is_fwd_processed() || capture_.transient_suppressor_enabled ||
|
| + capture_nonlocked_.level_controller_enabled);
|
| }
|
|
|
| bool AudioProcessingImpl::fwd_synthesis_needed() const {
|
| @@ -1247,6 +1271,10 @@ void AudioProcessingImpl::InitializeLevelEstimator() {
|
| public_submodules_->level_estimator->Initialize();
|
| }
|
|
|
| +void AudioProcessingImpl::InitializeLevelController() {
|
| + private_submodules_->level_controller->Initialize(proc_sample_rate_hz());
|
| +}
|
| +
|
| void AudioProcessingImpl::InitializeVoiceDetection() {
|
| public_submodules_->voice_detection->Initialize(proc_split_sample_rate_hz());
|
| }
|
| @@ -1441,6 +1469,9 @@ int AudioProcessingImpl::WriteConfigMessage(bool forced) {
|
| public_submodules_->echo_cancellation->GetExperimentsDescription();
|
| // TODO(peah): Add semicolon-separated concatenations of experiment
|
| // descriptions for other submodules.
|
| + if (capture_nonlocked_.level_controller_enabled) {
|
| + experiments_description += "LevelController;";
|
| + }
|
| config.set_experiments_description(experiments_description);
|
|
|
| std::string serialized_config = config.SerializeAsString();
|
|
|