28
28
#include " webrtc/modules/audio_processing/echo_control_mobile_impl.h"
29
29
#include " webrtc/modules/audio_processing/gain_control_for_experimental_agc.h"
30
30
#include " webrtc/modules/audio_processing/gain_control_impl.h"
31
- #include " webrtc/modules/audio_processing/high_pass_filter_impl.h"
32
31
#if WEBRTC_INTELLIGIBILITY_ENHANCER
33
32
#include " webrtc/modules/audio_processing/intelligibility/intelligibility_enhancer.h"
34
33
#endif
35
34
#include " webrtc/modules/audio_processing/level_controller/level_controller.h"
36
35
#include " webrtc/modules/audio_processing/level_estimator_impl.h"
36
+ #include " webrtc/modules/audio_processing/low_cut_filter.h"
37
37
#include " webrtc/modules/audio_processing/noise_suppression_impl.h"
38
38
#include " webrtc/modules/audio_processing/residual_echo_detector.h"
39
39
#include " webrtc/modules/audio_processing/transient/transient_suppressor.h"
@@ -127,6 +127,29 @@ static const size_t kMaxAllowedValuesOfSamplesPerFrame = 160;
127
127
// reverse and forward call numbers.
128
128
static const size_t kMaxNumFramesToBuffer = 100 ;
129
129
130
+ class HighPassFilterImpl : public HighPassFilter {
131
+ public:
132
+ explicit HighPassFilterImpl (AudioProcessingImpl* apm) : apm_(apm) {}
133
+ ~HighPassFilterImpl () override = default ;
134
+
135
+ // HighPassFilter implementation.
136
+ int Enable (bool enable) override {
137
+ apm_->MutateConfig ([enable](AudioProcessing::Config* config) {
138
+ config->high_pass_filter .enabled = enable;
139
+ });
140
+
141
+ return AudioProcessing::kNoError ;
142
+ }
143
+
144
+ bool is_enabled () const override {
145
+ return apm_->GetConfig ().high_pass_filter .enabled ;
146
+ }
147
+
148
+ private:
149
+ AudioProcessingImpl* apm_;
150
+ RTC_DISALLOW_IMPLICIT_CONSTRUCTORS (HighPassFilterImpl);
151
+ };
152
+
130
153
} // namespace
131
154
132
155
// Throughout webrtc, it's assumed that success is represented by zero.
@@ -135,7 +158,7 @@ static_assert(AudioProcessing::kNoError == 0, "kNoError must be zero");
135
158
AudioProcessingImpl::ApmSubmoduleStates::ApmSubmoduleStates () {}
136
159
137
160
bool AudioProcessingImpl::ApmSubmoduleStates::Update (
138
- bool high_pass_filter_enabled ,
161
+ bool low_cut_filter_enabled ,
139
162
bool echo_canceller_enabled,
140
163
bool mobile_echo_controller_enabled,
141
164
bool residual_echo_detector_enabled,
@@ -148,7 +171,7 @@ bool AudioProcessingImpl::ApmSubmoduleStates::Update(
148
171
bool level_estimator_enabled,
149
172
bool transient_suppressor_enabled) {
150
173
bool changed = false ;
151
- changed |= (high_pass_filter_enabled != high_pass_filter_enabled_ );
174
+ changed |= (low_cut_filter_enabled != low_cut_filter_enabled_ );
152
175
changed |= (echo_canceller_enabled != echo_canceller_enabled_);
153
176
changed |=
154
177
(mobile_echo_controller_enabled != mobile_echo_controller_enabled_);
@@ -166,7 +189,7 @@ bool AudioProcessingImpl::ApmSubmoduleStates::Update(
166
189
(voice_activity_detector_enabled != voice_activity_detector_enabled_);
167
190
changed |= (transient_suppressor_enabled != transient_suppressor_enabled_);
168
191
if (changed) {
169
- high_pass_filter_enabled_ = high_pass_filter_enabled ;
192
+ low_cut_filter_enabled_ = low_cut_filter_enabled ;
170
193
echo_canceller_enabled_ = echo_canceller_enabled;
171
194
mobile_echo_controller_enabled_ = mobile_echo_controller_enabled;
172
195
residual_echo_detector_enabled_ = residual_echo_detector_enabled;
@@ -199,7 +222,7 @@ bool AudioProcessingImpl::ApmSubmoduleStates::CaptureMultiBandSubModulesActive()
199
222
200
223
bool AudioProcessingImpl::ApmSubmoduleStates::CaptureMultiBandProcessingActive ()
201
224
const {
202
- return high_pass_filter_enabled_ || echo_canceller_enabled_ ||
225
+ return low_cut_filter_enabled_ || echo_canceller_enabled_ ||
203
226
mobile_echo_controller_enabled_ || noise_suppressor_enabled_ ||
204
227
beamformer_enabled_ || adaptive_gain_controller_enabled_;
205
228
}
@@ -226,7 +249,6 @@ struct AudioProcessingImpl::ApmPublicSubmodules {
226
249
std::unique_ptr<EchoCancellationImpl> echo_cancellation;
227
250
std::unique_ptr<EchoControlMobileImpl> echo_control_mobile;
228
251
std::unique_ptr<GainControlImpl> gain_control;
229
- std::unique_ptr<HighPassFilterImpl> high_pass_filter;
230
252
std::unique_ptr<LevelEstimatorImpl> level_estimator;
231
253
std::unique_ptr<NoiseSuppressionImpl> noise_suppression;
232
254
std::unique_ptr<VoiceDetectionImpl> voice_detection;
@@ -246,6 +268,7 @@ struct AudioProcessingImpl::ApmPrivateSubmodules {
246
268
// Accessed internally from capture or during initialization
247
269
std::unique_ptr<NonlinearBeamformer> beamformer;
248
270
std::unique_ptr<AgcManagerDirect> agc_manager;
271
+ std::unique_ptr<LowCutFilter> low_cut_filter;
249
272
std::unique_ptr<LevelController> level_controller;
250
273
std::unique_ptr<ResidualEchoDetector> residual_echo_detector;
251
274
};
@@ -275,7 +298,8 @@ AudioProcessingImpl::AudioProcessingImpl(const webrtc::Config& config)
275
298
276
299
AudioProcessingImpl::AudioProcessingImpl (const webrtc::Config& config,
277
300
NonlinearBeamformer* beamformer)
278
- : public_submodules_(new ApmPublicSubmodules()),
301
+ : high_pass_filter_impl_(new HighPassFilterImpl(this )),
302
+ public_submodules_ (new ApmPublicSubmodules()),
279
303
private_submodules_(new ApmPrivateSubmodules(beamformer)),
280
304
constants_(config.Get<ExperimentalAgc>().startup_min_volume,
281
305
#if defined(WEBRTC_ANDROID) || defined(WEBRTC_IOS)
@@ -302,8 +326,6 @@ AudioProcessingImpl::AudioProcessingImpl(const webrtc::Config& config,
302
326
new EchoControlMobileImpl (&crit_render_, &crit_capture_));
303
327
public_submodules_->gain_control .reset (
304
328
new GainControlImpl (&crit_capture_, &crit_capture_));
305
- public_submodules_->high_pass_filter .reset (
306
- new HighPassFilterImpl (&crit_capture_));
307
329
public_submodules_->level_estimator .reset (
308
330
new LevelEstimatorImpl (&crit_capture_));
309
331
public_submodules_->noise_suppression .reset (
@@ -478,8 +500,7 @@ int AudioProcessingImpl::InitializeLocked() {
478
500
#if WEBRTC_INTELLIGIBILITY_ENHANCER
479
501
InitializeIntelligibility ();
480
502
#endif
481
- public_submodules_->high_pass_filter ->Initialize (num_proc_channels (),
482
- proc_sample_rate_hz ());
503
+ InitializeLowCutFilter ();
483
504
public_submodules_->noise_suppression ->Initialize (num_proc_channels (),
484
505
proc_sample_rate_hz ());
485
506
public_submodules_->voice_detection ->Initialize (proc_split_sample_rate_hz ());
@@ -602,6 +623,11 @@ void AudioProcessingImpl::ApplyConfig(const AudioProcessing::Config& config) {
602
623
<< capture_nonlocked_.level_controller_enabled ;
603
624
604
625
private_submodules_->level_controller ->ApplyConfig (config_.level_controller );
626
+
627
+ InitializeLowCutFilter ();
628
+
629
+ LOG (LS_INFO) << " Highpass filter activated: "
630
+ << config_.high_pass_filter .enabled ;
605
631
}
606
632
607
633
void AudioProcessingImpl::SetExtraOptions (const webrtc::Config& config) {
@@ -1089,7 +1115,9 @@ int AudioProcessingImpl::ProcessCaptureStreamLocked() {
1089
1115
capture_buffer->set_num_channels (1 );
1090
1116
}
1091
1117
1092
- public_submodules_->high_pass_filter ->ProcessCaptureAudio (capture_buffer);
1118
+ if (private_submodules_->low_cut_filter ) {
1119
+ private_submodules_->low_cut_filter ->Process (capture_buffer);
1120
+ }
1093
1121
RETURN_ON_ERR (
1094
1122
public_submodules_->gain_control ->AnalyzeCaptureAudio (capture_buffer));
1095
1123
public_submodules_->noise_suppression ->AnalyzeCaptureAudio (capture_buffer);
@@ -1523,7 +1551,7 @@ GainControl* AudioProcessingImpl::gain_control() const {
1523
1551
}
1524
1552
1525
1553
HighPassFilter* AudioProcessingImpl::high_pass_filter () const {
1526
- return public_submodules_-> high_pass_filter .get ();
1554
+ return high_pass_filter_impl_ .get ();
1527
1555
}
1528
1556
1529
1557
LevelEstimator* AudioProcessingImpl::level_estimator () const {
@@ -1538,9 +1566,23 @@ VoiceDetection* AudioProcessingImpl::voice_detection() const {
1538
1566
return public_submodules_->voice_detection .get ();
1539
1567
}
1540
1568
1569
+ void AudioProcessingImpl::MutateConfig (
1570
+ rtc::FunctionView<void (AudioProcessing::Config*)> mutator) {
1571
+ rtc::CritScope cs_render (&crit_render_);
1572
+ rtc::CritScope cs_capture (&crit_capture_);
1573
+ mutator (&config_);
1574
+ ApplyConfig (config_);
1575
+ }
1576
+
1577
+ AudioProcessing::Config AudioProcessingImpl::GetConfig () const {
1578
+ rtc::CritScope cs_render (&crit_render_);
1579
+ rtc::CritScope cs_capture (&crit_capture_);
1580
+ return config_;
1581
+ }
1582
+
1541
1583
bool AudioProcessingImpl::UpdateActiveSubmoduleStates () {
1542
1584
return submodule_states_.Update (
1543
- public_submodules_-> high_pass_filter -> is_enabled () ,
1585
+ config_. high_pass_filter . enabled ,
1544
1586
public_submodules_->echo_cancellation ->is_enabled (),
1545
1587
public_submodules_->echo_control_mobile ->is_enabled (),
1546
1588
config_.residual_echo_detector .enabled ,
@@ -1589,6 +1631,15 @@ void AudioProcessingImpl::InitializeIntelligibility() {
1589
1631
#endif
1590
1632
}
1591
1633
1634
+ void AudioProcessingImpl::InitializeLowCutFilter () {
1635
+ if (config_.high_pass_filter .enabled ) {
1636
+ private_submodules_->low_cut_filter .reset (
1637
+ new LowCutFilter (num_proc_channels (), proc_sample_rate_hz ()));
1638
+ } else {
1639
+ private_submodules_->low_cut_filter .reset ();
1640
+ }
1641
+ }
1642
+
1592
1643
void AudioProcessingImpl::InitializeLevelController () {
1593
1644
private_submodules_->level_controller ->Initialize (proc_sample_rate_hz ());
1594
1645
}
@@ -1772,7 +1823,7 @@ int AudioProcessingImpl::WriteConfigMessage(bool forced) {
1772
1823
public_submodules_->gain_control ->is_limiter_enabled ());
1773
1824
config.set_noise_robust_agc_enabled (constants_.use_experimental_agc );
1774
1825
1775
- config.set_hpf_enabled (public_submodules_-> high_pass_filter -> is_enabled () );
1826
+ config.set_hpf_enabled (config_. high_pass_filter . enabled );
1776
1827
1777
1828
config.set_ns_enabled (public_submodules_->noise_suppression ->is_enabled ());
1778
1829
config.set_ns_level (
0 commit comments