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 acbc80c9ddd5742c5065fd93d5c724f0f3853c05..d44de9b3547826eddfd2b88ffb424fe0bf85329a 100644 |
--- a/webrtc/modules/audio_processing/audio_processing_impl.cc |
+++ b/webrtc/modules/audio_processing/audio_processing_impl.cc |
@@ -28,12 +28,12 @@ |
#include "webrtc/modules/audio_processing/echo_control_mobile_impl.h" |
#include "webrtc/modules/audio_processing/gain_control_for_experimental_agc.h" |
#include "webrtc/modules/audio_processing/gain_control_impl.h" |
-#include "webrtc/modules/audio_processing/high_pass_filter_impl.h" |
#if WEBRTC_INTELLIGIBILITY_ENHANCER |
#include "webrtc/modules/audio_processing/intelligibility/intelligibility_enhancer.h" |
#endif |
#include "webrtc/modules/audio_processing/level_controller/level_controller.h" |
#include "webrtc/modules/audio_processing/level_estimator_impl.h" |
+#include "webrtc/modules/audio_processing/low_cut_filter.h" |
#include "webrtc/modules/audio_processing/noise_suppression_impl.h" |
#include "webrtc/modules/audio_processing/transient/transient_suppressor.h" |
#include "webrtc/modules/audio_processing/voice_detection_impl.h" |
@@ -126,6 +126,29 @@ static const size_t kMaxAllowedValuesOfSamplesPerFrame = 160; |
// reverse and forward call numbers. |
static const size_t kMaxNumFramesToBuffer = 100; |
+class HighPassFilterImpl : public HighPassFilter { |
+ public: |
+ explicit HighPassFilterImpl(AudioProcessingImpl* apm) : apm_(apm) {} |
+ ~HighPassFilterImpl() override = default; |
+ |
+ // HighPassFilter implementation. |
+ int Enable(bool enable) override { |
+ apm_->MutateConfig([enable](AudioProcessing::Config* config) { |
+ config->high_pass_filter.enabled = enable; |
+ }); |
+ |
+ return AudioProcessing::kNoError; |
+ } |
+ |
+ bool is_enabled() const override { |
+ return apm_->GetConfig().high_pass_filter.enabled; |
+ } |
+ |
+ private: |
+ AudioProcessingImpl* apm_; |
+ RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(HighPassFilterImpl); |
+}; |
+ |
} // namespace |
// Throughout webrtc, it's assumed that success is represented by zero. |
@@ -134,7 +157,7 @@ static_assert(AudioProcessing::kNoError == 0, "kNoError must be zero"); |
AudioProcessingImpl::ApmSubmoduleStates::ApmSubmoduleStates() {} |
bool AudioProcessingImpl::ApmSubmoduleStates::Update( |
- bool high_pass_filter_enabled, |
+ bool low_cut_filter_enabled, |
bool echo_canceller_enabled, |
bool mobile_echo_controller_enabled, |
bool noise_suppressor_enabled, |
@@ -146,7 +169,7 @@ bool AudioProcessingImpl::ApmSubmoduleStates::Update( |
bool level_estimator_enabled, |
bool transient_suppressor_enabled) { |
bool changed = false; |
- changed |= (high_pass_filter_enabled != high_pass_filter_enabled_); |
+ changed |= (low_cut_filter_enabled != low_cut_filter_enabled_); |
changed |= (echo_canceller_enabled != echo_canceller_enabled_); |
changed |= |
(mobile_echo_controller_enabled != mobile_echo_controller_enabled_); |
@@ -162,7 +185,7 @@ bool AudioProcessingImpl::ApmSubmoduleStates::Update( |
(voice_activity_detector_enabled != voice_activity_detector_enabled_); |
changed |= (transient_suppressor_enabled != transient_suppressor_enabled_); |
if (changed) { |
- high_pass_filter_enabled_ = high_pass_filter_enabled; |
+ low_cut_filter_enabled_ = low_cut_filter_enabled; |
echo_canceller_enabled_ = echo_canceller_enabled; |
mobile_echo_controller_enabled_ = mobile_echo_controller_enabled; |
noise_suppressor_enabled_ = noise_suppressor_enabled; |
@@ -192,7 +215,7 @@ bool AudioProcessingImpl::ApmSubmoduleStates::CaptureMultiBandSubModulesActive() |
bool AudioProcessingImpl::ApmSubmoduleStates::CaptureMultiBandProcessingActive() |
const { |
- return high_pass_filter_enabled_ || echo_canceller_enabled_ || |
+ return low_cut_filter_enabled_ || echo_canceller_enabled_ || |
mobile_echo_controller_enabled_ || noise_suppressor_enabled_ || |
beamformer_enabled_ || adaptive_gain_controller_enabled_; |
} |
@@ -218,7 +241,6 @@ struct AudioProcessingImpl::ApmPublicSubmodules { |
std::unique_ptr<EchoCancellationImpl> echo_cancellation; |
std::unique_ptr<EchoControlMobileImpl> echo_control_mobile; |
std::unique_ptr<GainControlImpl> gain_control; |
- std::unique_ptr<HighPassFilterImpl> high_pass_filter; |
std::unique_ptr<LevelEstimatorImpl> level_estimator; |
std::unique_ptr<NoiseSuppressionImpl> noise_suppression; |
std::unique_ptr<VoiceDetectionImpl> voice_detection; |
@@ -238,6 +260,7 @@ struct AudioProcessingImpl::ApmPrivateSubmodules { |
// Accessed internally from capture or during initialization |
std::unique_ptr<NonlinearBeamformer> beamformer; |
std::unique_ptr<AgcManagerDirect> agc_manager; |
+ std::unique_ptr<LowCutFilter> low_cut_filter; |
std::unique_ptr<LevelController> level_controller; |
}; |
@@ -266,7 +289,8 @@ AudioProcessingImpl::AudioProcessingImpl(const webrtc::Config& config) |
AudioProcessingImpl::AudioProcessingImpl(const webrtc::Config& config, |
NonlinearBeamformer* beamformer) |
- : public_submodules_(new ApmPublicSubmodules()), |
+ : high_pass_filter_impl_(new HighPassFilterImpl(this)), |
+ public_submodules_(new ApmPublicSubmodules()), |
private_submodules_(new ApmPrivateSubmodules(beamformer)), |
constants_(config.Get<ExperimentalAgc>().startup_min_volume, |
#if defined(WEBRTC_ANDROID) || defined(WEBRTC_IOS) |
@@ -293,8 +317,6 @@ AudioProcessingImpl::AudioProcessingImpl(const webrtc::Config& config, |
new EchoControlMobileImpl(&crit_render_, &crit_capture_)); |
public_submodules_->gain_control.reset( |
new GainControlImpl(&crit_capture_, &crit_capture_)); |
- public_submodules_->high_pass_filter.reset( |
- new HighPassFilterImpl(&crit_capture_)); |
public_submodules_->level_estimator.reset( |
new LevelEstimatorImpl(&crit_capture_)); |
public_submodules_->noise_suppression.reset( |
@@ -463,8 +485,7 @@ int AudioProcessingImpl::InitializeLocked() { |
#if WEBRTC_INTELLIGIBILITY_ENHANCER |
InitializeIntelligibility(); |
#endif |
- public_submodules_->high_pass_filter->Initialize(num_proc_channels(), |
- proc_sample_rate_hz()); |
+ InitializeLowCutFilter(); |
public_submodules_->noise_suppression->Initialize(num_proc_channels(), |
proc_sample_rate_hz()); |
public_submodules_->voice_detection->Initialize(proc_split_sample_rate_hz()); |
@@ -586,6 +607,11 @@ void AudioProcessingImpl::ApplyConfig(const AudioProcessing::Config& config) { |
<< capture_nonlocked_.level_controller_enabled; |
private_submodules_->level_controller->ApplyConfig(config_.level_controller); |
+ |
+ InitializeLowCutFilter(); |
+ |
+ LOG(LS_INFO) << "Highpass filter activated: " |
+ << config_.high_pass_filter.enabled; |
} |
void AudioProcessingImpl::SetExtraOptions(const webrtc::Config& config) { |
@@ -1034,7 +1060,9 @@ int AudioProcessingImpl::ProcessCaptureStreamLocked() { |
capture_buffer->set_num_channels(1); |
} |
- public_submodules_->high_pass_filter->ProcessCaptureAudio(capture_buffer); |
+ if (private_submodules_->low_cut_filter) { |
+ private_submodules_->low_cut_filter->Process(capture_buffer); |
+ } |
RETURN_ON_ERR( |
public_submodules_->gain_control->AnalyzeCaptureAudio(capture_buffer)); |
public_submodules_->noise_suppression->AnalyzeCaptureAudio(capture_buffer); |
@@ -1434,7 +1462,7 @@ GainControl* AudioProcessingImpl::gain_control() const { |
} |
HighPassFilter* AudioProcessingImpl::high_pass_filter() const { |
- return public_submodules_->high_pass_filter.get(); |
+ return high_pass_filter_impl_.get(); |
} |
LevelEstimator* AudioProcessingImpl::level_estimator() const { |
@@ -1449,9 +1477,23 @@ VoiceDetection* AudioProcessingImpl::voice_detection() const { |
return public_submodules_->voice_detection.get(); |
} |
+void AudioProcessingImpl::MutateConfig( |
+ std::function<void(AudioProcessing::Config*)> mutator) { |
+ rtc::CritScope cs_render(&crit_render_); |
+ rtc::CritScope cs_capture(&crit_capture_); |
+ mutator(&config_); |
+ ApplyConfig(config_); |
+} |
+ |
+AudioProcessing::Config AudioProcessingImpl::GetConfig() const { |
+ rtc::CritScope cs_render(&crit_render_); |
+ rtc::CritScope cs_capture(&crit_capture_); |
+ return config_; |
+} |
+ |
bool AudioProcessingImpl::UpdateActiveSubmoduleStates() { |
return submodule_states_.Update( |
- public_submodules_->high_pass_filter->is_enabled(), |
+ config_.high_pass_filter.enabled, |
public_submodules_->echo_cancellation->is_enabled(), |
public_submodules_->echo_control_mobile->is_enabled(), |
public_submodules_->noise_suppression->is_enabled(), |
@@ -1499,6 +1541,15 @@ void AudioProcessingImpl::InitializeIntelligibility() { |
#endif |
} |
+void AudioProcessingImpl::InitializeLowCutFilter() { |
+ if (config_.high_pass_filter.enabled) { |
+ private_submodules_->low_cut_filter.reset( |
+ new LowCutFilter(num_proc_channels(), proc_sample_rate_hz())); |
+ } else { |
+ private_submodules_->low_cut_filter.reset(); |
+ } |
+} |
+ |
void AudioProcessingImpl::InitializeLevelController() { |
private_submodules_->level_controller->Initialize(proc_sample_rate_hz()); |
} |
@@ -1678,7 +1729,7 @@ int AudioProcessingImpl::WriteConfigMessage(bool forced) { |
public_submodules_->gain_control->is_limiter_enabled()); |
config.set_noise_robust_agc_enabled(constants_.use_experimental_agc); |
- config.set_hpf_enabled(public_submodules_->high_pass_filter->is_enabled()); |
+ config.set_hpf_enabled(config_.high_pass_filter.enabled); |
config.set_ns_enabled(public_submodules_->noise_suppression->is_enabled()); |
config.set_ns_level( |