Add noise suppression settings to AudioProcessing::Config
This Config configuration will eventually replace the AudioProcessing::noise_suppression() interface. This also introduces a proxy NoiseSuppression, returned by AudioProcessing::noise_suppression. Without this proxy, ApplyConfig could overwrite NS settings for clients who currently use noise_suppression(). For example, the following code will not preserve the noise suppression level: apm->noise_suppression()->set_level(NoiseSuppression::kHigh); auto cfg = apm->GetConfig(); apm->ApplyConfig(cfg); The NoiseSuppression instance returned by noise_suppression() has no way to update the config inside APM, so GetConfig() will return an out-of-date config which is then re-applied. This CL adds a proxy that makes this update, by forwarding Enable() and set_level() calls to ApplyConfig(). Drive-by change: AudioProcessing::Config substructs are reordered to mirror the capture processing pipeline. Tested: Ran ToT and this CL builds of audioproc_f and verified identical settings/aecdumps. Bug: webrtc:9947 Change-Id: I823eade894be115c254d656562564108b2b63b1f Reviewed-on: https://webrtc-review.googlesource.com/c/116521 Reviewed-by: Alex Loiko <aleloi@webrtc.org> Commit-Queue: Sam Zackrisson <saza@webrtc.org> Cr-Commit-Position: refs/heads/master@{#26248}
This commit is contained in:
committed by
Commit Bot
parent
cd7c21bfad
commit
235131303b
@ -34,6 +34,7 @@
|
||||
#include "modules/audio_processing/logging/apm_data_dumper.h"
|
||||
#include "modules/audio_processing/low_cut_filter.h"
|
||||
#include "modules/audio_processing/noise_suppression_impl.h"
|
||||
#include "modules/audio_processing/noise_suppression_proxy.h"
|
||||
#include "modules/audio_processing/residual_echo_detector.h"
|
||||
#include "modules/audio_processing/transient/transient_suppressor.h"
|
||||
#include "modules/audio_processing/voice_detection_impl.h"
|
||||
@ -107,6 +108,23 @@ int FindNativeProcessRateToUse(int minimum_rate, bool band_splitting_required) {
|
||||
return uppermost_native_rate;
|
||||
}
|
||||
|
||||
NoiseSuppression::Level NsConfigLevelToInterfaceLevel(
|
||||
AudioProcessing::Config::NoiseSuppression::Level level) {
|
||||
using NsConfig = AudioProcessing::Config::NoiseSuppression;
|
||||
switch (level) {
|
||||
case NsConfig::kLow:
|
||||
return NoiseSuppression::kLow;
|
||||
case NsConfig::kModerate:
|
||||
return NoiseSuppression::kModerate;
|
||||
case NsConfig::kHigh:
|
||||
return NoiseSuppression::kHigh;
|
||||
case NsConfig::kVeryHigh:
|
||||
return NoiseSuppression::kVeryHigh;
|
||||
default:
|
||||
RTC_NOTREACHED();
|
||||
}
|
||||
}
|
||||
|
||||
// Maximum lengths that frame of samples being passed from the render side to
|
||||
// the capture side can have (does not apply to AEC3).
|
||||
static const size_t kMaxAllowedValuesOfSamplesPerBand = 160;
|
||||
@ -232,9 +250,12 @@ bool AudioProcessingImpl::ApmSubmoduleStates::LowCutFilteringRequired() const {
|
||||
struct AudioProcessingImpl::ApmPublicSubmodules {
|
||||
ApmPublicSubmodules() {}
|
||||
// Accessed externally of APM without any lock acquired.
|
||||
// TODO(bugs.webrtc.org/9947): Move these submodules into private_submodules_
|
||||
// when their pointer-to-submodule API functions are gone.
|
||||
std::unique_ptr<GainControlImpl> gain_control;
|
||||
std::unique_ptr<LevelEstimatorImpl> level_estimator;
|
||||
std::unique_ptr<NoiseSuppressionImpl> noise_suppression;
|
||||
std::unique_ptr<NoiseSuppressionProxy> noise_suppression_proxy;
|
||||
std::unique_ptr<VoiceDetectionImpl> voice_detection;
|
||||
std::unique_ptr<GainControlForExperimentalAgc>
|
||||
gain_control_for_experimental_agc;
|
||||
@ -380,6 +401,8 @@ AudioProcessingImpl::AudioProcessingImpl(
|
||||
new LevelEstimatorImpl(&crit_capture_));
|
||||
public_submodules_->noise_suppression.reset(
|
||||
new NoiseSuppressionImpl(&crit_capture_));
|
||||
public_submodules_->noise_suppression_proxy.reset(new NoiseSuppressionProxy(
|
||||
this, public_submodules_->noise_suppression.get()));
|
||||
public_submodules_->voice_detection.reset(
|
||||
new VoiceDetectionImpl(&crit_capture_));
|
||||
public_submodules_->gain_control_for_experimental_agc.reset(
|
||||
@ -664,6 +687,11 @@ void AudioProcessingImpl::ApplyConfig(const AudioProcessing::Config& config) {
|
||||
? EchoCancellationImpl::SuppressionLevel::kModerateSuppression
|
||||
: EchoCancellationImpl::SuppressionLevel::kHighSuppression);
|
||||
|
||||
public_submodules_->noise_suppression->Enable(
|
||||
config.noise_suppression.enabled);
|
||||
public_submodules_->noise_suppression->set_level(
|
||||
NsConfigLevelToInterfaceLevel(config.noise_suppression.level));
|
||||
|
||||
InitializeLowCutFilter();
|
||||
|
||||
RTC_LOG(LS_INFO) << "Highpass filter activated: "
|
||||
@ -1690,7 +1718,7 @@ LevelEstimator* AudioProcessingImpl::level_estimator() const {
|
||||
}
|
||||
|
||||
NoiseSuppression* AudioProcessingImpl::noise_suppression() const {
|
||||
return public_submodules_->noise_suppression.get();
|
||||
return public_submodules_->noise_suppression_proxy.get();
|
||||
}
|
||||
|
||||
VoiceDetection* AudioProcessingImpl::voice_detection() const {
|
||||
|
||||
Reference in New Issue
Block a user