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 <fabianbergmark@google.com>
Reviewed-by: Henrik Andreassson <henrika@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#30543}
This commit is contained in:
Fabian Bergmark 2020-02-18 14:23:36 +01:00 committed by Commit Bot
parent c1cbf6be7e
commit 575c2ad8c5
2 changed files with 35 additions and 7 deletions

View File

@ -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<AudioDeviceModule> 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<AudioDeviceModule> CreateAudioDeviceWithDataObserver(
rtc::scoped_refptr<AudioDeviceModule> impl,
AudioDeviceDataObserver* observer) {
rtc::scoped_refptr<ADMWrapper> audio_device(
new rtc::RefCountedObject<ADMWrapper>(impl, observer));
if (!audio_device->IsValid()) {
return nullptr;
}
return audio_device;
}
rtc::scoped_refptr<AudioDeviceModule> CreateAudioDeviceWithDataObserver(
AudioDeviceModule::AudioLayer audio_layer,
TaskQueueFactory* task_queue_factory,

View File

@ -40,6 +40,12 @@ class AudioDeviceDataObserver {
virtual ~AudioDeviceDataObserver() = default;
};
// Creates an ADMWrapper around an ADM instance that registers
// the provided AudioDeviceDataObserver.
rtc::scoped_refptr<AudioDeviceModule> CreateAudioDeviceWithDataObserver(
rtc::scoped_refptr<AudioDeviceModule> impl,
AudioDeviceDataObserver* observer);
// Creates an ADM instance with AudioDeviceDataObserver registered.
rtc::scoped_refptr<AudioDeviceModule> CreateAudioDeviceWithDataObserver(
const AudioDeviceModule::AudioLayer audio_layer,