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-Original-Commit-Position: refs/heads/master@{#13336}
Cr-Mirrored-From: https://chromium.googlesource.com/external/webrtc
Cr-Mirrored-Commit: a3333bfafb9eca157b5d1bb59365b720ca9d7c38
diff --git a/api/localaudiosource.cc b/api/localaudiosource.cc
index 9da9fd2..53c426e 100644
--- a/api/localaudiosource.cc
+++ b/api/localaudiosource.cc
@@ -49,6 +49,7 @@
options->experimental_ns},
{MediaConstraintsInterface::kIntelligibilityEnhancer,
options->intelligibility_enhancer},
+ {MediaConstraintsInterface::kLevelControl, options->level_control},
{MediaConstraintsInterface::kHighpassFilter, options->highpass_filter},
{MediaConstraintsInterface::kTypingNoiseDetection,
options->typing_detection},
diff --git a/api/mediaconstraintsinterface.cc b/api/mediaconstraintsinterface.cc
index 6a014a2..7ac7417 100644
--- a/api/mediaconstraintsinterface.cc
+++ b/api/mediaconstraintsinterface.cc
@@ -48,6 +48,7 @@
"googNoiseSuppression2";
const char MediaConstraintsInterface::kIntelligibilityEnhancer[] =
"intelligibilityEnhancer";
+const char MediaConstraintsInterface::kLevelControl[] = "levelControl";
const char MediaConstraintsInterface::kHighpassFilter[] =
"googHighpassFilter";
const char MediaConstraintsInterface::kTypingNoiseDetection[] =
diff --git a/api/mediaconstraintsinterface.h b/api/mediaconstraintsinterface.h
index 13560dd..d6fd6be 100644
--- a/api/mediaconstraintsinterface.h
+++ b/api/mediaconstraintsinterface.h
@@ -74,6 +74,7 @@
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
diff --git a/media/base/mediachannel.h b/media/base/mediachannel.h
index bb30798..5a4124a 100644
--- a/media/base/mediachannel.h
+++ b/media/base/mediachannel.h
@@ -158,6 +158,7 @@
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 @@
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 @@
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 @@
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;
diff --git a/media/engine/webrtcvoiceengine.cc b/media/engine/webrtcvoiceengine.cc
index d329270..469098a 100644
--- a/media/engine/webrtcvoiceengine.cc
+++ b/media/engine/webrtcvoiceengine.cc
@@ -559,6 +559,7 @@
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 @@
}
}
+ // 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 @@
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();
diff --git a/media/engine/webrtcvoiceengine.h b/media/engine/webrtcvoiceengine.h
index 16da9ef..64e0f5b 100644
--- a/media/engine/webrtcvoiceengine.h
+++ b/media/engine/webrtcvoiceengine.h
@@ -138,14 +138,16 @@
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);
};