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