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}
This commit is contained in:
parent
647915fb95
commit
e33c5d918a
@ -66,6 +66,18 @@ void FromConstraints(const MediaConstraintsInterface::Constraints& constraints,
|
||||
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
|
||||
|
||||
@ -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[] =
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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<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;
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user