Add ToString method for AudioProcessing::Config

Bug: webrtc:10138
Change-Id: Icc0b40596867fd6fb8c1de5ca209dbafb504e50d
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/147726
Commit-Queue: Artem Titov <titovartem@webrtc.org>
Reviewed-by: Ivo Creusen <ivoc@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#28745}
diff --git a/modules/audio_processing/include/audio_processing.cc b/modules/audio_processing/include/audio_processing.cc
index 27cd882..46bb134 100644
--- a/modules/audio_processing/include/audio_processing.cc
+++ b/modules/audio_processing/include/audio_processing.cc
@@ -10,9 +10,91 @@
 
 #include "modules/audio_processing/include/audio_processing.h"
 
+#include "rtc_base/strings/string_builder.h"
+
 namespace webrtc {
+namespace {
+
+std::string NoiseSuppressionLevelToString(
+    const AudioProcessing::Config::NoiseSuppression::Level& level) {
+  switch (level) {
+    case AudioProcessing::Config::NoiseSuppression::Level::kLow:
+      return "Low";
+    case AudioProcessing::Config::NoiseSuppression::Level::kModerate:
+      return "Moderate";
+    case AudioProcessing::Config::NoiseSuppression::Level::kHigh:
+      return "High";
+    case AudioProcessing::Config::NoiseSuppression::Level::kVeryHigh:
+      return "VeryHigh";
+  }
+}
+
+std::string GainController1ModeToString(
+    const AudioProcessing::Config::GainController1::Mode& mode) {
+  switch (mode) {
+    case AudioProcessing::Config::GainController1::Mode::kAdaptiveAnalog:
+      return "AdaptiveAnalog";
+    case AudioProcessing::Config::GainController1::Mode::kAdaptiveDigital:
+      return "AdaptiveDigital";
+    case AudioProcessing::Config::GainController1::Mode::kFixedDigital:
+      return "FixedDigital";
+  }
+}
+
+std::string GainController2LevelEstimatorToString(
+    const AudioProcessing::Config::GainController2::LevelEstimator& level) {
+  switch (level) {
+    case AudioProcessing::Config::GainController2::LevelEstimator::kRms:
+      return "Rms";
+    case AudioProcessing::Config::GainController2::LevelEstimator::kPeak:
+      return "Peak";
+  }
+}
+
+}  // namespace
 
 void CustomProcessing::SetRuntimeSetting(
     AudioProcessing::RuntimeSetting setting) {}
 
+std::string AudioProcessing::Config::ToString() const {
+  char buf[1024];
+  rtc::SimpleStringBuilder builder(buf);
+  builder << "AudioProcessing::Config{ "
+          << "pre_amplifier: { enabled: " << pre_amplifier.enabled
+          << ", fixed_gain_factor: " << pre_amplifier.fixed_gain_factor
+          << " }, high_pass_filter: { enabled: " << high_pass_filter.enabled
+          << " }, echo_canceller: { enabled: " << echo_canceller.enabled
+          << ", mobile_mode: " << echo_canceller.mobile_mode
+          << ", legacy_moderate_suppression_level: "
+          << echo_canceller.legacy_moderate_suppression_level
+          << ", use_legacy_aec: " << echo_canceller.use_legacy_aec
+          << " }, noise_suppression: { enabled: " << noise_suppression.enabled
+          << ", level: "
+          << NoiseSuppressionLevelToString(noise_suppression.level)
+          << " }, voice_detection: { enabled: " << voice_detection.enabled
+          << " }, gain_controller1: { enabled: " << gain_controller1.enabled
+          << ", mode: " << GainController1ModeToString(gain_controller1.mode)
+          << ", target_level_dbfs: " << gain_controller1.target_level_dbfs
+          << ", compression_gain_db: " << gain_controller1.compression_gain_db
+          << ", enable_limiter: " << gain_controller1.enable_limiter
+          << ", analog_level_minimum: " << gain_controller1.analog_level_minimum
+          << ", analog_level_maximum: " << gain_controller1.analog_level_maximum
+          << " }, gain_controller2: { enabled: " << gain_controller2.enabled
+          << ", fixed_digital: { gain_db: "
+          << gain_controller2.fixed_digital.gain_db
+          << " }, adaptive_digital: { enabled: "
+          << gain_controller2.adaptive_digital.enabled << ", level_estimator: "
+          << GainController2LevelEstimatorToString(
+                 gain_controller2.adaptive_digital.level_estimator)
+          << ", use_saturation_protector: "
+          << gain_controller2.adaptive_digital.use_saturation_protector
+          << ", extra_saturation_margin_db: "
+          << gain_controller2.adaptive_digital.extra_saturation_margin_db
+          << " } }, residual_echo_detector: { enabled: "
+          << residual_echo_detector.enabled
+          << " }, level_estimation: { enabled: " << level_estimation.enabled
+          << " } }";
+  return builder.str();
+}
+
 }  // namespace webrtc
diff --git a/modules/audio_processing/include/audio_processing.h b/modules/audio_processing/include/audio_processing.h
index 4bcace2..eb12a66 100644
--- a/modules/audio_processing/include/audio_processing.h
+++ b/modules/audio_processing/include/audio_processing.h
@@ -370,6 +370,8 @@
       }
       return *this;
     }
+
+    std::string ToString() const;
   };
 
   // TODO(mgraczyk): Remove once all methods that use ChannelLayout are gone.