From 575c2ad8c5e3a9caa80eb254f85f9175bda24322 Mon Sep 17 00:00:00 2001 From: Fabian Bergmark Date: Tue, 18 Feb 2020 14:23:36 +0100 Subject: [PATCH] Support passing the ADM to the ADMWrapper. Bug: webrtc:11356 Change-Id: Ie68de35908e80cf395b6558d0725c0462412f333 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/168482 Commit-Queue: Fabian Bergmark Reviewed-by: Henrik Andreassson Cr-Commit-Position: refs/heads/master@{#30543} --- .../audio_device_data_observer.cc | 36 +++++++++++++++---- .../include/audio_device_data_observer.h | 6 ++++ 2 files changed, 35 insertions(+), 7 deletions(-) diff --git a/modules/audio_device/audio_device_data_observer.cc b/modules/audio_device/audio_device_data_observer.cc index e81670ef00..923d594196 100644 --- a/modules/audio_device/audio_device_data_observer.cc +++ b/modules/audio_device/audio_device_data_observer.cc @@ -22,15 +22,16 @@ namespace { // callback and redirects the PCM data to AudioDeviceDataObserver callback. class ADMWrapper : public AudioDeviceModule, public AudioTransport { public: + ADMWrapper(rtc::scoped_refptr impl, + AudioDeviceDataObserver* observer) + : impl_(impl), observer_(observer) { + is_valid_ = impl_.get() != nullptr; + } ADMWrapper(AudioLayer audio_layer, TaskQueueFactory* task_queue_factory, AudioDeviceDataObserver* observer) - : impl_(AudioDeviceModule::Create(audio_layer, task_queue_factory)), - observer_(observer) { - // Register self as the audio transport callback for underlying ADM impl. - auto res = impl_->RegisterAudioCallback(this); - is_valid_ = (impl_.get() != nullptr) && (res == 0); - } + : ADMWrapper(AudioDeviceModule::Create(audio_layer, task_queue_factory), + observer) {} ~ADMWrapper() override { audio_transport_ = nullptr; observer_ = nullptr; @@ -119,7 +120,15 @@ class ADMWrapper : public AudioDeviceModule, public AudioTransport { int32_t ActiveAudioLayer(AudioLayer* audio_layer) const override { return impl_->ActiveAudioLayer(audio_layer); } - int32_t Init() override { return impl_->Init(); } + int32_t Init() override { + int res = impl_->Init(); + if (res != 0) { + return res; + } + // Register self as the audio transport callback for underlying ADM impl. + impl_->RegisterAudioCallback(this); + return res; + } int32_t Terminate() override { return impl_->Terminate(); } bool Initialized() const override { return impl_->Initialized(); } int16_t PlayoutDevices() override { return impl_->PlayoutDevices(); } @@ -283,6 +292,19 @@ class ADMWrapper : public AudioDeviceModule, public AudioTransport { } // namespace +rtc::scoped_refptr CreateAudioDeviceWithDataObserver( + rtc::scoped_refptr impl, + AudioDeviceDataObserver* observer) { + rtc::scoped_refptr audio_device( + new rtc::RefCountedObject(impl, observer)); + + if (!audio_device->IsValid()) { + return nullptr; + } + + return audio_device; +} + rtc::scoped_refptr CreateAudioDeviceWithDataObserver( AudioDeviceModule::AudioLayer audio_layer, TaskQueueFactory* task_queue_factory, diff --git a/modules/audio_device/include/audio_device_data_observer.h b/modules/audio_device/include/audio_device_data_observer.h index 14958ea577..ac87d93b10 100644 --- a/modules/audio_device/include/audio_device_data_observer.h +++ b/modules/audio_device/include/audio_device_data_observer.h @@ -40,6 +40,12 @@ class AudioDeviceDataObserver { virtual ~AudioDeviceDataObserver() = default; }; +// Creates an ADMWrapper around an ADM instance that registers +// the provided AudioDeviceDataObserver. +rtc::scoped_refptr CreateAudioDeviceWithDataObserver( + rtc::scoped_refptr impl, + AudioDeviceDataObserver* observer); + // Creates an ADM instance with AudioDeviceDataObserver registered. rtc::scoped_refptr CreateAudioDeviceWithDataObserver( const AudioDeviceModule::AudioLayer audio_layer,