From 5ec7e1276029f63ab6aaa244d402c3cf10011151 Mon Sep 17 00:00:00 2001 From: Ivo Creusen Date: Fri, 22 Dec 2017 11:35:59 +0100 Subject: [PATCH] Added a builder class for the AudioProcessingModule. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit As the number of injectable components of the APM increases, it is become increasingly unwieldy to keep expanding the Create function with more parameters. This builder class should make it easier to inject more components in the future. Bug: webrtc:8668 Change-Id: If91547527760486c2a4daa9696bee22ec1d7675e Reviewed-on: https://webrtc-review.googlesource.com/34651 Commit-Queue: Ivo Creusen Reviewed-by: Gustaf Ullberg Reviewed-by: Sam Zackrisson Reviewed-by: Per Ã…hgren Cr-Commit-Position: refs/heads/master@{#21425} --- .../audio_processing/audio_processing_impl.cc | 39 +++++++++++++++++++ .../audio_processing_unittest.cc | 11 ++++-- .../include/audio_processing.h | 34 ++++++++++++++++ 3 files changed, 80 insertions(+), 4 deletions(-) diff --git a/modules/audio_processing/audio_processing_impl.cc b/modules/audio_processing/audio_processing_impl.cc index 2fbf369e51..4629ebfbc2 100644 --- a/modules/audio_processing/audio_processing_impl.cc +++ b/modules/audio_processing/audio_processing_impl.cc @@ -318,6 +318,45 @@ struct AudioProcessingImpl::ApmPrivateSubmodules { std::unique_ptr render_pre_processor; }; +AudioProcessingBuilder::AudioProcessingBuilder() = default; +AudioProcessingBuilder::~AudioProcessingBuilder() = default; + +AudioProcessingBuilder& AudioProcessingBuilder::SetCapturePostProcessing( + std::unique_ptr capture_post_processing) { + capture_post_processing_ = std::move(capture_post_processing); + return *this; +} + +AudioProcessingBuilder& AudioProcessingBuilder::SetRenderPreProcessing( + std::unique_ptr render_pre_processing) { + render_pre_processing_ = std::move(render_pre_processing); + return *this; +} + +AudioProcessingBuilder& AudioProcessingBuilder::SetEchoControlFactory( + std::unique_ptr echo_control_factory) { + echo_control_factory_ = std::move(echo_control_factory); + return *this; +} + +AudioProcessingBuilder& AudioProcessingBuilder::SetNonlinearBeamformer( + std::unique_ptr nonlinear_beamformer) { + nonlinear_beamformer_ = std::move(nonlinear_beamformer); + return *this; +} + +AudioProcessing* AudioProcessingBuilder::Create() { + webrtc::Config config; + return Create(config); +} + +AudioProcessing* AudioProcessingBuilder::Create(const webrtc::Config& config) { + return AudioProcessing::Create(config, std::move(capture_post_processing_), + std::move(render_pre_processing_), + std::move(echo_control_factory_), + nonlinear_beamformer_.release()); +} + AudioProcessing* AudioProcessing::Create() { webrtc::Config config; return Create(config, nullptr, nullptr, nullptr, nullptr); diff --git a/modules/audio_processing/audio_processing_unittest.cc b/modules/audio_processing/audio_processing_unittest.cc index b19a56bd4c..335f836666 100644 --- a/modules/audio_processing/audio_processing_unittest.cc +++ b/modules/audio_processing/audio_processing_unittest.cc @@ -2915,8 +2915,10 @@ TEST(ApmConfiguration, EnablePostProcessing) { new testing::NiceMock(); auto mock_post_processor = std::unique_ptr(mock_post_processor_ptr); - rtc::scoped_refptr apm = AudioProcessing::Create( - webrtc_config, std::move(mock_post_processor), nullptr, nullptr, nullptr); + rtc::scoped_refptr apm = + AudioProcessingBuilder() + .SetCapturePostProcessing(std::move(mock_post_processor)) + .Create(webrtc_config); AudioFrame audio; audio.num_channels_ = 1; @@ -2962,8 +2964,9 @@ TEST(ApmConfiguration, EchoControlInjection) { new MyEchoControlFactory()); rtc::scoped_refptr apm = - AudioProcessing::Create(webrtc_config, nullptr, nullptr, - std::move(echo_control_factory), nullptr); + AudioProcessingBuilder() + .SetEchoControlFactory(std::move(echo_control_factory)) + .Create(webrtc_config); AudioFrame audio; audio.num_channels_ = 1; diff --git a/modules/audio_processing/include/audio_processing.h b/modules/audio_processing/include/audio_processing.h index 4a3a30baf8..2e4fd0eb8c 100644 --- a/modules/audio_processing/include/audio_processing.h +++ b/modules/audio_processing/include/audio_processing.h @@ -30,6 +30,7 @@ #include "rtc_base/deprecation.h" #include "rtc_base/platform_file.h" #include "rtc_base/refcount.h" +#include "rtc_base/scoped_ref_ptr.h" #include "typedefs.h" // NOLINT(build/include) namespace webrtc { @@ -317,6 +318,10 @@ class AudioProcessing : public rtc::RefCountInterface { // instance for the near-end stream, and additional instances for each far-end // stream which requires processing. On the server-side, this would typically // be one instance for every incoming stream. + // The Create functions are deprecated, please use AudioProcessingBuilder + // instead. + // TODO(bugs.webrtc.org/8668): Remove these Create functions when all callers + // have moved to AudioProcessingBuilder. static AudioProcessing* Create(); // Allows passing in an optional configuration at create-time. static AudioProcessing* Create(const webrtc::Config& config); @@ -644,6 +649,35 @@ class AudioProcessing : public rtc::RefCountInterface { static const int kChunkSizeMs = 10; }; +class AudioProcessingBuilder { + public: + AudioProcessingBuilder(); + ~AudioProcessingBuilder(); + // The AudioProcessingBuilder takes ownership of the echo_control_factory. + AudioProcessingBuilder& SetEchoControlFactory( + std::unique_ptr echo_control_factory); + // The AudioProcessingBuilder takes ownership of the capture_post_processing. + AudioProcessingBuilder& SetCapturePostProcessing( + std::unique_ptr capture_post_processing); + // The AudioProcessingBuilder takes ownership of the render_pre_processing. + AudioProcessingBuilder& SetRenderPreProcessing( + std::unique_ptr render_pre_processing); + // The AudioProcessingBuilder takes ownership of the nonlinear beamformer. + AudioProcessingBuilder& SetNonlinearBeamformer( + std::unique_ptr nonlinear_beamformer); + // This creates an APM instance using the previously set components. Calling + // the Create function resets the AudioProcessingBuilder to its initial state. + AudioProcessing* Create(); + AudioProcessing* Create(const webrtc::Config& config); + + private: + std::unique_ptr echo_control_factory_; + std::unique_ptr capture_post_processing_; + std::unique_ptr render_pre_processing_; + std::unique_ptr nonlinear_beamformer_; + RTC_DISALLOW_COPY_AND_ASSIGN(AudioProcessingBuilder); +}; + class StreamConfig { public: // sample_rate_hz: The sampling rate of the stream.