| 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 816210f34f8738eb7a042adee69f87f5ed1a99d8..eb5f1a2760bbd98fde450d8da559c342a913fcd7 100644
 | 
| --- a/webrtc/modules/audio_processing/audio_processing_impl.cc
 | 
| +++ b/webrtc/modules/audio_processing/audio_processing_impl.cc
 | 
| @@ -23,6 +23,7 @@
 | 
|  #include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
 | 
|  #include "webrtc/modules/audio_processing/aec/aec_core.h"
 | 
|  #include "webrtc/modules/audio_processing/aec3/echo_canceller3.h"
 | 
| +#include "webrtc/modules/audio_processing/agc2/agc2_impl.h"
 | 
|  #include "webrtc/modules/audio_processing/agc/agc_manager_direct.h"
 | 
|  #include "webrtc/modules/audio_processing/audio_buffer.h"
 | 
|  #include "webrtc/modules/audio_processing/beamformer/nonlinear_beamformer.h"
 | 
| @@ -168,6 +169,7 @@ bool AudioProcessingImpl::ApmSubmoduleStates::Update(
 | 
|      bool intelligibility_enhancer_enabled,
 | 
|      bool beamformer_enabled,
 | 
|      bool adaptive_gain_controller_enabled,
 | 
| +    bool adaptive_gain_controller2_enabled,
 | 
|      bool level_controller_enabled,
 | 
|      bool echo_canceller3_enabled,
 | 
|      bool voice_activity_detector_enabled,
 | 
| @@ -186,6 +188,8 @@ bool AudioProcessingImpl::ApmSubmoduleStates::Update(
 | 
|    changed |= (beamformer_enabled != beamformer_enabled_);
 | 
|    changed |=
 | 
|        (adaptive_gain_controller_enabled != adaptive_gain_controller_enabled_);
 | 
| +  changed |=
 | 
| +      (adaptive_gain_controller2_enabled != adaptive_gain_controller2_enabled_);
 | 
|    changed |= (level_controller_enabled != level_controller_enabled_);
 | 
|    changed |= (echo_canceller3_enabled != echo_canceller3_enabled_);
 | 
|    changed |= (level_estimator_enabled != level_estimator_enabled_);
 | 
| @@ -201,6 +205,7 @@ bool AudioProcessingImpl::ApmSubmoduleStates::Update(
 | 
|      intelligibility_enhancer_enabled_ = intelligibility_enhancer_enabled;
 | 
|      beamformer_enabled_ = beamformer_enabled;
 | 
|      adaptive_gain_controller_enabled_ = adaptive_gain_controller_enabled;
 | 
| +    adaptive_gain_controller2_enabled_ = adaptive_gain_controller2_enabled;
 | 
|      level_controller_enabled_ = level_controller_enabled;
 | 
|      echo_canceller3_enabled_ = echo_canceller3_enabled;
 | 
|      level_estimator_enabled_ = level_estimator_enabled;
 | 
| @@ -274,6 +279,7 @@ struct AudioProcessingImpl::ApmPrivateSubmodules {
 | 
|    // Accessed internally from capture or during initialization
 | 
|    std::unique_ptr<NonlinearBeamformer> beamformer;
 | 
|    std::unique_ptr<AgcManagerDirect> agc_manager;
 | 
| +  std::unique_ptr<Agc2Impl> agc2;
 | 
|    std::unique_ptr<LowCutFilter> low_cut_filter;
 | 
|    std::unique_ptr<LevelController> level_controller;
 | 
|    std::unique_ptr<ResidualEchoDetector> residual_echo_detector;
 | 
| @@ -345,6 +351,8 @@ AudioProcessingImpl::AudioProcessingImpl(const webrtc::Config& config,
 | 
|              public_submodules_->gain_control.get(), &crit_capture_));
 | 
|      private_submodules_->residual_echo_detector.reset(
 | 
|          new ResidualEchoDetector());
 | 
| +    private_submodules_->agc2.reset(
 | 
| +        new Agc2Impl(&crit_capture_));
 | 
|  
 | 
|      // TODO(peah): Move this creation to happen only when the level controller
 | 
|      // is enabled.
 | 
| @@ -517,6 +525,7 @@ int AudioProcessingImpl::InitializeLocked() {
 | 
|    InitializeLevelController();
 | 
|    InitializeResidualEchoDetector();
 | 
|    InitializeEchoCanceller3();
 | 
| +  InitializeAgc2();
 | 
|  
 | 
|  #ifdef WEBRTC_AUDIOPROC_DEBUG_DUMP
 | 
|    if (debug_dump_.debug_file->is_open()) {
 | 
| @@ -665,6 +674,16 @@ void AudioProcessingImpl::ApplyConfig(const AudioProcessing::Config& config) {
 | 
|      LOG(LS_INFO) << "Echo canceller 3 activated: "
 | 
|                   << capture_nonlocked_.echo_canceller3_enabled;
 | 
|    }
 | 
| +
 | 
| +  config_ok = Agc2Impl::Validate(config_.agc2);
 | 
| +  if (!config_ok) {
 | 
| +    LOG(LS_ERROR) << "AudioProcessing module config error" << std::endl
 | 
| +                  << "agc2: "
 | 
| +                  << Agc2Impl::ToString(config_.agc2)
 | 
| +                  << std::endl
 | 
| +                  << "Reverting to default parameter set";
 | 
| +    config_.agc2 = AudioProcessing::Config::Agc2();
 | 
| +  }
 | 
|  }
 | 
|  
 | 
|  void AudioProcessingImpl::SetExtraOptions(const webrtc::Config& config) {
 | 
| @@ -1697,6 +1716,7 @@ bool AudioProcessingImpl::UpdateActiveSubmoduleStates() {
 | 
|        capture_nonlocked_.intelligibility_enabled,
 | 
|        capture_nonlocked_.beamformer_enabled,
 | 
|        public_submodules_->gain_control->is_enabled(),
 | 
| +      capture_nonlocked_.adaptive_gain_controller2_enabled,
 | 
|        capture_nonlocked_.level_controller_enabled,
 | 
|        capture_nonlocked_.echo_canceller3_enabled,
 | 
|        public_submodules_->voice_detection->is_enabled(),
 | 
| @@ -1747,6 +1767,7 @@ void AudioProcessingImpl::InitializeLowCutFilter() {
 | 
|      private_submodules_->low_cut_filter.reset();
 | 
|    }
 | 
|  }
 | 
| +
 | 
|  void AudioProcessingImpl::InitializeEchoCanceller3() {
 | 
|    if (capture_nonlocked_.echo_canceller3_enabled) {
 | 
|      private_submodules_->echo_canceller3.reset(
 | 
| @@ -1756,6 +1777,15 @@ void AudioProcessingImpl::InitializeEchoCanceller3() {
 | 
|    }
 | 
|  }
 | 
|  
 | 
| +void AudioProcessingImpl::InitializeAgc2() {
 | 
| +  if (capture_nonlocked_.adaptive_gain_controller2_enabled) {
 | 
| +    private_submodules_->agc2.reset(
 | 
| +        new Agc2Impl(&crit_capture_));
 | 
| +  } else {
 | 
| +    private_submodules_->agc2.reset();
 | 
| +  }
 | 
| +}
 | 
| +
 | 
|  void AudioProcessingImpl::InitializeLevelController() {
 | 
|    private_submodules_->level_controller->Initialize(proc_sample_rate_hz());
 | 
|  }
 | 
| 
 |