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.