Added a level controller initialization value to MediaConstraints.

An audio track with a level controller with the correct initialization
value can be created by a combination of
PeerConnectionFactory::CreateAudioTrack(..., audio_source) and
either
audio_source = PeerConnectionFactory::CreateAudioSource(constraints) or
audio_source = PeerConnectionFactory::CreateAudioSource(audio_options).

NOTRY=True
BUG=webrtc:6386

Review-Url: https://codereview.webrtc.org/2408143003
Cr-Commit-Position: refs/heads/master@{#14693}
diff --git a/webrtc/api/localaudiosource.cc b/webrtc/api/localaudiosource.cc
index 53c426e..d91394e 100644
--- a/webrtc/api/localaudiosource.cc
+++ b/webrtc/api/localaudiosource.cc
@@ -66,6 +66,18 @@
         entry.value = rtc::Optional<bool>(value);
     }
   }
+
+  // Set non-boolean constraints.
+  std::string value;
+  if (constraints.FindFirst(
+          MediaConstraintsInterface::kLevelControlInitialPeakLevelDBFS,
+          &value)) {
+    float level_control_initial_peak_level_dbfs;
+    if (rtc::FromString(value, &level_control_initial_peak_level_dbfs)) {
+      options->level_control_initial_peak_level_dbfs =
+          rtc::Optional<float>(level_control_initial_peak_level_dbfs);
+    }
+  }
 }
 
 }  // namespace
diff --git a/webrtc/api/mediaconstraintsinterface.cc b/webrtc/api/mediaconstraintsinterface.cc
index 7ac7417..14a92c2 100644
--- a/webrtc/api/mediaconstraintsinterface.cc
+++ b/webrtc/api/mediaconstraintsinterface.cc
@@ -49,6 +49,8 @@
 const char MediaConstraintsInterface::kIntelligibilityEnhancer[] =
     "intelligibilityEnhancer";
 const char MediaConstraintsInterface::kLevelControl[] = "levelControl";
+const char MediaConstraintsInterface::kLevelControlInitialPeakLevelDBFS[] =
+    "levelControlInitialPeakLevelDBFS";
 const char MediaConstraintsInterface::kHighpassFilter[] =
     "googHighpassFilter";
 const char MediaConstraintsInterface::kTypingNoiseDetection[] =
diff --git a/webrtc/api/mediaconstraintsinterface.h b/webrtc/api/mediaconstraintsinterface.h
index d6fd6be..fbb1955 100644
--- a/webrtc/api/mediaconstraintsinterface.h
+++ b/webrtc/api/mediaconstraintsinterface.h
@@ -75,6 +75,8 @@
   static const char kExperimentalNoiseSuppression[];  // googNoiseSuppression2
   static const char kIntelligibilityEnhancer[];  // intelligibilityEnhancer
   static const char kLevelControl[];             // levelControl
+  static const char
+      kLevelControlInitialPeakLevelDBFS[];  // levelControlInitialPeakLevelDBFS
   static const char kHighpassFilter[];  // googHighpassFilter
   static const char kTypingNoiseDetection[];  // googTypingNoiseDetection
   static const char kAudioMirroring[];  // googAudioMirroring
diff --git a/webrtc/media/base/mediachannel.h b/webrtc/media/base/mediachannel.h
index 781a46d..3d21c31 100644
--- a/webrtc/media/base/mediachannel.h
+++ b/webrtc/media/base/mediachannel.h
@@ -168,6 +168,8 @@
     SetFrom(&recording_sample_rate, change.recording_sample_rate);
     SetFrom(&playout_sample_rate, change.playout_sample_rate);
     SetFrom(&combined_audio_video_bwe, change.combined_audio_video_bwe);
+    SetFrom(&level_control_initial_peak_level_dbfs,
+            change.level_control_initial_peak_level_dbfs);
   }
 
   bool operator==(const AudioOptions& o) const {
@@ -195,7 +197,9 @@
            tx_agc_limiter == o.tx_agc_limiter &&
            recording_sample_rate == o.recording_sample_rate &&
            playout_sample_rate == o.playout_sample_rate &&
-           combined_audio_video_bwe == o.combined_audio_video_bwe;
+           combined_audio_video_bwe == o.combined_audio_video_bwe &&
+           level_control_initial_peak_level_dbfs ==
+               o.level_control_initial_peak_level_dbfs;
   }
   bool operator!=(const AudioOptions& o) const { return !(*this == o); }
 
@@ -220,6 +224,8 @@
     ost << ToStringIfSet("experimental_ns", experimental_ns);
     ost << ToStringIfSet("intelligibility_enhancer", intelligibility_enhancer);
     ost << ToStringIfSet("level_control", level_control);
+    ost << ToStringIfSet("level_control_initial_peak_level_dbfs",
+                         level_control_initial_peak_level_dbfs);
     ost << ToStringIfSet("tx_agc_target_dbov", tx_agc_target_dbov);
     ost << ToStringIfSet("tx_agc_digital_compression_gain",
         tx_agc_digital_compression_gain);
@@ -256,6 +262,8 @@
   rtc::Optional<bool> experimental_ns;
   rtc::Optional<bool> intelligibility_enhancer;
   rtc::Optional<bool> level_control;
+  // Specifies an optional initialization value for the level controller.
+  rtc::Optional<float> level_control_initial_peak_level_dbfs;
   // Note that tx_agc_* only applies to non-experimental AGC.
   rtc::Optional<uint16_t> tx_agc_target_dbov;
   rtc::Optional<uint16_t> tx_agc_digital_compression_gain;
diff --git a/webrtc/media/engine/webrtcvoiceengine.cc b/webrtc/media/engine/webrtcvoiceengine.cc
index 8f24901..b9fd1f2 100644
--- a/webrtc/media/engine/webrtcvoiceengine.cc
+++ b/webrtc/media/engine/webrtcvoiceengine.cc
@@ -872,6 +872,10 @@
   webrtc::AudioProcessing::Config apm_config;
   if (level_control_) {
     apm_config.level_controller.enabled = *level_control_;
+    if (options.level_control_initial_peak_level_dbfs) {
+      apm_config.level_controller.initial_peak_level_dbfs =
+          *options.level_control_initial_peak_level_dbfs;
+    }
   }
 
   // We check audioproc for the benefit of tests, since FakeWebRtcVoiceEngine