Reduce for reallocations the pre-amplifier and high-pass filter

This CL ensures that the pre-amplifier and the high-pass filter
submodules are not reallocated more than needed.

Bug: webrtc:5298
Change-Id: I7ed23807d4d2d9fef0eda2e7dca9de9b0b1a4649
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/163988
Commit-Queue: Per Åhgren <peah@webrtc.org>
Reviewed-by: Sam Zackrisson <saza@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#30143}
This commit is contained in:
Per Åhgren 2020-01-03 14:27:14 +01:00 committed by Commit Bot
parent df344bb8de
commit 0f14db22de
3 changed files with 25 additions and 6 deletions

View file

@ -509,7 +509,7 @@ int AudioProcessingImpl::InitializeLocked() {
submodules_.agc_manager->SetCaptureMuted(capture_.output_will_be_muted);
}
InitializeTransientSuppressor();
InitializeHighPassFilter();
InitializeHighPassFilter(true);
InitializeVoiceDetector();
InitializeResidualEchoDetector();
InitializeEchoController();
@ -665,6 +665,11 @@ void AudioProcessingImpl::ApplyConfig(const AudioProcessing::Config& config) {
const bool ts_config_changed = config_.transient_suppression.enabled !=
config.transient_suppression.enabled;
const bool pre_amplifier_config_changed =
config_.pre_amplifier.enabled != config.pre_amplifier.enabled ||
config_.pre_amplifier.fixed_gain_factor !=
config.pre_amplifier.fixed_gain_factor;
config_ = config;
if (aec_config_changed) {
@ -679,7 +684,7 @@ void AudioProcessingImpl::ApplyConfig(const AudioProcessing::Config& config) {
InitializeTransientSuppressor();
}
InitializeHighPassFilter();
InitializeHighPassFilter(false);
if (agc1_config_changed) {
ApplyAgc1Config(config_.gain_controller1);
@ -693,10 +698,14 @@ void AudioProcessingImpl::ApplyConfig(const AudioProcessing::Config& config) {
<< "\nReverting to default parameter set";
config_.gain_controller2 = AudioProcessing::Config::GainController2();
}
if (agc2_config_changed) {
InitializeGainController2();
}
if (pre_amplifier_config_changed) {
InitializePreAmplifier();
}
if (config_.level_estimation.enabled && !submodules_.output_level_estimator) {
submodules_.output_level_estimator = std::make_unique<LevelEstimator>();
@ -1780,7 +1789,7 @@ void AudioProcessingImpl::InitializeTransientSuppressor() {
}
}
void AudioProcessingImpl::InitializeHighPassFilter() {
void AudioProcessingImpl::InitializeHighPassFilter(bool forced_reset) {
bool high_pass_filter_needed_by_aec =
config_.echo_canceller.enabled &&
config_.echo_canceller.enforce_high_pass_filtering &&
@ -1794,7 +1803,13 @@ void AudioProcessingImpl::InitializeHighPassFilter() {
size_t num_channels =
use_full_band ? num_output_channels() : num_proc_channels();
submodules_.high_pass_filter.reset(new HighPassFilter(rate, num_channels));
if (!submodules_.high_pass_filter ||
rate != submodules_.high_pass_filter->sample_rate_hz() ||
forced_reset ||
num_channels != submodules_.high_pass_filter->num_channels()) {
submodules_.high_pass_filter.reset(
new HighPassFilter(rate, num_channels));
}
} else {
submodules_.high_pass_filter.reset();
}

View file

@ -236,7 +236,8 @@ class AudioProcessingImpl : public AudioProcessing {
// Initializations of capture-only submodules, requiring the capture lock
// already acquired.
void InitializeHighPassFilter() RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_capture_);
void InitializeHighPassFilter(bool forced_reset)
RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_capture_);
void InitializeVoiceDetector() RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_capture_);
void InitializeTransientSuppressor()
RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_capture_);

View file

@ -33,6 +33,9 @@ class HighPassFilter {
void Reset();
void Reset(size_t num_channels);
int sample_rate_hz() const { return sample_rate_hz_; }
size_t num_channels() const { return filters_.size(); }
private:
const int sample_rate_hz_;
std::vector<std::unique_ptr<CascadedBiQuadFilter>> filters_;