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}
diff --git a/webrtc/modules/audio_processing/audio_processing_impl.cc b/webrtc/modules/audio_processing/audio_processing_impl.cc
index 819a18b..6183f03 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 @@
   // 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 @@
                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 @@
     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 @@
   InitializeNoiseSuppression();
   InitializeLevelEstimator();
   InitializeVoiceDetection();
+  InitializeLevelController();
 
 #ifdef WEBRTC_AUDIOPROC_DEBUG_DUMP
   if (debug_dump_.debug_file->is_open()) {
@@ -408,6 +413,20 @@
     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 @@
         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 @@
   // 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 @@
   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 @@
       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();