From a6fe261b97eeb4a027d04dac4fa4d560ca66bd68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20M=C3=B6ller?= Date: Fri, 19 Jan 2018 11:28:54 +0100 Subject: [PATCH] Move AudioOptions to its own header file and target. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It is part of our api. With the intention to later delete the inclusion of mediachannel.h from api/peerconnectioninterface.h, and eliminate circular dependencies. Bug: webrtc:7504 Change-Id: If44efd14d85675530e457760a1c4a1d338f931b7 Reviewed-on: https://webrtc-review.googlesource.com/41281 Reviewed-by: Fredrik Solenberg Reviewed-by: Patrik Höglund Commit-Queue: Niels Moller Cr-Commit-Position: refs/heads/master@{#21694} --- api/BUILD.gn | 13 +++ api/audio_options.h | 206 ++++++++++++++++++++++++++++++++++ api/peerconnectioninterface.h | 1 + media/BUILD.gn | 1 + media/base/mediachannel.h | 171 +--------------------------- 5 files changed, 222 insertions(+), 170 deletions(-) create mode 100644 api/audio_options.h diff --git a/api/BUILD.gn b/api/BUILD.gn index e3af7bbf2f..59efbf8e95 100644 --- a/api/BUILD.gn +++ b/api/BUILD.gn @@ -91,6 +91,7 @@ rtc_static_library("libjingle_peerconnection_api") { deps = [ ":array_view", + ":audio_options_api", ":optional", ":peerconnection_and_implicit_call_api", ":rtc_stats_api", @@ -197,6 +198,18 @@ rtc_source_set("audio_mixer_api") { ] } +rtc_source_set("audio_options_api") { + visibility = [ "*" ] + sources = [ + "audio_options.h", + ] + + deps = [ + ":optional", + "../rtc_base:rtc_base_approved", + ] +} + rtc_source_set("transport_api") { visibility = [ "*" ] sources = [ diff --git a/api/audio_options.h b/api/audio_options.h new file mode 100644 index 0000000000..d62e1f8e9b --- /dev/null +++ b/api/audio_options.h @@ -0,0 +1,206 @@ +/* + * Copyright (c) 2018 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#ifndef API_AUDIO_OPTIONS_H_ +#define API_AUDIO_OPTIONS_H_ + +#include + +#include "api/optional.h" +#include "rtc_base/stringencode.h" + +namespace cricket { + +// Options that can be applied to a VoiceMediaChannel or a VoiceMediaEngine. +// Used to be flags, but that makes it hard to selectively apply options. +// We are moving all of the setting of options to structs like this, +// but some things currently still use flags. +struct AudioOptions { + void SetAll(const AudioOptions& change) { + SetFrom(&echo_cancellation, change.echo_cancellation); +#if defined(WEBRTC_IOS) + SetFrom(&ios_force_software_aec_HACK, change.ios_force_software_aec_HACK); +#endif + SetFrom(&auto_gain_control, change.auto_gain_control); + SetFrom(&noise_suppression, change.noise_suppression); + SetFrom(&highpass_filter, change.highpass_filter); + SetFrom(&stereo_swapping, change.stereo_swapping); + SetFrom(&audio_jitter_buffer_max_packets, + change.audio_jitter_buffer_max_packets); + SetFrom(&audio_jitter_buffer_fast_accelerate, + change.audio_jitter_buffer_fast_accelerate); + SetFrom(&typing_detection, change.typing_detection); + SetFrom(&aecm_generate_comfort_noise, change.aecm_generate_comfort_noise); + SetFrom(&experimental_agc, change.experimental_agc); + SetFrom(&extended_filter_aec, change.extended_filter_aec); + 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(&residual_echo_detector, change.residual_echo_detector); + SetFrom(&tx_agc_target_dbov, change.tx_agc_target_dbov); + SetFrom(&tx_agc_digital_compression_gain, + change.tx_agc_digital_compression_gain); + SetFrom(&tx_agc_limiter, change.tx_agc_limiter); + SetFrom(&combined_audio_video_bwe, change.combined_audio_video_bwe); + SetFrom(&audio_network_adaptor, change.audio_network_adaptor); + SetFrom(&audio_network_adaptor_config, change.audio_network_adaptor_config); + SetFrom(&level_control_initial_peak_level_dbfs, + change.level_control_initial_peak_level_dbfs); + } + + bool operator==(const AudioOptions& o) const { + return echo_cancellation == o.echo_cancellation && +#if defined(WEBRTC_IOS) + ios_force_software_aec_HACK == o.ios_force_software_aec_HACK && +#endif + 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 && + residual_echo_detector == o.residual_echo_detector && + 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 && + combined_audio_video_bwe == o.combined_audio_video_bwe && + audio_network_adaptor == o.audio_network_adaptor && + audio_network_adaptor_config == o.audio_network_adaptor_config && + level_control_initial_peak_level_dbfs == + o.level_control_initial_peak_level_dbfs; + } + bool operator!=(const AudioOptions& o) const { return !(*this == o); } + + std::string ToString() const { + std::ostringstream ost; + ost << "AudioOptions {"; + ost << ToStringIfSet("aec", echo_cancellation); +#if defined(WEBRTC_IOS) + ost << ToStringIfSet("ios_force_software_aec_HACK", + ios_force_software_aec_HACK); +#endif + ost << ToStringIfSet("agc", auto_gain_control); + ost << ToStringIfSet("ns", noise_suppression); + ost << ToStringIfSet("hf", highpass_filter); + ost << ToStringIfSet("swap", stereo_swapping); + ost << ToStringIfSet("audio_jitter_buffer_max_packets", + audio_jitter_buffer_max_packets); + ost << ToStringIfSet("audio_jitter_buffer_fast_accelerate", + audio_jitter_buffer_fast_accelerate); + ost << ToStringIfSet("typing", typing_detection); + ost << ToStringIfSet("comfort_noise", aecm_generate_comfort_noise); + ost << ToStringIfSet("experimental_agc", experimental_agc); + ost << ToStringIfSet("extended_filter_aec", extended_filter_aec); + 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("level_control_initial_peak_level_dbfs", + level_control_initial_peak_level_dbfs); + ost << ToStringIfSet("residual_echo_detector", residual_echo_detector); + ost << ToStringIfSet("tx_agc_target_dbov", tx_agc_target_dbov); + ost << ToStringIfSet("tx_agc_digital_compression_gain", + tx_agc_digital_compression_gain); + ost << ToStringIfSet("tx_agc_limiter", tx_agc_limiter); + ost << ToStringIfSet("combined_audio_video_bwe", combined_audio_video_bwe); + ost << ToStringIfSet("audio_network_adaptor", audio_network_adaptor); + // The adaptor config is a serialized proto buffer and therefore not human + // readable. So we comment out the following line. + // ost << ToStringIfSet("audio_network_adaptor_config", + // audio_network_adaptor_config); + ost << "}"; + return ost.str(); + } + + // Audio processing that attempts to filter away the output signal from + // later inbound pickup. + rtc::Optional echo_cancellation; +#if defined(WEBRTC_IOS) + // Forces software echo cancellation on iOS. This is a temporary workaround + // (until Apple fixes the bug) for a device with non-functioning AEC. May + // improve performance on that particular device, but will cause unpredictable + // behavior in all other cases. See http://bugs.webrtc.org/8682. + rtc::Optional ios_force_software_aec_HACK; +#endif + // Audio processing to adjust the sensitivity of the local mic dynamically. + rtc::Optional auto_gain_control; + // Audio processing to filter out background noise. + rtc::Optional noise_suppression; + // Audio processing to remove background noise of lower frequencies. + rtc::Optional highpass_filter; + // Audio processing to swap the left and right channels. + rtc::Optional stereo_swapping; + // Audio receiver jitter buffer (NetEq) max capacity in number of packets. + rtc::Optional audio_jitter_buffer_max_packets; + // Audio receiver jitter buffer (NetEq) fast accelerate mode. + rtc::Optional audio_jitter_buffer_fast_accelerate; + // Audio processing to detect typing. + rtc::Optional typing_detection; + rtc::Optional aecm_generate_comfort_noise; + rtc::Optional experimental_agc; + rtc::Optional extended_filter_aec; + rtc::Optional delay_agnostic_aec; + 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 residual_echo_detector; + rtc::Optional tx_agc_target_dbov; + rtc::Optional tx_agc_digital_compression_gain; + rtc::Optional tx_agc_limiter; + // Enable combined audio+bandwidth BWE. + // TODO(pthatcher): This flag is set from the + // "googCombinedAudioVideoBwe", but not used anywhere. So delete it, + // and check if any other AudioOptions members are unused. + rtc::Optional combined_audio_video_bwe; + // Enable audio network adaptor. + rtc::Optional audio_network_adaptor; + // Config string for audio network adaptor. + rtc::Optional audio_network_adaptor_config; + + private: + template + static std::string ToStringIfSet(const char* key, + const rtc::Optional& val) { + std::string str; + if (val) { + str = key; + str += ": "; + str += val ? rtc::ToString(*val) : ""; + str += ", "; + } + return str; + } + + template + static void SetFrom(rtc::Optional* s, const rtc::Optional& o) { + if (o) { + *s = o; + } + } +}; + +} // namespace cricket + +#endif // API_AUDIO_OPTIONS_H_ diff --git a/api/peerconnectioninterface.h b/api/peerconnectioninterface.h index f6fae5848c..0f8804a40d 100644 --- a/api/peerconnectioninterface.h +++ b/api/peerconnectioninterface.h @@ -78,6 +78,7 @@ #include "api/audio_codecs/audio_decoder_factory.h" #include "api/audio_codecs/audio_encoder_factory.h" +#include "api/audio_options.h" #include "api/datachannelinterface.h" #include "api/dtmfsenderinterface.h" #include "api/jsep.h" diff --git a/media/BUILD.gn b/media/BUILD.gn index 52092bfa07..dfadbae2f0 100644 --- a/media/BUILD.gn +++ b/media/BUILD.gn @@ -60,6 +60,7 @@ rtc_static_library("rtc_media_base") { defines = [] libs = [] deps = [ + "../api:audio_options_api", "../rtc_base:checks", "../rtc_base:sanitizer", "../rtc_base:stringutils", diff --git a/media/base/mediachannel.h b/media/base/mediachannel.h index ccec53f0e0..c0b5d2b9be 100644 --- a/media/base/mediachannel.h +++ b/media/base/mediachannel.h @@ -18,6 +18,7 @@ #include #include "api/audio_codecs/audio_encoder.h" +#include "api/audio_options.h" #include "api/optional.h" #include "api/rtpparameters.h" #include "api/rtpreceiverinterface.h" @@ -152,176 +153,6 @@ struct MediaConfig { bool operator!=(const MediaConfig& o) const { return !(*this == o); } }; -// Options that can be applied to a VoiceMediaChannel or a VoiceMediaEngine. -// Used to be flags, but that makes it hard to selectively apply options. -// We are moving all of the setting of options to structs like this, -// but some things currently still use flags. -struct AudioOptions { - void SetAll(const AudioOptions& change) { - SetFrom(&echo_cancellation, change.echo_cancellation); -#if defined(WEBRTC_IOS) - SetFrom(&ios_force_software_aec_HACK, change.ios_force_software_aec_HACK); -#endif - SetFrom(&auto_gain_control, change.auto_gain_control); - SetFrom(&noise_suppression, change.noise_suppression); - SetFrom(&highpass_filter, change.highpass_filter); - SetFrom(&stereo_swapping, change.stereo_swapping); - SetFrom(&audio_jitter_buffer_max_packets, - change.audio_jitter_buffer_max_packets); - SetFrom(&audio_jitter_buffer_fast_accelerate, - change.audio_jitter_buffer_fast_accelerate); - SetFrom(&typing_detection, change.typing_detection); - SetFrom(&aecm_generate_comfort_noise, change.aecm_generate_comfort_noise); - SetFrom(&experimental_agc, change.experimental_agc); - SetFrom(&extended_filter_aec, change.extended_filter_aec); - 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(&residual_echo_detector, change.residual_echo_detector); - SetFrom(&tx_agc_target_dbov, change.tx_agc_target_dbov); - SetFrom(&tx_agc_digital_compression_gain, - change.tx_agc_digital_compression_gain); - SetFrom(&tx_agc_limiter, change.tx_agc_limiter); - SetFrom(&combined_audio_video_bwe, change.combined_audio_video_bwe); - SetFrom(&audio_network_adaptor, change.audio_network_adaptor); - SetFrom(&audio_network_adaptor_config, change.audio_network_adaptor_config); - SetFrom(&level_control_initial_peak_level_dbfs, - change.level_control_initial_peak_level_dbfs); - } - - bool operator==(const AudioOptions& o) const { - return echo_cancellation == o.echo_cancellation && -#if defined(WEBRTC_IOS) - ios_force_software_aec_HACK == o.ios_force_software_aec_HACK && -#endif - 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 && - residual_echo_detector == o.residual_echo_detector && - 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 && - combined_audio_video_bwe == o.combined_audio_video_bwe && - audio_network_adaptor == o.audio_network_adaptor && - audio_network_adaptor_config == o.audio_network_adaptor_config && - level_control_initial_peak_level_dbfs == - o.level_control_initial_peak_level_dbfs; - } - bool operator!=(const AudioOptions& o) const { return !(*this == o); } - - std::string ToString() const { - std::ostringstream ost; - ost << "AudioOptions {"; - ost << ToStringIfSet("aec", echo_cancellation); -#if defined(WEBRTC_IOS) - ost << ToStringIfSet("ios_force_software_aec_HACK", - ios_force_software_aec_HACK); -#endif - ost << ToStringIfSet("agc", auto_gain_control); - ost << ToStringIfSet("ns", noise_suppression); - ost << ToStringIfSet("hf", highpass_filter); - ost << ToStringIfSet("swap", stereo_swapping); - ost << ToStringIfSet("audio_jitter_buffer_max_packets", - audio_jitter_buffer_max_packets); - ost << ToStringIfSet("audio_jitter_buffer_fast_accelerate", - audio_jitter_buffer_fast_accelerate); - ost << ToStringIfSet("typing", typing_detection); - ost << ToStringIfSet("comfort_noise", aecm_generate_comfort_noise); - ost << ToStringIfSet("experimental_agc", experimental_agc); - ost << ToStringIfSet("extended_filter_aec", extended_filter_aec); - 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("level_control_initial_peak_level_dbfs", - level_control_initial_peak_level_dbfs); - ost << ToStringIfSet("residual_echo_detector", residual_echo_detector); - ost << ToStringIfSet("tx_agc_target_dbov", tx_agc_target_dbov); - ost << ToStringIfSet("tx_agc_digital_compression_gain", - tx_agc_digital_compression_gain); - ost << ToStringIfSet("tx_agc_limiter", tx_agc_limiter); - ost << ToStringIfSet("combined_audio_video_bwe", combined_audio_video_bwe); - ost << ToStringIfSet("audio_network_adaptor", audio_network_adaptor); - // The adaptor config is a serialized proto buffer and therefore not human - // readable. So we comment out the following line. - // ost << ToStringIfSet("audio_network_adaptor_config", - // audio_network_adaptor_config); - ost << "}"; - return ost.str(); - } - - // Audio processing that attempts to filter away the output signal from - // later inbound pickup. - rtc::Optional echo_cancellation; -#if defined(WEBRTC_IOS) - // Forces software echo cancellation on iOS. This is a temporary workaround - // (until Apple fixes the bug) for a device with non-functioning AEC. May - // improve performance on that particular device, but will cause unpredictable - // behavior in all other cases. See http://bugs.webrtc.org/8682. - rtc::Optional ios_force_software_aec_HACK; -#endif - // Audio processing to adjust the sensitivity of the local mic dynamically. - rtc::Optional auto_gain_control; - // Audio processing to filter out background noise. - rtc::Optional noise_suppression; - // Audio processing to remove background noise of lower frequencies. - rtc::Optional highpass_filter; - // Audio processing to swap the left and right channels. - rtc::Optional stereo_swapping; - // Audio receiver jitter buffer (NetEq) max capacity in number of packets. - rtc::Optional audio_jitter_buffer_max_packets; - // Audio receiver jitter buffer (NetEq) fast accelerate mode. - rtc::Optional audio_jitter_buffer_fast_accelerate; - // Audio processing to detect typing. - rtc::Optional typing_detection; - rtc::Optional aecm_generate_comfort_noise; - rtc::Optional experimental_agc; - rtc::Optional extended_filter_aec; - rtc::Optional delay_agnostic_aec; - 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 residual_echo_detector; - rtc::Optional tx_agc_target_dbov; - rtc::Optional tx_agc_digital_compression_gain; - rtc::Optional tx_agc_limiter; - // Enable combined audio+bandwidth BWE. - // TODO(pthatcher): This flag is set from the - // "googCombinedAudioVideoBwe", but not used anywhere. So delete it, - // and check if any other AudioOptions members are unused. - rtc::Optional combined_audio_video_bwe; - // Enable audio network adaptor. - rtc::Optional audio_network_adaptor; - // Config string for audio network adaptor. - rtc::Optional audio_network_adaptor_config; - - private: - template - static void SetFrom(rtc::Optional* s, const rtc::Optional& o) { - if (o) { - *s = o; - } - } -}; - // Options that can be applied to a VideoMediaChannel or a VideoMediaEngine. // Used to be flags, but that makes it hard to selectively apply options. // We are moving all of the setting of options to structs like this,