diff --git a/webrtc/api/localaudiosource.cc b/webrtc/api/localaudiosource.cc index 53c426e011..d91394eebc 100644 --- a/webrtc/api/localaudiosource.cc +++ b/webrtc/api/localaudiosource.cc @@ -66,6 +66,18 @@ void FromConstraints(const MediaConstraintsInterface::Constraints& constraints, entry.value = rtc::Optional(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(level_control_initial_peak_level_dbfs); + } + } } } // namespace diff --git a/webrtc/api/mediaconstraintsinterface.cc b/webrtc/api/mediaconstraintsinterface.cc index 7ac7417669..14a92c22ed 100644 --- a/webrtc/api/mediaconstraintsinterface.cc +++ b/webrtc/api/mediaconstraintsinterface.cc @@ -49,6 +49,8 @@ const char MediaConstraintsInterface::kExperimentalNoiseSuppression[] = 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 d6fd6beb95..fbb19551e1 100644 --- a/webrtc/api/mediaconstraintsinterface.h +++ b/webrtc/api/mediaconstraintsinterface.h @@ -75,6 +75,8 @@ class MediaConstraintsInterface { 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 781a46d90c..3d21c31e82 100644 --- a/webrtc/media/base/mediachannel.h +++ b/webrtc/media/base/mediachannel.h @@ -168,6 +168,8 @@ struct AudioOptions { 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 @@ struct AudioOptions { 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 @@ struct AudioOptions { 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 @@ struct AudioOptions { rtc::Optional experimental_ns; rtc::Optional intelligibility_enhancer; rtc::Optional level_control; + // Specifies an optional initialization value for the level controller. + rtc::Optional level_control_initial_peak_level_dbfs; // Note that tx_agc_* only applies to non-experimental AGC. rtc::Optional tx_agc_target_dbov; rtc::Optional tx_agc_digital_compression_gain; diff --git a/webrtc/media/engine/webrtcvoiceengine.cc b/webrtc/media/engine/webrtcvoiceengine.cc index 8f2490112e..b9fd1f2a27 100644 --- a/webrtc/media/engine/webrtcvoiceengine.cc +++ b/webrtc/media/engine/webrtcvoiceengine.cc @@ -872,6 +872,10 @@ bool WebRtcVoiceEngine::ApplyOptions(const AudioOptions& options_in) { 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