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; |