| 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 222f749fb7b876fc55e53588a6d0914a192f90f1..dabc4b8a49a4e069e666c56dabb6a900e4e538ae 100644
 | 
| --- a/webrtc/modules/audio_processing/audio_processing_impl.cc
 | 
| +++ b/webrtc/modules/audio_processing/audio_processing_impl.cc
 | 
| @@ -154,15 +154,15 @@ struct AudioProcessingImpl::ApmPrivateSubmodules {
 | 
|  };
 | 
|  
 | 
|  AudioProcessing* AudioProcessing::Create() {
 | 
| -  Config config;
 | 
| +  webrtc::Config config;
 | 
|    return Create(config, nullptr);
 | 
|  }
 | 
|  
 | 
| -AudioProcessing* AudioProcessing::Create(const Config& config) {
 | 
| +AudioProcessing* AudioProcessing::Create(const webrtc::Config& config) {
 | 
|    return Create(config, nullptr);
 | 
|  }
 | 
|  
 | 
| -AudioProcessing* AudioProcessing::Create(const Config& config,
 | 
| +AudioProcessing* AudioProcessing::Create(const webrtc::Config& config,
 | 
|                                           NonlinearBeamformer* beamformer) {
 | 
|    AudioProcessingImpl* apm = new AudioProcessingImpl(config, beamformer);
 | 
|    if (apm->Initialize() != kNoError) {
 | 
| @@ -173,10 +173,10 @@ AudioProcessing* AudioProcessing::Create(const Config& config,
 | 
|    return apm;
 | 
|  }
 | 
|  
 | 
| -AudioProcessingImpl::AudioProcessingImpl(const Config& config)
 | 
| +AudioProcessingImpl::AudioProcessingImpl(const webrtc::Config& config)
 | 
|      : AudioProcessingImpl(config, nullptr) {}
 | 
|  
 | 
| -AudioProcessingImpl::AudioProcessingImpl(const Config& config,
 | 
| +AudioProcessingImpl::AudioProcessingImpl(const webrtc::Config& config,
 | 
|                                           NonlinearBeamformer* beamformer)
 | 
|      : public_submodules_(new ApmPublicSubmodules()),
 | 
|        private_submodules_(new ApmPrivateSubmodules(beamformer)),
 | 
| @@ -194,8 +194,7 @@ 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<LevelControl>().enabled) {
 | 
| +                         config.Get<Intelligibility>().enabled) {
 | 
|    {
 | 
|      rtc::CritScope cs_render(&crit_render_);
 | 
|      rtc::CritScope cs_capture(&crit_capture_);
 | 
| @@ -432,7 +431,34 @@ int AudioProcessingImpl::InitializeLocked(const ProcessingConfig& config) {
 | 
|    return InitializeLocked();
 | 
|  }
 | 
|  
 | 
| -void AudioProcessingImpl::SetExtraOptions(const Config& config) {
 | 
| +void AudioProcessingImpl::ApplyConfig(const AudioProcessing::Config& config) {
 | 
| +  AudioProcessing::Config config_to_use = config;
 | 
| +
 | 
| +  bool config_ok = LevelController::Validate(config_to_use.level_controller);
 | 
| +  if (!config_ok) {
 | 
| +    LOG(LS_ERROR) << "AudioProcessing module config error" << std::endl
 | 
| +                  << "level_controller: "
 | 
| +                  << LevelController::ToString(config_to_use.level_controller)
 | 
| +                  << std::endl
 | 
| +                  << "Reverting to default parameter set";
 | 
| +    config_to_use.level_controller = AudioProcessing::Config::LevelController();
 | 
| +  }
 | 
| +
 | 
| +  // Run in a single-threaded manner when applying the settings.
 | 
| +  rtc::CritScope cs_render(&crit_render_);
 | 
| +  rtc::CritScope cs_capture(&crit_capture_);
 | 
| +
 | 
| +  if (config.level_controller.enabled !=
 | 
| +      capture_nonlocked_.level_controller_enabled) {
 | 
| +    InitializeLevelController();
 | 
| +    LOG(LS_INFO) << "Level controller activated: "
 | 
| +                 << capture_nonlocked_.level_controller_enabled;
 | 
| +    capture_nonlocked_.level_controller_enabled =
 | 
| +        config.level_controller.enabled;
 | 
| +  }
 | 
| +}
 | 
| +
 | 
| +void AudioProcessingImpl::SetExtraOptions(const webrtc::Config& config) {
 | 
|    // Run in a single-threaded manner when setting the extra options.
 | 
|    rtc::CritScope cs_render(&crit_render_);
 | 
|    rtc::CritScope cs_capture(&crit_capture_);
 | 
| @@ -446,16 +472,6 @@ 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;
 | 
| -
 | 
| -    InitializeLevelController();
 | 
| -  }
 | 
| -
 | 
|  #if WEBRTC_INTELLIGIBILITY_ENHANCER
 | 
|    if(capture_nonlocked_.intelligibility_enabled !=
 | 
|       config.Get<Intelligibility>().enabled) {
 | 
| 
 |