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 c0edeb91c50f5a472019f07eb45ce97910d9ea12..51551fd34bc0de061a2ba9900e631a1435660357 100644 |
--- a/webrtc/modules/audio_processing/level_controller/level_controller.cc |
+++ b/webrtc/modules/audio_processing/level_controller/level_controller.cc |
@@ -181,7 +181,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_; |
} |
@@ -198,7 +199,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); |
@@ -240,8 +241,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); |
@@ -262,17 +267,28 @@ void LevelController::Process(AudioBuffer* audio) { |
audio->channels_f()[0], *sample_rate_hz_, 1); |
} |
+void LevelController::ApplyConfig( |
+ const AudioProcessing::Config::LevelController& config) { |
the sun
2016/09/30 08:51:16
DCHECK the config is valid
peah-webrtc
2016/10/03 09:52:14
Done.
|
+ 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") << "," |
the sun
2016/09/30 08:51:16
nit: space after the comma: ", "
peah-webrtc
2016/10/03 09:52:14
Done.
|
+ << "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 |