Propagate TaskQueueFactory to AudioDeviceBuffer

keep using GlobalTaskQueueFactory in android/ios bindings.
Switch to DefaultTaskQueueFactory in tests.

Bug: webrtc:10284
Change-Id: I034c70542be5eeb830be86527830d51204fb2855
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/130223
Commit-Queue: Danil Chapovalov <danilchap@webrtc.org>
Reviewed-by: Karl Wiberg <kwiberg@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#27380}
diff --git a/media/engine/webrtc_voice_engine.cc b/media/engine/webrtc_voice_engine.cc
index ebc4334..dc9bc1c 100644
--- a/media/engine/webrtc_voice_engine.cc
+++ b/media/engine/webrtc_voice_engine.cc
@@ -240,7 +240,7 @@
   // No ADM supplied? Create a default one.
   if (!adm_) {
     adm_ = webrtc::AudioDeviceModule::Create(
-        webrtc::AudioDeviceModule::kPlatformDefaultAudio);
+        webrtc::AudioDeviceModule::kPlatformDefaultAudio, task_queue_factory_);
   }
 #endif  // WEBRTC_INCLUDE_INTERNAL_AUDIO_DEVICE
   RTC_CHECK(adm());
diff --git a/modules/audio_device/BUILD.gn b/modules/audio_device/BUILD.gn
index 3d42fd7..02e54c0 100644
--- a/modules/audio_device/BUILD.gn
+++ b/modules/audio_device/BUILD.gn
@@ -94,6 +94,7 @@
   ]
   deps = [
     "../../api:scoped_refptr",
+    "../../api/task_queue",
     "../../rtc_base:checks",
     "../../rtc_base:deprecation",
     "../../rtc_base:rtc_base_approved",
@@ -112,6 +113,7 @@
   deps = [
     ":audio_device_api",
     "../../api:array_view",
+    "../../api/task_queue",
     "../../common_audio:common_audio_c",
     "../../rtc_base:checks",
     "../../rtc_base:rtc_base_approved",
@@ -183,6 +185,7 @@
       ":audio_device_buffer",
       ":windows_core_audio_utility",
       "../../api:scoped_refptr",
+      "../../api/task_queue",
       "../../rtc_base:checks",
       "../../rtc_base:rtc_base_approved",
       "//third_party/abseil-cpp/absl/memory",
@@ -434,6 +437,8 @@
       ":mock_audio_device",
       "../../api:array_view",
       "../../api:scoped_refptr",
+      "../../api/task_queue",
+      "../../api/task_queue:default_task_queue_factory",
       "../../common_audio",
       "../../rtc_base:checks",
       "../../rtc_base:rtc_base_approved",
diff --git a/modules/audio_device/android/audio_device_unittest.cc b/modules/audio_device/android/audio_device_unittest.cc
index dffc33c..e9daf1c 100644
--- a/modules/audio_device/android/audio_device_unittest.cc
+++ b/modules/audio_device/android/audio_device_unittest.cc
@@ -17,6 +17,8 @@
 #include <vector>
 
 #include "api/scoped_refptr.h"
+#include "api/task_queue/default_task_queue_factory.h"
+#include "api/task_queue/task_queue_factory.h"
 #include "modules/audio_device/android/audio_common.h"
 #include "modules/audio_device/android/audio_manager.h"
 #include "modules/audio_device/android/build_info.h"
@@ -460,7 +462,7 @@
 // AudioDeviceTest test fixture.
 class AudioDeviceTest : public ::testing::Test {
  protected:
-  AudioDeviceTest() {
+  AudioDeviceTest() : task_queue_factory_(CreateDefaultTaskQueueFactory()) {
     // One-time initialization of JVM and application context. Ensures that we
     // can do calls between C++ and Java. Initializes both Java and OpenSL ES
     // implementations.
@@ -514,7 +516,7 @@
   rtc::scoped_refptr<AudioDeviceModule> CreateAudioDevice(
       AudioDeviceModule::AudioLayer audio_layer) {
     rtc::scoped_refptr<AudioDeviceModule> module(
-        AudioDeviceModule::Create(audio_layer));
+        AudioDeviceModule::Create(audio_layer, task_queue_factory_.get()));
     return module;
   }
 
@@ -639,6 +641,7 @@
   }
 
   rtc::Event test_is_done_;
+  std::unique_ptr<TaskQueueFactory> task_queue_factory_;
   rtc::scoped_refptr<AudioDeviceModule> audio_device_;
   AudioParameters playout_parameters_;
   AudioParameters record_parameters_;
diff --git a/modules/audio_device/audio_device_buffer.cc b/modules/audio_device/audio_device_buffer.cc
index 052071a..927f80a 100644
--- a/modules/audio_device/audio_device_buffer.cc
+++ b/modules/audio_device/audio_device_buffer.cc
@@ -39,8 +39,10 @@
 static const double k2Pi = 6.28318530717959;
 #endif
 
-AudioDeviceBuffer::AudioDeviceBuffer()
-    : task_queue_(kTimerQueueName),
+AudioDeviceBuffer::AudioDeviceBuffer(TaskQueueFactory* task_queue_factory)
+    : task_queue_(task_queue_factory->CreateTaskQueue(
+          kTimerQueueName,
+          TaskQueueFactory::Priority::NORMAL)),
       audio_transport_cb_(nullptr),
       rec_sample_rate_(0),
       play_sample_rate_(0),
diff --git a/modules/audio_device/audio_device_buffer.h b/modules/audio_device/audio_device_buffer.h
index 37d9ffb..9f71ebe 100644
--- a/modules/audio_device/audio_device_buffer.h
+++ b/modules/audio_device/audio_device_buffer.h
@@ -15,6 +15,7 @@
 #include <stdint.h>
 #include <atomic>
 
+#include "api/task_queue/task_queue_factory.h"
 #include "modules/audio_device/include/audio_device_defines.h"
 #include "rtc_base/buffer.h"
 #include "rtc_base/critical_section.h"
@@ -75,7 +76,7 @@
     int16_t max_play_level = 0;
   };
 
-  AudioDeviceBuffer();
+  explicit AudioDeviceBuffer(TaskQueueFactory* task_queue_factory);
   virtual ~AudioDeviceBuffer();
 
   int32_t RegisterAudioCallback(AudioTransport* audio_callback);
diff --git a/modules/audio_device/audio_device_data_observer.cc b/modules/audio_device/audio_device_data_observer.cc
index a8b94d5..01f283f 100644
--- a/modules/audio_device/audio_device_data_observer.cc
+++ b/modules/audio_device/audio_device_data_observer.cc
@@ -10,6 +10,7 @@
 
 #include "modules/audio_device/include/audio_device_data_observer.h"
 
+#include "api/task_queue/global_task_queue_factory.h"
 #include "modules/audio_device/include/audio_device_defines.h"
 #include "rtc_base/checks.h"
 #include "rtc_base/ref_counted_object.h"
@@ -22,8 +23,11 @@
 // callback and redirects the PCM data to AudioDeviceDataObserver callback.
 class ADMWrapper : public AudioDeviceModule, public AudioTransport {
  public:
-  ADMWrapper(const AudioLayer audio_layer, AudioDeviceDataObserver* observer)
-      : impl_(AudioDeviceModule::Create(audio_layer)), observer_(observer) {
+  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);
@@ -280,8 +284,17 @@
 rtc::scoped_refptr<AudioDeviceModule> CreateAudioDeviceWithDataObserver(
     const AudioDeviceModule::AudioLayer audio_layer,
     AudioDeviceDataObserver* observer) {
+  return CreateAudioDeviceWithDataObserver(audio_layer,
+                                           &GlobalTaskQueueFactory(), observer);
+}
+
+rtc::scoped_refptr<AudioDeviceModule> CreateAudioDeviceWithDataObserver(
+    AudioDeviceModule::AudioLayer audio_layer,
+    TaskQueueFactory* task_queue_factory,
+    AudioDeviceDataObserver* observer) {
   rtc::scoped_refptr<ADMWrapper> audio_device(
-      new rtc::RefCountedObject<ADMWrapper>(audio_layer, observer));
+      new rtc::RefCountedObject<ADMWrapper>(audio_layer, task_queue_factory,
+                                            observer));
 
   if (!audio_device->IsValid()) {
     return nullptr;
diff --git a/modules/audio_device/audio_device_impl.cc b/modules/audio_device/audio_device_impl.cc
index 8bdc4b3..7b08a5a 100644
--- a/modules/audio_device/audio_device_impl.cc
+++ b/modules/audio_device/audio_device_impl.cc
@@ -13,6 +13,7 @@
 #include <stddef.h>
 
 #include "api/scoped_refptr.h"
+#include "api/task_queue/global_task_queue_factory.h"
 #include "modules/audio_device/audio_device_config.h"  // IWYU pragma: keep
 #include "modules/audio_device/audio_device_generic.h"
 #include "rtc_base/checks.h"
@@ -71,14 +72,23 @@
 namespace webrtc {
 
 rtc::scoped_refptr<AudioDeviceModule> AudioDeviceModule::Create(
-    const AudioLayer audio_layer) {
+    AudioLayer audio_layer) {
   RTC_LOG(INFO) << __FUNCTION__;
-  return AudioDeviceModule::CreateForTest(audio_layer);
+  return AudioDeviceModule::CreateForTest(audio_layer,
+                                          &GlobalTaskQueueFactory());
+}
+
+rtc::scoped_refptr<AudioDeviceModule> AudioDeviceModule::Create(
+    AudioLayer audio_layer,
+    TaskQueueFactory* task_queue_factory) {
+  RTC_LOG(INFO) << __FUNCTION__;
+  return AudioDeviceModule::CreateForTest(audio_layer, task_queue_factory);
 }
 
 // static
 rtc::scoped_refptr<AudioDeviceModuleForTest> AudioDeviceModule::CreateForTest(
-    const AudioLayer audio_layer) {
+    AudioLayer audio_layer,
+    TaskQueueFactory* task_queue_factory) {
   RTC_LOG(INFO) << __FUNCTION__;
 
   // The "AudioDeviceModule::kWindowsCoreAudio2" audio layer has its own
@@ -91,7 +101,8 @@
 
   // Create the generic reference counted (platform independent) implementation.
   rtc::scoped_refptr<AudioDeviceModuleImpl> audioDevice(
-      new rtc::RefCountedObject<AudioDeviceModuleImpl>(audio_layer));
+      new rtc::RefCountedObject<AudioDeviceModuleImpl>(audio_layer,
+                                                       task_queue_factory));
 
   // Ensure that the current platform is supported.
   if (audioDevice->CheckPlatform() == -1) {
@@ -112,8 +123,10 @@
   return audioDevice;
 }
 
-AudioDeviceModuleImpl::AudioDeviceModuleImpl(const AudioLayer audioLayer)
-    : audio_layer_(audioLayer) {
+AudioDeviceModuleImpl::AudioDeviceModuleImpl(
+    AudioLayer audio_layer,
+    TaskQueueFactory* task_queue_factory)
+    : audio_layer_(audio_layer), audio_device_buffer_(task_queue_factory) {
   RTC_LOG(INFO) << __FUNCTION__;
 }
 
diff --git a/modules/audio_device/audio_device_impl.h b/modules/audio_device/audio_device_impl.h
index afe53b3..efe9322 100644
--- a/modules/audio_device/audio_device_impl.h
+++ b/modules/audio_device/audio_device_impl.h
@@ -16,6 +16,7 @@
 #include <stdint.h>
 #include <memory>
 
+#include "api/task_queue/task_queue_factory.h"
 #include "modules/audio_device/audio_device_buffer.h"
 #include "modules/audio_device/include/audio_device.h"
 
@@ -40,7 +41,8 @@
   int32_t CreatePlatformSpecificObjects();
   int32_t AttachAudioBuffer();
 
-  AudioDeviceModuleImpl(const AudioLayer audioLayer);
+  AudioDeviceModuleImpl(AudioLayer audio_layer,
+                        TaskQueueFactory* task_queue_factory);
   ~AudioDeviceModuleImpl() override;
 
   // Retrieve the currently utilized audio layer
diff --git a/modules/audio_device/audio_device_unittest.cc b/modules/audio_device/audio_device_unittest.cc
index 846f757..0c842b6 100644
--- a/modules/audio_device/audio_device_unittest.cc
+++ b/modules/audio_device/audio_device_unittest.cc
@@ -17,6 +17,8 @@
 #include "absl/types/optional.h"
 #include "api/array_view.h"
 #include "api/scoped_refptr.h"
+#include "api/task_queue/default_task_queue_factory.h"
+#include "api/task_queue/task_queue_factory.h"
 #include "modules/audio_device/audio_device_impl.h"
 #include "modules/audio_device/include/audio_device.h"
 #include "modules/audio_device/include/mock_audio_transport.h"
@@ -510,7 +512,9 @@
 class AudioDeviceTest
     : public ::testing::TestWithParam<webrtc::AudioDeviceModule::AudioLayer> {
  protected:
-  AudioDeviceTest() : audio_layer_(GetParam()) {
+  AudioDeviceTest()
+      : audio_layer_(GetParam()),
+        task_queue_factory_(CreateDefaultTaskQueueFactory()) {
 // TODO(webrtc:9778): Re-enable on THREAD_SANITIZER?
 #if !defined(ADDRESS_SANITIZER) && !defined(MEMORY_SANITIZER) && \
     !defined(WEBRTC_DUMMY_AUDIO_BUILD) && !defined(THREAD_SANITIZER)
@@ -579,7 +583,8 @@
     // The value of |audio_layer_| is set at construction by GetParam() and two
     // different layers are tested on Windows only.
     if (audio_layer_ == AudioDeviceModule::kPlatformDefaultAudio) {
-      return AudioDeviceModule::CreateForTest(audio_layer_);
+      return AudioDeviceModule::CreateForTest(audio_layer_,
+                                              task_queue_factory_.get());
     } else if (audio_layer_ == AudioDeviceModule::kWindowsCoreAudio2) {
 #ifdef WEBRTC_WIN
       // We must initialize the COM library on a thread before we calling any of
@@ -590,7 +595,8 @@
       EXPECT_TRUE(com_initializer_->Succeeded());
       EXPECT_TRUE(webrtc_win::core_audio_utility::IsSupported());
       EXPECT_TRUE(webrtc_win::core_audio_utility::IsMMCSSSupported());
-      return CreateWindowsCoreAudioAudioDeviceModuleForTest();
+      return CreateWindowsCoreAudioAudioDeviceModuleForTest(
+          task_queue_factory_.get());
 #else
       return nullptr;
 #endif
@@ -647,6 +653,7 @@
   std::unique_ptr<webrtc_win::ScopedCOMInitializer> com_initializer_;
 #endif
   AudioDeviceModule::AudioLayer audio_layer_;
+  std::unique_ptr<TaskQueueFactory> task_queue_factory_;
   bool requirements_satisfied_ = true;
   rtc::Event event_;
   rtc::scoped_refptr<AudioDeviceModuleForTest> audio_device_;
@@ -656,11 +663,13 @@
 // Instead of using the test fixture, verify that the different factory methods
 // work as intended.
 TEST(AudioDeviceTestWin, ConstructDestructWithFactory) {
+  std::unique_ptr<TaskQueueFactory> task_queue_factory =
+      CreateDefaultTaskQueueFactory();
   rtc::scoped_refptr<AudioDeviceModule> audio_device;
   // The default factory should work for all platforms when a default ADM is
   // requested.
-  audio_device =
-      AudioDeviceModule::Create(AudioDeviceModule::kPlatformDefaultAudio);
+  audio_device = AudioDeviceModule::Create(
+      AudioDeviceModule::kPlatformDefaultAudio, task_queue_factory.get());
   EXPECT_TRUE(audio_device);
   audio_device = nullptr;
 #ifdef WEBRTC_WIN
@@ -668,8 +677,8 @@
   // specific parts are implemented by an AudioDeviceGeneric object. Verify
   // that the old factory can't be used in combination with the latest audio
   // layer AudioDeviceModule::kWindowsCoreAudio2.
-  audio_device =
-      AudioDeviceModule::Create(AudioDeviceModule::kWindowsCoreAudio2);
+  audio_device = AudioDeviceModule::Create(
+      AudioDeviceModule::kWindowsCoreAudio2, task_queue_factory.get());
   EXPECT_FALSE(audio_device);
   audio_device = nullptr;
   // Instead, ensure that the new dedicated factory method called
@@ -679,7 +688,8 @@
   webrtc_win::ScopedCOMInitializer com_initializer(
       webrtc_win::ScopedCOMInitializer::kMTA);
   EXPECT_TRUE(com_initializer.Succeeded());
-  audio_device = CreateWindowsCoreAudioAudioDeviceModule();
+  audio_device =
+      CreateWindowsCoreAudioAudioDeviceModule(task_queue_factory.get());
   EXPECT_TRUE(audio_device);
   AudioDeviceModule::AudioLayer audio_layer;
   EXPECT_EQ(0, audio_device->ActiveAudioLayer(&audio_layer));
diff --git a/modules/audio_device/fine_audio_buffer_unittest.cc b/modules/audio_device/fine_audio_buffer_unittest.cc
index aea899c..fa8ba64 100644
--- a/modules/audio_device/fine_audio_buffer_unittest.cc
+++ b/modules/audio_device/fine_audio_buffer_unittest.cc
@@ -14,6 +14,7 @@
 #include <memory>
 
 #include "api/array_view.h"
+#include "api/task_queue/default_task_queue_factory.h"
 #include "modules/audio_device/mock_audio_device_buffer.h"
 #include "test/gmock.h"
 #include "test/gtest.h"
@@ -91,7 +92,8 @@
   const int kNumberOfUpdateBufferCalls =
       1 + ((kNumberOfFrames * frame_size_in_samples - 1) / kSamplesPer10Ms);
 
-  MockAudioDeviceBuffer audio_device_buffer;
+  auto task_queue_factory = CreateDefaultTaskQueueFactory();
+  MockAudioDeviceBuffer audio_device_buffer(task_queue_factory.get());
   audio_device_buffer.SetPlayoutSampleRate(kSampleRate);
   audio_device_buffer.SetPlayoutChannels(kChannels);
   audio_device_buffer.SetRecordingSampleRate(kSampleRate);
diff --git a/modules/audio_device/include/audio_device.h b/modules/audio_device/include/audio_device.h
index 71a1932..330392f 100644
--- a/modules/audio_device/include/audio_device.h
+++ b/modules/audio_device/include/audio_device.h
@@ -12,6 +12,7 @@
 #define MODULES_AUDIO_DEVICE_INCLUDE_AUDIO_DEVICE_H_
 
 #include "api/scoped_refptr.h"
+#include "api/task_queue/task_queue_factory.h"
 #include "modules/audio_device/include/audio_device_defines.h"
 #include "rtc_base/ref_count.h"
 
@@ -41,13 +42,18 @@
   };
 
  public:
+  // TODO(bugs.webrtc.org/10284): Remove when unused.
+  RTC_DEPRECATED
+  static rtc::scoped_refptr<AudioDeviceModule> Create(AudioLayer audio_layer);
   // Creates a default ADM for usage in production code.
   static rtc::scoped_refptr<AudioDeviceModule> Create(
-      const AudioLayer audio_layer);
+      AudioLayer audio_layer,
+      TaskQueueFactory* task_queue_factory);
   // Creates an ADM with support for extra test methods. Don't use this factory
   // in production code.
   static rtc::scoped_refptr<AudioDeviceModuleForTest> CreateForTest(
-      const AudioLayer audio_layer);
+      AudioLayer audio_layer,
+      TaskQueueFactory* task_queue_factory);
 
   // Retrieve the currently utilized audio layer
   virtual int32_t ActiveAudioLayer(AudioLayer* audioLayer) const = 0;
diff --git a/modules/audio_device/include/audio_device_data_observer.h b/modules/audio_device/include/audio_device_data_observer.h
index 270aea8..19b20de 100644
--- a/modules/audio_device/include/audio_device_data_observer.h
+++ b/modules/audio_device/include/audio_device_data_observer.h
@@ -15,7 +15,9 @@
 #include <stdint.h>
 
 #include "api/scoped_refptr.h"
+#include "api/task_queue/task_queue_factory.h"
 #include "modules/audio_device/include/audio_device.h"
+#include "rtc_base/deprecation.h"
 
 namespace webrtc {
 
@@ -39,9 +41,16 @@
   virtual ~AudioDeviceDataObserver() = default;
 };
 
+// TODO(bugs.webrtc.org/10284): Remove when unused.
+RTC_DEPRECATED
+rtc::scoped_refptr<AudioDeviceModule> CreateAudioDeviceWithDataObserver(
+    const AudioDeviceModule::AudioLayer audio_layer,
+    AudioDeviceDataObserver* observer);
+
 // Creates an ADM instance with AudioDeviceDataObserver registered.
 rtc::scoped_refptr<AudioDeviceModule> CreateAudioDeviceWithDataObserver(
     const AudioDeviceModule::AudioLayer audio_layer,
+    TaskQueueFactory* task_queue_factory,
     AudioDeviceDataObserver* observer);
 
 }  // namespace webrtc
diff --git a/modules/audio_device/include/audio_device_factory.cc b/modules/audio_device/include/audio_device_factory.cc
index 4e0a759..1962e57 100644
--- a/modules/audio_device/include/audio_device_factory.cc
+++ b/modules/audio_device/include/audio_device_factory.cc
@@ -18,18 +18,20 @@
 #endif
 
 #include "absl/memory/memory.h"
+#include "api/task_queue/task_queue_factory.h"
 #include "rtc_base/logging.h"
 
 namespace webrtc {
 
-rtc::scoped_refptr<AudioDeviceModule>
-CreateWindowsCoreAudioAudioDeviceModule() {
+rtc::scoped_refptr<AudioDeviceModule> CreateWindowsCoreAudioAudioDeviceModule(
+    TaskQueueFactory* task_queue_factory) {
   RTC_DLOG(INFO) << __FUNCTION__;
-  return CreateWindowsCoreAudioAudioDeviceModuleForTest();
+  return CreateWindowsCoreAudioAudioDeviceModuleForTest(task_queue_factory);
 }
 
 rtc::scoped_refptr<AudioDeviceModuleForTest>
-CreateWindowsCoreAudioAudioDeviceModuleForTest() {
+CreateWindowsCoreAudioAudioDeviceModuleForTest(
+    TaskQueueFactory* task_queue_factory) {
   RTC_DLOG(INFO) << __FUNCTION__;
   // Returns NULL if Core Audio is not supported or if COM has not been
   // initialized correctly using webrtc_win::ScopedCOMInitializer.
@@ -40,7 +42,7 @@
   }
   return CreateWindowsCoreAudioAudioDeviceModuleFromInputAndOutput(
       absl::make_unique<webrtc_win::CoreAudioInput>(),
-      absl::make_unique<webrtc_win::CoreAudioOutput>());
+      absl::make_unique<webrtc_win::CoreAudioOutput>(), task_queue_factory);
 }
 
 }  // namespace webrtc
diff --git a/modules/audio_device/include/audio_device_factory.h b/modules/audio_device/include/audio_device_factory.h
index bbbf628..f7ad71b 100644
--- a/modules/audio_device/include/audio_device_factory.h
+++ b/modules/audio_device/include/audio_device_factory.h
@@ -12,6 +12,7 @@
 #define MODULES_AUDIO_DEVICE_INCLUDE_AUDIO_DEVICE_FACTORY_H_
 
 #include "absl/memory/memory.h"
+#include "api/task_queue/task_queue_factory.h"
 #include "modules/audio_device/include/audio_device.h"
 
 namespace webrtc {
@@ -34,10 +35,12 @@
 //   private:
 //    std::unique_ptr<webrtc_win::ScopedCOMInitializer> com_initializer_;
 //
-rtc::scoped_refptr<AudioDeviceModule> CreateWindowsCoreAudioAudioDeviceModule();
+rtc::scoped_refptr<AudioDeviceModule> CreateWindowsCoreAudioAudioDeviceModule(
+    TaskQueueFactory* task_queue_factory);
 
 rtc::scoped_refptr<AudioDeviceModuleForTest>
-CreateWindowsCoreAudioAudioDeviceModuleForTest();
+CreateWindowsCoreAudioAudioDeviceModuleForTest(
+    TaskQueueFactory* task_queue_factory);
 
 }  // namespace webrtc
 
diff --git a/modules/audio_device/mock_audio_device_buffer.h b/modules/audio_device/mock_audio_device_buffer.h
index c61a63f..1f809cc 100644
--- a/modules/audio_device/mock_audio_device_buffer.h
+++ b/modules/audio_device/mock_audio_device_buffer.h
@@ -18,7 +18,7 @@
 
 class MockAudioDeviceBuffer : public AudioDeviceBuffer {
  public:
-  MockAudioDeviceBuffer() {}
+  using AudioDeviceBuffer::AudioDeviceBuffer;
   virtual ~MockAudioDeviceBuffer() {}
   MOCK_METHOD1(RequestPlayoutData, int32_t(size_t nSamples));
   MOCK_METHOD1(GetPlayoutData, int32_t(void* audioBuffer));
diff --git a/modules/audio_device/win/audio_device_module_win.cc b/modules/audio_device/win/audio_device_module_win.cc
index 2b9d692..f0c7349 100644
--- a/modules/audio_device/win/audio_device_module_win.cc
+++ b/modules/audio_device/win/audio_device_module_win.cc
@@ -60,8 +60,11 @@
   };
 
   WindowsAudioDeviceModule(std::unique_ptr<AudioInput> audio_input,
-                           std::unique_ptr<AudioOutput> audio_output)
-      : input_(std::move(audio_input)), output_(std::move(audio_output)) {
+                           std::unique_ptr<AudioOutput> audio_output,
+                           TaskQueueFactory* task_queue_factory)
+      : input_(std::move(audio_input)),
+        output_(std::move(audio_output)),
+        task_queue_factory_(task_queue_factory) {
     RTC_CHECK(input_);
     RTC_CHECK(output_);
     RTC_LOG(INFO) << __FUNCTION__;
@@ -101,7 +104,8 @@
     if (initialized_) {
       return 0;
     }
-    audio_device_buffer_ = absl::make_unique<AudioDeviceBuffer>();
+    audio_device_buffer_ =
+        absl::make_unique<AudioDeviceBuffer>(task_queue_factory_);
     AttachAudioBuffer();
     InitStatus status;
     if (output_->Init() != 0) {
@@ -459,6 +463,7 @@
   // Implements the AudioOutput interface and deals with audio rendering parts.
   const std::unique_ptr<AudioOutput> output_;
 
+  TaskQueueFactory* const task_queue_factory_;
   // The AudioDeviceBuffer (ADB) instance is needed for sending/receiving audio
   // to/from the WebRTC layer. Created and owned by this object. Used by
   // both |input_| and |output_| but they use orthogonal parts of the ADB.
@@ -473,10 +478,11 @@
 rtc::scoped_refptr<AudioDeviceModuleForTest>
 CreateWindowsCoreAudioAudioDeviceModuleFromInputAndOutput(
     std::unique_ptr<AudioInput> audio_input,
-    std::unique_ptr<AudioOutput> audio_output) {
+    std::unique_ptr<AudioOutput> audio_output,
+    TaskQueueFactory* task_queue_factory) {
   RTC_LOG(INFO) << __FUNCTION__;
   return new rtc::RefCountedObject<WindowsAudioDeviceModule>(
-      std::move(audio_input), std::move(audio_output));
+      std::move(audio_input), std::move(audio_output), task_queue_factory);
 }
 
 }  // namespace webrtc_win
diff --git a/modules/audio_device/win/audio_device_module_win.h b/modules/audio_device/win/audio_device_module_win.h
index 112e5cc..1ed0b25 100644
--- a/modules/audio_device/win/audio_device_module_win.h
+++ b/modules/audio_device/win/audio_device_module_win.h
@@ -15,6 +15,7 @@
 #include <string>
 
 #include "api/scoped_refptr.h"
+#include "api/task_queue/task_queue_factory.h"
 #include "modules/audio_device/include/audio_device.h"
 
 namespace webrtc {
@@ -76,7 +77,8 @@
 rtc::scoped_refptr<AudioDeviceModuleForTest>
 CreateWindowsCoreAudioAudioDeviceModuleFromInputAndOutput(
     std::unique_ptr<AudioInput> audio_input,
-    std::unique_ptr<AudioOutput> audio_output);
+    std::unique_ptr<AudioOutput> audio_output,
+    TaskQueueFactory* task_queue_factory);
 
 }  // namespace webrtc_win
 
diff --git a/sdk/BUILD.gn b/sdk/BUILD.gn
index 42db281..4cd3783 100644
--- a/sdk/BUILD.gn
+++ b/sdk/BUILD.gn
@@ -232,6 +232,7 @@
 
         deps = [
           ":audio_device",
+          "../api/task_queue:global_task_queue_factory",
           "../modules/audio_device:audio_device_api",
           "../modules/audio_device:audio_device_generic",
           "../rtc_base:checks",
@@ -271,6 +272,7 @@
           ":audio_session_observer",
           ":base_objc",
           "../api:array_view",
+          "../api/task_queue:global_task_queue_factory",
           "../modules/audio_device:audio_device_api",
           "../modules/audio_device:audio_device_buffer",
           "../modules/audio_device:audio_device_generic",
diff --git a/sdk/android/BUILD.gn b/sdk/android/BUILD.gn
index 9dd3089..530f8bd 100644
--- a/sdk/android/BUILD.gn
+++ b/sdk/android/BUILD.gn
@@ -1124,6 +1124,7 @@
       ":base_jni",
       ":generated_audio_device_module_base_jni",
       ":native_api_jni",
+      "../../api/task_queue:global_task_queue_factory",
       "../../modules/audio_device:audio_device_api",
       "../../modules/audio_device:audio_device_buffer",
       "../../rtc_base:checks",
diff --git a/sdk/android/src/jni/audio_device/audio_device_module.cc b/sdk/android/src/jni/audio_device/audio_device_module.cc
index 437012f..4e69dd5 100644
--- a/sdk/android/src/jni/audio_device/audio_device_module.cc
+++ b/sdk/android/src/jni/audio_device/audio_device_module.cc
@@ -13,6 +13,7 @@
 #include <utility>
 
 #include "absl/memory/memory.h"
+#include "api/task_queue/global_task_queue_factory.h"
 #include "modules/audio_device/audio_device_buffer.h"
 #include "rtc_base/checks.h"
 #include "rtc_base/logging.h"
@@ -88,7 +89,8 @@
   int32_t Init() override {
     RTC_LOG(INFO) << __FUNCTION__;
     RTC_DCHECK(thread_checker_.CalledOnValidThread());
-    audio_device_buffer_ = absl::make_unique<AudioDeviceBuffer>();
+    audio_device_buffer_ =
+        absl::make_unique<AudioDeviceBuffer>(&GlobalTaskQueueFactory());
     AttachAudioBuffer();
     if (initialized_) {
       return 0;
diff --git a/sdk/objc/native/src/audio/audio_device_module_ios.mm b/sdk/objc/native/src/audio/audio_device_module_ios.mm
index ff9da47..b001dea 100644
--- a/sdk/objc/native/src/audio/audio_device_module_ios.mm
+++ b/sdk/objc/native/src/audio/audio_device_module_ios.mm
@@ -10,6 +10,7 @@
 
 #include "audio_device_module_ios.h"
 
+#include "api/task_queue/global_task_queue_factory.h"
 #include "modules/audio_device/audio_device_config.h"
 #include "modules/audio_device/audio_device_generic.h"
 #include "rtc_base/checks.h"
@@ -69,7 +70,7 @@
     if (initialized_)
       return 0;
 
-    audio_device_buffer_.reset(new webrtc::AudioDeviceBuffer());
+    audio_device_buffer_.reset(new webrtc::AudioDeviceBuffer(&GlobalTaskQueueFactory()));
     audio_device_.reset(new ios_adm::AudioDeviceIOS());
     RTC_CHECK(audio_device_);
 
diff --git a/video/BUILD.gn b/video/BUILD.gn
index ab79852..51dcb9d 100644
--- a/video/BUILD.gn
+++ b/video/BUILD.gn
@@ -247,6 +247,8 @@
       "../api:fec_controller_api",
       "../api:test_dependency_factory",
       "../api:video_quality_test_fixture_api",
+      "../api/task_queue",
+      "../api/task_queue:default_task_queue_factory",
       "../api/video:builtin_video_bitrate_allocator_factory",
       "../api/video:video_bitrate_allocator_factory",
       "../api/video:video_frame",
diff --git a/video/video_quality_test.cc b/video/video_quality_test.cc
index e30b459..5aead68 100644
--- a/video/video_quality_test.cc
+++ b/video/video_quality_test.cc
@@ -17,6 +17,7 @@
 #include <vector>
 
 #include "absl/memory/memory.h"
+#include "api/task_queue/default_task_queue_factory.h"
 #include "api/video/builtin_video_bitrate_allocator_factory.h"
 #include "call/fake_network_pipe.h"
 #include "call/simulated_network.h"
@@ -323,6 +324,7 @@
 VideoQualityTest::VideoQualityTest(
     std::unique_ptr<InjectionComponents> injection_components)
     : clock_(Clock::GetRealTimeClock()),
+      task_queue_factory_(CreateDefaultTaskQueueFactory()),
       video_decoder_factory_([this](const SdpVideoFormat& format) {
         return this->CreateVideoDecoder(format);
       }),
@@ -1307,10 +1309,11 @@
   RTC_CHECK(com_initializer_->Succeeded());
   RTC_CHECK(webrtc_win::core_audio_utility::IsSupported());
   RTC_CHECK(webrtc_win::core_audio_utility::IsMMCSSSupported());
-  return CreateWindowsCoreAudioAudioDeviceModule();
+  return CreateWindowsCoreAudioAudioDeviceModule(task_queue_factory_.get());
 #else
   // Use legacy factory method on all platforms except Windows.
-  return AudioDeviceModule::Create(AudioDeviceModule::kPlatformDefaultAudio);
+  return AudioDeviceModule::Create(AudioDeviceModule::kPlatformDefaultAudio,
+                                   task_queue_factory_.get());
 #endif
 }
 
diff --git a/video/video_quality_test.h b/video/video_quality_test.h
index 028dddf..b0f9036 100644
--- a/video/video_quality_test.h
+++ b/video/video_quality_test.h
@@ -16,6 +16,7 @@
 #include <vector>
 
 #include "api/fec_controller.h"
+#include "api/task_queue/task_queue_factory.h"
 #include "api/test/video_quality_test_fixture.h"
 #include "api/video/video_bitrate_allocator_factory.h"
 #include "call/fake_network_pipe.h"
@@ -100,6 +101,7 @@
   std::vector<std::unique_ptr<rtc::VideoSourceInterface<VideoFrame>>>
       thumbnail_capturers_;
   Clock* const clock_;
+  const std::unique_ptr<TaskQueueFactory> task_queue_factory_;
 
   test::FunctionVideoDecoderFactory video_decoder_factory_;
   InternalDecoderFactory internal_decoder_factory_;