/* * Copyright (c) 2018 The WebRTC project authors. All Rights Reserved. * * Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source * tree. An additional intellectual property rights grant can be found * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree. */ #include "modules/audio_processing/echo_cancellation_proxy.h" #include "rtc_base/logging.h" namespace webrtc { EchoCancellationProxy::EchoCancellationProxy( AudioProcessing* audio_processing, EchoCancellationImpl* echo_cancellation) : audio_processing_(audio_processing), echo_cancellation_(echo_cancellation) {} EchoCancellationProxy::~EchoCancellationProxy() = default; int EchoCancellationProxy::Enable(bool enable) { // Change the config in APM to mirror the applied settings. AudioProcessing::Config apm_config = audio_processing_->GetConfig(); bool aec2_enabled = apm_config.echo_canceller.enabled && !apm_config.echo_canceller.mobile_mode; if ((aec2_enabled && !enable) || (!aec2_enabled && enable)) { apm_config.echo_canceller.enabled = enable; apm_config.echo_canceller.mobile_mode = false; audio_processing_->ApplyConfig(apm_config); } return AudioProcessing::kNoError; } bool EchoCancellationProxy::is_enabled() const { return echo_cancellation_->is_enabled(); } int EchoCancellationProxy::enable_drift_compensation(bool enable) { return echo_cancellation_->enable_drift_compensation(enable); } bool EchoCancellationProxy::is_drift_compensation_enabled() const { return echo_cancellation_->is_drift_compensation_enabled(); } void EchoCancellationProxy::set_stream_drift_samples(int drift) { echo_cancellation_->set_stream_drift_samples(drift); } int EchoCancellationProxy::stream_drift_samples() const { return echo_cancellation_->stream_drift_samples(); } int EchoCancellationProxy::set_suppression_level( EchoCancellation::SuppressionLevel level) { if (level == EchoCancellation::SuppressionLevel::kLowSuppression) { RTC_LOG(LS_ERROR) << "Ignoring deprecated setting: AEC2 low suppression"; return AudioProcessing::kBadParameterError; } AudioProcessing::Config apm_config = audio_processing_->GetConfig(); apm_config.echo_canceller.legacy_moderate_suppression_level = (level == EchoCancellation::SuppressionLevel::kModerateSuppression); audio_processing_->ApplyConfig(apm_config); return AudioProcessing::kNoError; } EchoCancellation::SuppressionLevel EchoCancellationProxy::suppression_level() const { return echo_cancellation_->suppression_level(); } bool EchoCancellationProxy::stream_has_echo() const { return echo_cancellation_->stream_has_echo(); } int EchoCancellationProxy::enable_metrics(bool enable) { return echo_cancellation_->enable_metrics(enable); } bool EchoCancellationProxy::are_metrics_enabled() const { return echo_cancellation_->are_metrics_enabled(); } int EchoCancellationProxy::GetMetrics(Metrics* metrics) { return echo_cancellation_->GetMetrics(metrics); } int EchoCancellationProxy::enable_delay_logging(bool enable) { return echo_cancellation_->enable_delay_logging(enable); } bool EchoCancellationProxy::is_delay_logging_enabled() const { return echo_cancellation_->is_delay_logging_enabled(); } int EchoCancellationProxy::GetDelayMetrics(int* median, int* std) { return echo_cancellation_->GetDelayMetrics(median, std); } int EchoCancellationProxy::GetDelayMetrics(int* median, int* std, float* fraction_poor_delays) { return echo_cancellation_->GetDelayMetrics(median, std, fraction_poor_delays); } struct AecCore* EchoCancellationProxy::aec_core() const { return echo_cancellation_->aec_core(); } } // namespace webrtc