AGC2: adding level estimation option (RMS or peak-based).

This CL makes possible to choose the level estimation for the adaptive
digital GC of AGC2. The options are RMS (default and currently used
estimator) and peak-based (already computed, but not used).

Besides adding the new AGC2 config param for the level estimator, this CL
also refactors the config class by making it more structured.

Bug: webrtc:7494
Change-Id: I20eb558ca50f13536aa7bdea08d21de3b630f8bc
Reviewed-on: https://webrtc-review.googlesource.com/c/110144
Commit-Queue: Alessio Bazzica <alessiob@webrtc.org>
Reviewed-by: Alex Loiko <aleloi@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#25620}
diff --git a/modules/audio_processing/gain_controller2.cc b/modules/audio_processing/gain_controller2.cc
index 06ad8f5..9b8cf45 100644
--- a/modules/audio_processing/gain_controller2.cc
+++ b/modules/audio_processing/gain_controller2.cc
@@ -65,30 +65,52 @@
   RTC_DCHECK(Validate(config))
       << " the invalid config was " << ToString(config);
 
-  if (config.fixed_gain_db != config_.fixed_gain_db) {
+  config_ = config;
+  if (config.fixed_digital.gain_db != config_.fixed_digital.gain_db) {
     // Reset the limiter to quickly react on abrupt level changes caused by
     // large changes of the fixed gain.
     limiter_.Reset();
   }
-  config_ = config;
-  gain_applier_.SetGainFactor(DbToRatio(config_.fixed_gain_db));
-  adaptive_digital_mode_ = config_.adaptive_digital_mode;
-  adaptive_agc_.reset(
-      new AdaptiveAgc(data_dumper_.get(), config_.extra_saturation_margin_db));
+  gain_applier_.SetGainFactor(DbToRatio(config_.fixed_digital.gain_db));
+  adaptive_digital_mode_ = config_.adaptive_digital.enabled;
+  adaptive_agc_.reset(new AdaptiveAgc(data_dumper_.get(), config_));
 }
 
 bool GainController2::Validate(
     const AudioProcessing::Config::GainController2& config) {
-  return config.fixed_gain_db >= 0.f && config.fixed_gain_db < 50.f &&
-         config.extra_saturation_margin_db >= 0.f &&
-         config.extra_saturation_margin_db <= 100.f;
+  return config.fixed_digital.gain_db >= 0.f &&
+         config.fixed_digital.gain_db < 50.f &&
+         config.adaptive_digital.extra_saturation_margin_db >= 0.f &&
+         config.adaptive_digital.extra_saturation_margin_db <= 100.f;
 }
 
 std::string GainController2::ToString(
     const AudioProcessing::Config::GainController2& config) {
   rtc::StringBuilder ss;
-  ss << "{enabled: " << (config.enabled ? "true" : "false") << ", "
-     << "fixed_gain_dB: " << config.fixed_gain_db << "}";
+  std::string adaptive_digital_level_estimator;
+  using LevelEstimatorType =
+      AudioProcessing::Config::GainController2::LevelEstimator;
+  switch (config.adaptive_digital.level_estimator) {
+    case LevelEstimatorType::kRms:
+      adaptive_digital_level_estimator = "RMS";
+      break;
+    case LevelEstimatorType::kPeak:
+      adaptive_digital_level_estimator = "peak";
+      break;
+  }
+  // clang-format off
+  // clang formatting doesn't respect custom nested style.
+  ss << "{"
+     << "enabled: " << (config.enabled ? "true" : "false") << ", "
+     << "fixed_digital: {gain_db: " << config.fixed_digital.gain_db << "}, "
+     << "adaptive_digital: {"
+      << "enabled: "
+        << (config.adaptive_digital.enabled ? "true" : "false") << ", "
+      << "level_estimator: " << adaptive_digital_level_estimator << ", "
+      << "extra_saturation_margin_db:"
+        << config.adaptive_digital.extra_saturation_margin_db << "}"
+      << "}";
+  // clang-format on
   return ss.Release();
 }