This CL adds activation logic of the new APM level control

functionality and exposes the functionality using the
MediaConstraints.

The exposing of the feature through the  MediaConstraints
was done similarly to what was done for the intelligibility
enhancer in the CL
https://codereview.webrtc.org/1952123003

This CL is dependent on the CL https://codereview.webrtc.org/2090583002/ which contains
the level control functionality.

NOTRY=true
BUG=webrtc:5920

Review-Url: https://codereview.webrtc.org/2095563002
Cr-Commit-Position: refs/heads/master@{#13336}
This commit is contained in:
peah 2016-06-30 00:02:34 -07:00 committed by Commit bot
parent 17aac053f5
commit a3333bfafb
6 changed files with 69 additions and 27 deletions

View File

@ -49,6 +49,7 @@ void FromConstraints(const MediaConstraintsInterface::Constraints& constraints,
options->experimental_ns},
{MediaConstraintsInterface::kIntelligibilityEnhancer,
options->intelligibility_enhancer},
{MediaConstraintsInterface::kLevelControl, options->level_control},
{MediaConstraintsInterface::kHighpassFilter, options->highpass_filter},
{MediaConstraintsInterface::kTypingNoiseDetection,
options->typing_detection},

View File

@ -48,6 +48,7 @@ const char MediaConstraintsInterface::kExperimentalNoiseSuppression[] =
"googNoiseSuppression2";
const char MediaConstraintsInterface::kIntelligibilityEnhancer[] =
"intelligibilityEnhancer";
const char MediaConstraintsInterface::kLevelControl[] = "levelControl";
const char MediaConstraintsInterface::kHighpassFilter[] =
"googHighpassFilter";
const char MediaConstraintsInterface::kTypingNoiseDetection[] =

View File

@ -74,6 +74,7 @@ class MediaConstraintsInterface {
static const char kNoiseSuppression[]; // googNoiseSuppression
static const char kExperimentalNoiseSuppression[]; // googNoiseSuppression2
static const char kIntelligibilityEnhancer[]; // intelligibilityEnhancer
static const char kLevelControl[]; // levelControl
static const char kHighpassFilter[]; // googHighpassFilter
static const char kTypingNoiseDetection[]; // googTypingNoiseDetection
static const char kAudioMirroring[]; // googAudioMirroring

View File

@ -158,6 +158,7 @@ struct AudioOptions {
SetFrom(&delay_agnostic_aec, change.delay_agnostic_aec);
SetFrom(&experimental_ns, change.experimental_ns);
SetFrom(&intelligibility_enhancer, change.intelligibility_enhancer);
SetFrom(&level_control, change.level_control);
SetFrom(&tx_agc_target_dbov, change.tx_agc_target_dbov);
SetFrom(&tx_agc_digital_compression_gain,
change.tx_agc_digital_compression_gain);
@ -169,27 +170,30 @@ struct AudioOptions {
bool operator==(const AudioOptions& o) const {
return echo_cancellation == o.echo_cancellation &&
auto_gain_control == o.auto_gain_control &&
noise_suppression == o.noise_suppression &&
highpass_filter == o.highpass_filter &&
stereo_swapping == o.stereo_swapping &&
audio_jitter_buffer_max_packets == o.audio_jitter_buffer_max_packets &&
audio_jitter_buffer_fast_accelerate ==
o.audio_jitter_buffer_fast_accelerate &&
typing_detection == o.typing_detection &&
aecm_generate_comfort_noise == o.aecm_generate_comfort_noise &&
experimental_agc == o.experimental_agc &&
extended_filter_aec == o.extended_filter_aec &&
delay_agnostic_aec == o.delay_agnostic_aec &&
experimental_ns == o.experimental_ns &&
intelligibility_enhancer == o.intelligibility_enhancer &&
adjust_agc_delta == o.adjust_agc_delta &&
tx_agc_target_dbov == o.tx_agc_target_dbov &&
tx_agc_digital_compression_gain == o.tx_agc_digital_compression_gain &&
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;
auto_gain_control == o.auto_gain_control &&
noise_suppression == o.noise_suppression &&
highpass_filter == o.highpass_filter &&
stereo_swapping == o.stereo_swapping &&
audio_jitter_buffer_max_packets ==
o.audio_jitter_buffer_max_packets &&
audio_jitter_buffer_fast_accelerate ==
o.audio_jitter_buffer_fast_accelerate &&
typing_detection == o.typing_detection &&
aecm_generate_comfort_noise == o.aecm_generate_comfort_noise &&
experimental_agc == o.experimental_agc &&
extended_filter_aec == o.extended_filter_aec &&
delay_agnostic_aec == o.delay_agnostic_aec &&
experimental_ns == o.experimental_ns &&
intelligibility_enhancer == o.intelligibility_enhancer &&
level_control == o.level_control &&
adjust_agc_delta == o.adjust_agc_delta &&
tx_agc_target_dbov == o.tx_agc_target_dbov &&
tx_agc_digital_compression_gain ==
o.tx_agc_digital_compression_gain &&
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;
}
bool operator!=(const AudioOptions& o) const { return !(*this == o); }
@ -213,6 +217,7 @@ struct AudioOptions {
ost << ToStringIfSet("delay_agnostic_aec", delay_agnostic_aec);
ost << ToStringIfSet("experimental_ns", experimental_ns);
ost << ToStringIfSet("intelligibility_enhancer", intelligibility_enhancer);
ost << ToStringIfSet("level_control", level_control);
ost << ToStringIfSet("tx_agc_target_dbov", tx_agc_target_dbov);
ost << ToStringIfSet("tx_agc_digital_compression_gain",
tx_agc_digital_compression_gain);
@ -248,6 +253,7 @@ struct AudioOptions {
rtc::Optional<bool> delay_agnostic_aec;
rtc::Optional<bool> experimental_ns;
rtc::Optional<bool> intelligibility_enhancer;
rtc::Optional<bool> level_control;
// 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;

View File

@ -559,6 +559,7 @@ WebRtcVoiceEngine::WebRtcVoiceEngine(
options.delay_agnostic_aec = rtc::Optional<bool>(false);
options.experimental_ns = rtc::Optional<bool>(false);
options.intelligibility_enhancer = rtc::Optional<bool>(false);
options.level_control = rtc::Optional<bool>(false);
bool error = ApplyOptions(options);
RTC_DCHECK(error);
}
@ -682,9 +683,29 @@ bool WebRtcVoiceEngine::ApplyOptions(const AudioOptions& options_in) {
}
}
// Use optional to avoid uneccessary calls to BuiltInAGCIsAvailable while
// complying with the unittest requirements of only 1 call per test.
rtc::Optional<bool> built_in_agc_avaliable;
if (options.level_control) {
if (!built_in_agc_avaliable) {
built_in_agc_avaliable =
rtc::Optional<bool>(adm()->BuiltInAGCIsAvailable());
}
RTC_DCHECK(built_in_agc_avaliable);
if (*built_in_agc_avaliable) {
// Disable internal software level control if built-in AGC is enabled,
// i.e., replace the software AGC with the built-in AGC.
options.level_control = rtc::Optional<bool>(false);
}
}
if (options.auto_gain_control) {
const bool built_in_agc = adm()->BuiltInAGCIsAvailable();
if (built_in_agc) {
if (!built_in_agc_avaliable) {
built_in_agc_avaliable =
rtc::Optional<bool>(adm()->BuiltInAGCIsAvailable());
}
RTC_DCHECK(built_in_agc_avaliable);
if (*built_in_agc_avaliable) {
if (adm()->EnableBuiltInAGC(*options.auto_gain_control) == 0 &&
*options.auto_gain_control) {
// Disable internal software AGC if built-in AGC is enabled,
@ -841,6 +862,16 @@ bool WebRtcVoiceEngine::ApplyOptions(const AudioOptions& options_in) {
new webrtc::Intelligibility(*intelligibility_enhancer_));
}
if (options.level_control) {
level_control_ = options.level_control;
}
LOG(LS_INFO) << "Level control: "
<< (!!level_control_ ? *level_control_ : -1);
if (level_control_) {
config.Set<webrtc::LevelControl>(new webrtc::LevelControl(*level_control_));
}
// We check audioproc for the benefit of tests, since FakeWebRtcVoiceEngine
// returns NULL on audio_processing().
webrtc::AudioProcessing* audioproc = voe_wrapper_->base()->audio_processing();

View File

@ -138,14 +138,16 @@ class WebRtcVoiceEngine final : public webrtc::TraceCallback {
bool is_dumping_aec_ = false;
webrtc::AgcConfig default_agc_config_;
// Cache received extended_filter_aec, delay_agnostic_aec, experimental_ns and
// intelligibility_enhancer values, and apply them in case they are missing
// in the audio options. We need to do this because SetExtraOptions() will
// revert to defaults for options which are not provided.
// Cache received extended_filter_aec, delay_agnostic_aec, experimental_ns
// level controller, and intelligibility_enhancer values, and apply them
// in case they are missing in the audio options. We need to do this because
// SetExtraOptions() will revert to defaults for options which are not
// provided.
rtc::Optional<bool> extended_filter_aec_;
rtc::Optional<bool> delay_agnostic_aec_;
rtc::Optional<bool> experimental_ns_;
rtc::Optional<bool> intelligibility_enhancer_;
rtc::Optional<bool> level_control_;
RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(WebRtcVoiceEngine);
};