Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(13)

Unified Diff: webrtc/modules/audio_processing/audio_processing_impl.cc

Issue 2405403003: Add empty residual echo detector. (Closed)
Patch Set: Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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;

Powered by Google App Engine
This is Rietveld 408576698