The current scheme for setting parameters and specifying the behavior

of the audio processing module is quite complex and hard to implement
in a threadsafe and efficient manner. Therefore a new scheme for setting
the parameters in the audio processing module is introduced in this CL.

The idea is to roll this scheme out gradually and as a first functionality
in the audio processing module where this is applied the level controller
was chosen. This CL includes the replacement of the Config-based
level controller scheme with the new scheme.

BUG=webrtc:5298

Review-Url: https://codereview.webrtc.org/2292863002
Cr-Commit-Position: refs/heads/master@{#14171}
This commit is contained in:
peah
2016-09-09 14:15:57 -07:00
committed by Commit bot
parent e753641ef1
commit c8bbe3fe9a
17 changed files with 167 additions and 76 deletions

View File

@ -91,14 +91,6 @@ struct RefinedAdaptiveFilter {
bool enabled;
};
// Enables the adaptive level controller.
struct LevelControl {
LevelControl() : enabled(false) {}
explicit LevelControl(bool enabled) : enabled(enabled) {}
static const ConfigOptionID identifier = ConfigOptionID::kLevelControl;
bool enabled;
};
// Enables delay-agnostic echo cancellation. This feature relies on internally
// estimated delays between the process and reverse streams, thus not relying
// on reported system delays. This configuration only applies to
@ -205,6 +197,10 @@ struct Intelligibility {
// Usage example, omitting error checking:
// AudioProcessing* apm = AudioProcessing::Create(0);
//
// AudioProcessing::Config config;
// config.level_controller.enabled = true;
// apm->ApplyConfig(config)
//
// apm->high_pass_filter()->Enable(true);
//
// apm->echo_cancellation()->enable_drift_compensation(false);
@ -244,14 +240,29 @@ struct Intelligibility {
//
class AudioProcessing {
public:
// The struct below constitutes the new parameter scheme for the audio
// processing. It is being introduced gradually and until it is fully
// introduced, it is prone to change.
// TODO(peah): Remove this comment once the new config scheme is fully rolled
// out.
//
// The parameters and behavior of the audio processing module are controlled
// by changing the default values in the AudioProcessing::Config struct.
// The config is applied by passing the struct to the ApplyConfig method.
struct Config {
struct LevelController {
bool enabled = false;
} level_controller;
};
// TODO(mgraczyk): Remove once all methods that use ChannelLayout are gone.
enum ChannelLayout {
kMono,
// Left, right.
kStereo,
// Mono, keyboard mic.
// Mono, keyboard, and mic.
kMonoAndKeyboard,
// Left, right, keyboard mic.
// Left, right, keyboard, and mic.
kStereoAndKeyboard
};
@ -262,9 +273,9 @@ class AudioProcessing {
// be one instance for every incoming stream.
static AudioProcessing* Create();
// Allows passing in an optional configuration at create-time.
static AudioProcessing* Create(const Config& config);
static AudioProcessing* Create(const webrtc::Config& config);
// Only for testing.
static AudioProcessing* Create(const Config& config,
static AudioProcessing* Create(const webrtc::Config& config,
NonlinearBeamformer* beamformer);
virtual ~AudioProcessing() {}
@ -300,9 +311,13 @@ class AudioProcessing {
ChannelLayout output_layout,
ChannelLayout reverse_layout) = 0;
// TODO(peah): This method is a temporary solution used to take control
// over the parameters in the audio processing module and is likely to change.
virtual void ApplyConfig(const Config& config) = 0;
// Pass down additional options which don't have explicit setters. This
// ensures the options are applied immediately.
virtual void SetExtraOptions(const Config& config) = 0;
virtual void SetExtraOptions(const webrtc::Config& config) = 0;
// TODO(ajm): Only intended for internal use. Make private and friend the
// necessary classes?