Index: webrtc/modules/audio_processing/level_controller/level_controller.cc |
diff --git a/webrtc/modules/audio_processing/level_controller/level_controller.cc b/webrtc/modules/audio_processing/level_controller/level_controller.cc |
index 247b7d0c615152d18003f32b5160f717e94e0305..b8388e6141bab4520cdc5964a8f98fe20cd0bec9 100644 |
--- a/webrtc/modules/audio_processing/level_controller/level_controller.cc |
+++ b/webrtc/modules/audio_processing/level_controller/level_controller.cc |
@@ -179,7 +179,8 @@ void LevelController::Metrics::Update(float long_term_peak_level, |
LevelController::LevelController() |
: data_dumper_(new ApmDataDumper(instance_count_)), |
gain_applier_(data_dumper_.get()), |
- signal_classifier_(data_dumper_.get()) { |
+ signal_classifier_(data_dumper_.get()), |
+ peak_level_estimator_(kTargetLcPeakLeveldBFS) { |
Initialize(AudioProcessing::kSampleRate48kHz); |
++instance_count_; |
} |
@@ -196,7 +197,7 @@ void LevelController::Initialize(int sample_rate_hz) { |
gain_applier_.Initialize(sample_rate_hz); |
signal_classifier_.Initialize(sample_rate_hz); |
noise_level_estimator_.Initialize(sample_rate_hz); |
- peak_level_estimator_.Initialize(); |
+ peak_level_estimator_.Initialize(config_.initial_peak_level_dbfs); |
saturating_gain_estimator_.Initialize(); |
metrics_.Initialize(sample_rate_hz); |
@@ -238,8 +239,12 @@ void LevelController::Process(AudioBuffer* audio) { |
float saturating_gain = saturating_gain_estimator_.GetGain(); |
// Compute the new gain to apply. |
- last_gain_ = gain_selector_.GetNewGain(long_term_peak_level, noise_energy, |
- saturating_gain, signal_type); |
+ last_gain_ = |
+ gain_selector_.GetNewGain(long_term_peak_level, noise_energy, |
+ saturating_gain, gain_jumpstart_, signal_type); |
+ |
+ // Unflag the jumpstart of the gain as it should only happen once. |
+ gain_jumpstart_ = false; |
// Apply the gain to the signal. |
int num_saturations = gain_applier_.Process(last_gain_, audio); |
@@ -260,17 +265,29 @@ void LevelController::Process(AudioBuffer* audio) { |
audio->channels_f()[0], *sample_rate_hz_, 1); |
} |
+void LevelController::ApplyConfig( |
+ const AudioProcessing::Config::LevelController& config) { |
+ RTC_DCHECK(Validate(config)); |
+ config_ = config; |
+ peak_level_estimator_.Initialize(config_.initial_peak_level_dbfs); |
+ gain_jumpstart_ = true; |
+} |
+ |
std::string LevelController::ToString( |
const AudioProcessing::Config::LevelController& config) { |
std::stringstream ss; |
ss << "{" |
- << "enabled: " << (config.enabled ? "true" : "false") << "}"; |
+ << "enabled: " << (config.enabled ? "true" : "false") << ", " |
+ << "initial_peak_level_dbfs: " << config.initial_peak_level_dbfs << "}"; |
return ss.str(); |
} |
bool LevelController::Validate( |
const AudioProcessing::Config::LevelController& config) { |
- return true; |
+ return (config.initial_peak_level_dbfs < |
+ std::numeric_limits<float>::epsilon() && |
+ config.initial_peak_level_dbfs > |
+ -(100.f + std::numeric_limits<float>::epsilon())); |
} |
} // namespace webrtc |