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

View file

@ -236,7 +236,8 @@ class AudioProcessingImpl : public AudioProcessing {
// Initializations of capture-only submodules, requiring the capture lock // Initializations of capture-only submodules, requiring the capture lock
// already acquired. // 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 InitializeVoiceDetector() RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_capture_);
void InitializeTransientSuppressor() void InitializeTransientSuppressor()
RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_capture_); RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_capture_);

View file

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