New module for the adaptive level controlling functionality in the audio processing module

NOTRY=true
TBR=aluebs@webrtc.org
BUG=webrtc:5920

Review-Url: https://codereview.webrtc.org/2090583002
Cr-Commit-Position: refs/heads/master@{#13333}
This commit is contained in:
peah
2016-06-29 15:26:12 -07:00
committed by Commit bot
parent 886815bc36
commit ca4cac7e74
39 changed files with 2128 additions and 8 deletions

View File

@ -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();