| 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..8d3a610f5a921b5bfe40cf700c44e8f59205f726 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;
|
| @@ -232,6 +237,7 @@ struct AudioProcessingImpl::ApmPrivateSubmodules {
|
| std::unique_ptr<NonlinearBeamformer> beamformer;
|
| std::unique_ptr<AgcManagerDirect> agc_manager;
|
| std::unique_ptr<LevelController> level_controller;
|
| + std::unique_ptr<ResidualEchoDetector> residual_echo_detector;
|
| };
|
|
|
| AudioProcessing* AudioProcessing::Create() {
|
| @@ -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_));
|
| + private_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();
|
| + private_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();
|
| + private_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) {
|
| + private_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) {
|
| + private_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,11 @@ void AudioProcessingImpl::InitializeLevelController() {
|
| private_submodules_->level_controller->Initialize(proc_sample_rate_hz());
|
| }
|
|
|
| +void AudioProcessingImpl::InitializeResidualEchoDetector() {
|
| + private_submodules_->residual_echo_detector->Initialize(
|
| + proc_sample_rate_hz());
|
| +}
|
| +
|
| void AudioProcessingImpl::MaybeUpdateHistograms() {
|
| static const int kMinDiffDelayMs = 60;
|
|
|
|
|