Chromium Code Reviews| 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 85f159716cf9d49753fad1fdd18108971b922a9b..6db2c057167f4a896ebfccc5dd08c68fcf4495e5 100644 |
| --- a/webrtc/modules/audio_processing/audio_processing_impl.cc |
| +++ b/webrtc/modules/audio_processing/audio_processing_impl.cc |
| @@ -35,6 +35,7 @@ |
| #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/residual_echo_detector.h" |
| #include "webrtc/modules/audio_processing/transient/transient_suppressor.h" |
| #include "webrtc/modules/audio_processing/voice_detection_impl.h" |
| #include "webrtc/modules/include/module_common_types.h" |
| @@ -130,6 +131,7 @@ bool AudioProcessingImpl::ApmSubmoduleStates::Update( |
| bool high_pass_filter_enabled, |
| bool echo_canceller_enabled, |
| bool mobile_echo_controller_enabled, |
| + bool residual_echo_detector_enabled, |
| bool noise_suppressor_enabled, |
| bool intelligibility_enhancer_enabled, |
| bool beamformer_enabled, |
| @@ -143,6 +145,8 @@ bool AudioProcessingImpl::ApmSubmoduleStates::Update( |
| changed |= (echo_canceller_enabled != echo_canceller_enabled_); |
| changed |= |
| (mobile_echo_controller_enabled != mobile_echo_controller_enabled_); |
| + changed |= |
| + (residual_echo_detector_enabled != residual_echo_detector_enabled_); |
| changed |= (noise_suppressor_enabled != noise_suppressor_enabled_); |
| changed |= |
| (intelligibility_enhancer_enabled != intelligibility_enhancer_enabled_); |
| @@ -158,6 +162,7 @@ bool AudioProcessingImpl::ApmSubmoduleStates::Update( |
| high_pass_filter_enabled_ = high_pass_filter_enabled; |
| echo_canceller_enabled_ = echo_canceller_enabled; |
| mobile_echo_controller_enabled_ = mobile_echo_controller_enabled; |
| + residual_echo_detector_enabled_ = residual_echo_detector_enabled; |
| noise_suppressor_enabled_ = noise_suppressor_enabled; |
| intelligibility_enhancer_enabled_ = intelligibility_enhancer_enabled; |
| beamformer_enabled_ = beamformer_enabled; |
| @@ -220,6 +225,7 @@ struct AudioProcessingImpl::ApmPublicSubmodules { |
| // Accessed internally from both render and capture. |
| std::unique_ptr<TransientSuppressor> transient_suppressor; |
| + std::unique_ptr<ResidualEchoDetector> residual_echo_detector; |
|
peah-webrtc
2016/10/13 10:11:17
It would be better to place this among the private
ivoc
2016/10/13 10:31:25
I did try placing it in the private submodules, bu
peah-webrtc
2016/10/13 10:50:27
I think you should remove the guard for that for t
|
| #if WEBRTC_INTELLIGIBILITY_ENHANCER |
| std::unique_ptr<IntelligibilityEnhancer> intelligibility_enhancer; |
| #endif |
| @@ -297,6 +303,8 @@ AudioProcessingImpl::AudioProcessingImpl(const webrtc::Config& config, |
| public_submodules_->gain_control_for_experimental_agc.reset( |
| new GainControlForExperimentalAgc( |
| public_submodules_->gain_control.get(), &crit_capture_)); |
| + public_submodules_->residual_echo_detector.reset( |
| + new ResidualEchoDetector(&crit_render_, &crit_capture_)); |
| // TODO(peah): Move this creation to happen only when the level controller |
| // is enabled. |
| @@ -459,6 +467,7 @@ int AudioProcessingImpl::InitializeLocked() { |
| public_submodules_->voice_detection->Initialize(proc_split_sample_rate_hz()); |
| public_submodules_->level_estimator->Initialize(); |
| InitializeLevelController(); |
| + InitializeResidualEchoDetector(); |
| #ifdef WEBRTC_AUDIOPROC_DEBUG_DUMP |
| if (debug_dump_.debug_file->is_open()) { |
| @@ -700,6 +709,7 @@ int AudioProcessingImpl::ProcessStream(const float* const* src, |
| public_submodules_->echo_cancellation->ReadQueuedRenderData(); |
| public_submodules_->echo_control_mobile->ReadQueuedRenderData(); |
| public_submodules_->gain_control->ReadQueuedRenderData(); |
| + public_submodules_->residual_echo_detector->ReadQueuedRenderData(); |
| if (!src || !dest) { |
| return kNullPointerError; |
| @@ -770,6 +780,7 @@ int AudioProcessingImpl::ProcessStream(AudioFrame* frame) { |
| public_submodules_->echo_cancellation->ReadQueuedRenderData(); |
| public_submodules_->echo_control_mobile->ReadQueuedRenderData(); |
| public_submodules_->gain_control->ReadQueuedRenderData(); |
| + public_submodules_->residual_echo_detector->ReadQueuedRenderData(); |
| } |
| if (!frame) { |
| @@ -932,6 +943,11 @@ int AudioProcessingImpl::ProcessCaptureStreamLocked() { |
| RETURN_ON_ERR(public_submodules_->echo_control_mobile->ProcessCaptureAudio( |
| capture_buffer, stream_delay_ms())); |
| + if (config_.residual_echo_detector.enabled) { |
| + public_submodules_->residual_echo_detector->AnalyzeCaptureAudio( |
| + capture_buffer); |
| + } |
| + |
| if (capture_nonlocked_.beamformer_enabled) { |
| private_submodules_->beamformer->PostFilter(capture_buffer->split_data_f()); |
| } |
| @@ -1134,6 +1150,10 @@ int AudioProcessingImpl::ProcessRenderStreamLocked() { |
| public_submodules_->echo_cancellation->ProcessRenderAudio(render_buffer)); |
| RETURN_ON_ERR(public_submodules_->echo_control_mobile->ProcessRenderAudio( |
| render_buffer)); |
| + if (config_.residual_echo_detector.enabled) { |
| + public_submodules_->residual_echo_detector->AnalyzeRenderAudio( |
| + render_buffer); |
| + } |
| if (!constants_.use_experimental_agc) { |
| RETURN_ON_ERR( |
| public_submodules_->gain_control->ProcessRenderAudio(render_buffer)); |
| @@ -1310,6 +1330,7 @@ bool AudioProcessingImpl::UpdateActiveSubmoduleStates() { |
| public_submodules_->high_pass_filter->is_enabled(), |
| public_submodules_->echo_cancellation->is_enabled(), |
| public_submodules_->echo_control_mobile->is_enabled(), |
| + config_.residual_echo_detector.enabled, |
| public_submodules_->noise_suppression->is_enabled(), |
| capture_nonlocked_.intelligibility_enabled, |
| capture_nonlocked_.beamformer_enabled, |
| @@ -1359,6 +1380,10 @@ void AudioProcessingImpl::InitializeLevelController() { |
| private_submodules_->level_controller->Initialize(proc_sample_rate_hz()); |
| } |
| +void AudioProcessingImpl::InitializeResidualEchoDetector() { |
| + public_submodules_->residual_echo_detector->Initialize(proc_sample_rate_hz()); |
| +} |
| + |
| void AudioProcessingImpl::MaybeUpdateHistograms() { |
| static const int kMinDiffDelayMs = 60; |