瀏覽代碼

audio_core/cubeb_sink: Ensure COM is initialized on Windows prior to calling cubeb_init

cubeb now requires that COM explicitly be initialized on the thread
prior to calling cubeb_init.
Lioncash 7 年之前
父節點
當前提交
1068c1b06f
共有 2 個文件被更改,包括 19 次插入0 次删除
  1. 15 0
      src/audio_core/cubeb_sink.cpp
  2. 4 0
      src/audio_core/cubeb_sink.h

+ 15 - 0
src/audio_core/cubeb_sink.cpp

@@ -12,6 +12,10 @@
 #include "common/ring_buffer.h"
 #include "common/ring_buffer.h"
 #include "core/settings.h"
 #include "core/settings.h"
 
 
+#ifdef _MSC_VER
+#include <objbase.h>
+#endif
+
 namespace AudioCore {
 namespace AudioCore {
 
 
 class CubebSinkStream final : public SinkStream {
 class CubebSinkStream final : public SinkStream {
@@ -108,6 +112,11 @@ private:
 };
 };
 
 
 CubebSink::CubebSink(std::string_view target_device_name) {
 CubebSink::CubebSink(std::string_view target_device_name) {
+    // Cubeb requires COM to be initialized on the thread calling cubeb_init on Windows
+#ifdef _MSC_VER
+    com_init_result = CoInitializeEx(nullptr, COINIT_MULTITHREADED);
+#endif
+
     if (cubeb_init(&ctx, "yuzu", nullptr) != CUBEB_OK) {
     if (cubeb_init(&ctx, "yuzu", nullptr) != CUBEB_OK) {
         LOG_CRITICAL(Audio_Sink, "cubeb_init failed");
         LOG_CRITICAL(Audio_Sink, "cubeb_init failed");
         return;
         return;
@@ -142,6 +151,12 @@ CubebSink::~CubebSink() {
     }
     }
 
 
     cubeb_destroy(ctx);
     cubeb_destroy(ctx);
+
+#ifdef _MSC_VER
+    if (SUCCEEDED(com_init_result)) {
+        CoUninitialize();
+    }
+#endif
 }
 }
 
 
 SinkStream& CubebSink::AcquireSinkStream(u32 sample_rate, u32 num_channels,
 SinkStream& CubebSink::AcquireSinkStream(u32 sample_rate, u32 num_channels,

+ 4 - 0
src/audio_core/cubeb_sink.h

@@ -25,6 +25,10 @@ private:
     cubeb* ctx{};
     cubeb* ctx{};
     cubeb_devid output_device{};
     cubeb_devid output_device{};
     std::vector<SinkStreamPtr> sink_streams;
     std::vector<SinkStreamPtr> sink_streams;
+
+#ifdef _MSC_VER
+    u32 com_init_result = 0;
+#endif
 };
 };
 
 
 std::vector<std::string> ListCubebSinkDevices();
 std::vector<std::string> ListCubebSinkDevices();