Propagate Clock with Environment into win helper CoreAudioBase

Bug: webrtc:42223992
Change-Id: I81c0dad6e041a53a4d5f77ea70caa6e8dd55c5a3
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/406102
Commit-Queue: Danil Chapovalov <danilchap@webrtc.org>
Reviewed-by: Henrik Andreassson <henrika@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#45431}
diff --git a/modules/audio_device/BUILD.gn b/modules/audio_device/BUILD.gn
index 82e6408..8e8a4bf 100644
--- a/modules/audio_device/BUILD.gn
+++ b/modules/audio_device/BUILD.gn
@@ -146,19 +146,23 @@
 
     deps = [
       ":audio_device_buffer",
+      ":audio_device_name",
       ":windows_core_audio_utility",
+      "../../api:array_view",
       "../../api:make_ref_counted",
       "../../api:scoped_refptr",
       "../../api:sequence_checker",
       "../../api/audio:audio_device",
       "../../api/environment",
       "../../api/task_queue",
+      "../../api/units:time_delta",
       "../../rtc_base:checks",
       "../../rtc_base:logging",
       "../../rtc_base:platform_thread",
       "../../rtc_base:safe_conversions",
       "../../rtc_base:stringutils",
       "../../rtc_base:timeutils",
+      "../../rtc_base:zero_memory",
       "../../rtc_base/win:scoped_com_initializer",
       "../../rtc_base/win:windows_version",
       "//third_party/abseil-cpp/absl/strings",
diff --git a/modules/audio_device/include/audio_device_factory.cc b/modules/audio_device/include/audio_device_factory.cc
index a823401..fac3d16 100644
--- a/modules/audio_device/include/audio_device_factory.cc
+++ b/modules/audio_device/include/audio_device_factory.cc
@@ -10,7 +10,11 @@
 
 #include "modules/audio_device/include/audio_device_factory.h"
 
+#include <memory>
+
+#include "api/audio/audio_device.h"
 #include "api/environment/environment.h"
+#include "api/scoped_refptr.h"
 #include "rtc_base/logging.h"
 
 #if defined(WEBRTC_WIN)
@@ -41,8 +45,8 @@
     return nullptr;
   }
   return CreateWindowsCoreAudioAudioDeviceModuleFromInputAndOutput(
-      env, std::make_unique<webrtc_win::CoreAudioInput>(automatic_restart),
-      std::make_unique<webrtc_win::CoreAudioOutput>(automatic_restart));
+      env, std::make_unique<webrtc_win::CoreAudioInput>(env, automatic_restart),
+      std::make_unique<webrtc_win::CoreAudioOutput>(env, automatic_restart));
 }
 
 }  // namespace webrtc
diff --git a/modules/audio_device/win/core_audio_base_win.cc b/modules/audio_device/win/core_audio_base_win.cc
index 98cb29f..be90bb4 100644
--- a/modules/audio_device/win/core_audio_base_win.cc
+++ b/modules/audio_device/win/core_audio_base_win.cc
@@ -10,17 +10,20 @@
 
 #include "modules/audio_device/win/core_audio_base_win.h"
 
+#include <cstdint>
 #include <iterator>
-#include <memory>
 #include <string>
 
 #include "absl/strings/string_view.h"
-#include "modules/audio_device/audio_device_buffer.h"
+#include "api/audio/audio_device_defines.h"
+#include "api/environment/environment.h"
+#include "api/sequence_checker.h"
+#include "modules/audio_device/audio_device_name.h"
+#include "modules/audio_device/win/core_audio_utility_win.h"
 #include "rtc_base/checks.h"
 #include "rtc_base/logging.h"
 #include "rtc_base/numerics/safe_conversions.h"
 #include "rtc_base/platform_thread.h"
-#include "rtc_base/time_utils.h"
 #include "rtc_base/win/scoped_com_initializer.h"
 #include "rtc_base/win/windows_version.h"
 
@@ -151,11 +154,13 @@
 
 }  // namespace
 
-CoreAudioBase::CoreAudioBase(Direction direction,
+CoreAudioBase::CoreAudioBase(const Environment& env,
+                             Direction direction,
                              bool automatic_restart,
                              OnDataCallback data_callback,
                              OnErrorCallback error_callback)
-    : format_(),
+    : env_(env),
+      format_(),
       direction_(direction),
       automatic_restart_(automatic_restart),
       on_data_callback_(data_callback),
@@ -195,8 +200,8 @@
   return is_restarting_;
 }
 
-int64_t CoreAudioBase::TimeSinceStart() const {
-  return webrtc::TimeSince(start_time_);
+int64_t CoreAudioBase::TimeSinceStartMs() const {
+  return env_.clock().TimeInMilliseconds() - start_time_;
 }
 
 int CoreAudioBase::NumberOfActiveDevices() const {
@@ -576,7 +581,7 @@
     return false;
   }
 
-  start_time_ = webrtc::TimeMillis();
+  start_time_ = env_.clock().TimeInMilliseconds();
   num_data_callbacks_ = 0;
 
   return true;
@@ -585,7 +590,7 @@
 bool CoreAudioBase::Stop() {
   RTC_DLOG(LS_INFO) << __FUNCTION__ << "[" << DirectionToString(direction())
                     << "]";
-  RTC_DLOG(LS_INFO) << "total activity time: " << TimeSinceStart();
+  RTC_DLOG(LS_INFO) << "total activity time: " << TimeSinceStartMs();
 
   // Stop audio streaming.
   _com_error error = audio_client_->Stop();
diff --git a/modules/audio_device/win/core_audio_base_win.h b/modules/audio_device/win/core_audio_base_win.h
index 918c675..1fe7cdc 100644
--- a/modules/audio_device/win/core_audio_base_win.h
+++ b/modules/audio_device/win/core_audio_base_win.h
@@ -12,12 +12,14 @@
 #define MODULES_AUDIO_DEVICE_WIN_CORE_AUDIO_BASE_WIN_H_
 
 #include <atomic>
+#include <cstdint>
 #include <functional>
-#include <memory>
 #include <optional>
 #include <string>
+#include <type_traits>
 
 #include "absl/strings/string_view.h"
+#include "api/environment/environment.h"
 #include "api/sequence_checker.h"
 #include "modules/audio_device/win/core_audio_utility_win.h"
 #include "rtc_base/platform_thread.h"
@@ -77,7 +79,8 @@
   CoreAudioBase& operator=(const CoreAudioBase&) = delete;
 
  protected:
-  explicit CoreAudioBase(Direction direction,
+  explicit CoreAudioBase(const Environment& env,
+                         Direction direction,
                          bool automatic_restart,
                          OnDataCallback data_callback,
                          OnErrorCallback error_callback);
@@ -122,7 +125,9 @@
   bool IsDefaultCommunicationsDeviceId(absl::string_view device_id) const;
   EDataFlow GetDataFlow() const;
   bool IsRestarting() const;
-  int64_t TimeSinceStart() const;
+  int64_t TimeSinceStartMs() const;
+
+  const Environment env_;
 
   // TODO(henrika): is the existing thread checker in WindowsAudioDeviceModule
   // sufficient? As is, we have one top-level protection and then a second
diff --git a/modules/audio_device/win/core_audio_input_win.cc b/modules/audio_device/win/core_audio_input_win.cc
index 8c52dd9..f6139ae 100644
--- a/modules/audio_device/win/core_audio_input_win.cc
+++ b/modules/audio_device/win/core_audio_input_win.cc
@@ -10,13 +10,24 @@
 
 #include "modules/audio_device/win/core_audio_input_win.h"
 
+#include <cstdint>
 #include <memory>
+#include <optional>
+#include <string>
 
+#include "api/array_view.h"
+#include "api/audio/audio_device.h"
+#include "api/environment/environment.h"
+#include "api/sequence_checker.h"
+#include "api/units/time_delta.h"
 #include "modules/audio_device/audio_device_buffer.h"
 #include "modules/audio_device/fine_audio_buffer.h"
+#include "modules/audio_device/win/core_audio_base_win.h"
+#include "modules/audio_device/win/core_audio_utility_win.h"
 #include "rtc_base/checks.h"
 #include "rtc_base/logging.h"
 #include "rtc_base/numerics/safe_conversions.h"
+#include "rtc_base/zero_memory.h"
 
 using Microsoft::WRL::ComPtr;
 
@@ -27,8 +38,9 @@
   kMessageInputStreamDisconnected,
 };
 
-CoreAudioInput::CoreAudioInput(bool automatic_restart)
+CoreAudioInput::CoreAudioInput(const Environment& env, bool automatic_restart)
     : CoreAudioBase(
+          env,
           CoreAudioBase::Direction::kInput,
           automatic_restart,
           [this](uint64_t freq) { return OnDataCallback(freq); },
diff --git a/modules/audio_device/win/core_audio_input_win.h b/modules/audio_device/win/core_audio_input_win.h
index ecf536a..372a5a4 100644
--- a/modules/audio_device/win/core_audio_input_win.h
+++ b/modules/audio_device/win/core_audio_input_win.h
@@ -11,10 +11,13 @@
 #ifndef MODULES_AUDIO_DEVICE_WIN_CORE_AUDIO_INPUT_WIN_H_
 #define MODULES_AUDIO_DEVICE_WIN_CORE_AUDIO_INPUT_WIN_H_
 
+#include <cstdint>
 #include <memory>
 #include <optional>
 #include <string>
 
+#include "api/audio/audio_device.h"
+#include "api/environment/environment.h"
 #include "modules/audio_device/win/audio_device_module_win.h"
 #include "modules/audio_device/win/core_audio_base_win.h"
 
@@ -30,7 +33,7 @@
 // and streaming of captured audio to a WebRTC client.
 class CoreAudioInput final : public CoreAudioBase, public AudioInput {
  public:
-  CoreAudioInput(bool automatic_restart);
+  CoreAudioInput(const Environment& env, bool automatic_restart);
   ~CoreAudioInput() override;
 
   // AudioInput implementation.
diff --git a/modules/audio_device/win/core_audio_output_win.cc b/modules/audio_device/win/core_audio_output_win.cc
index 6db9870..decc0ee 100644
--- a/modules/audio_device/win/core_audio_output_win.cc
+++ b/modules/audio_device/win/core_audio_output_win.cc
@@ -10,10 +10,19 @@
 
 #include "modules/audio_device/win/core_audio_output_win.h"
 
+#include <cstdint>
 #include <memory>
+#include <string>
 
+#include "api/array_view.h"
+#include "api/audio/audio_device.h"
+#include "api/environment/environment.h"
+#include "api/sequence_checker.h"
+#include "api/units/time_delta.h"
 #include "modules/audio_device/audio_device_buffer.h"
 #include "modules/audio_device/fine_audio_buffer.h"
+#include "modules/audio_device/win/core_audio_base_win.h"
+#include "modules/audio_device/win/core_audio_utility_win.h"
 #include "rtc_base/checks.h"
 #include "rtc_base/logging.h"
 #include "rtc_base/time_utils.h"
@@ -23,8 +32,9 @@
 namespace webrtc {
 namespace webrtc_win {
 
-CoreAudioOutput::CoreAudioOutput(bool automatic_restart)
+CoreAudioOutput::CoreAudioOutput(const Environment& env, bool automatic_restart)
     : CoreAudioBase(
+          env,
           CoreAudioBase::Direction::kOutput,
           automatic_restart,
           [this](uint64_t freq) { return OnDataCallback(freq); },
diff --git a/modules/audio_device/win/core_audio_output_win.h b/modules/audio_device/win/core_audio_output_win.h
index 5a54749..a58b671 100644
--- a/modules/audio_device/win/core_audio_output_win.h
+++ b/modules/audio_device/win/core_audio_output_win.h
@@ -11,9 +11,12 @@
 #ifndef MODULES_AUDIO_DEVICE_WIN_CORE_AUDIO_OUTPUT_WIN_H_
 #define MODULES_AUDIO_DEVICE_WIN_CORE_AUDIO_OUTPUT_WIN_H_
 
+#include <cstdint>
 #include <memory>
 #include <string>
 
+#include "api/audio/audio_device.h"
+#include "api/environment/environment.h"
 #include "modules/audio_device/win/audio_device_module_win.h"
 #include "modules/audio_device/win/core_audio_base_win.h"
 
@@ -30,7 +33,7 @@
 // layer.
 class CoreAudioOutput final : public CoreAudioBase, public AudioOutput {
  public:
-  CoreAudioOutput(bool automatic_restart);
+  CoreAudioOutput(const Environment& env, bool automatic_restart);
   ~CoreAudioOutput() override;
 
   // AudioOutput implementation.