diff options
| author | 2019-02-27 17:12:06 -0500 | |
|---|---|---|
| committer | 2019-02-27 17:12:06 -0500 | |
| commit | 532dda0499a24750fbbe3da66085297b5dc4a9a7 (patch) | |
| tree | 3e1acda7950a0713268a709068c8e5c9ab4f9b06 /src/audio_core/cubeb_sink.cpp | |
| parent | Merge pull request #2169 from lioncash/naming (diff) | |
| parent | audio_core/cubeb_sink: Ensure COM is initialized on Windows prior to calling ... (diff) | |
| download | yuzu-532dda0499a24750fbbe3da66085297b5dc4a9a7.tar.gz yuzu-532dda0499a24750fbbe3da66085297b5dc4a9a7.tar.xz yuzu-532dda0499a24750fbbe3da66085297b5dc4a9a7.zip | |
Merge pull request #2176 from lioncash/com
audio_core/cubeb_sink: Ensure COM is initialized on Windows prior to calling cubeb_init
Diffstat (limited to 'src/audio_core/cubeb_sink.cpp')
| -rw-r--r-- | src/audio_core/cubeb_sink.cpp | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/src/audio_core/cubeb_sink.cpp b/src/audio_core/cubeb_sink.cpp index dc45dedd3..1da0b9f2a 100644 --- a/src/audio_core/cubeb_sink.cpp +++ b/src/audio_core/cubeb_sink.cpp | |||
| @@ -12,6 +12,10 @@ | |||
| 12 | #include "common/ring_buffer.h" | 12 | #include "common/ring_buffer.h" |
| 13 | #include "core/settings.h" | 13 | #include "core/settings.h" |
| 14 | 14 | ||
| 15 | #ifdef _MSC_VER | ||
| 16 | #include <objbase.h> | ||
| 17 | #endif | ||
| 18 | |||
| 15 | namespace AudioCore { | 19 | namespace AudioCore { |
| 16 | 20 | ||
| 17 | class CubebSinkStream final : public SinkStream { | 21 | class CubebSinkStream final : public SinkStream { |
| @@ -108,6 +112,11 @@ private: | |||
| 108 | }; | 112 | }; |
| 109 | 113 | ||
| 110 | CubebSink::CubebSink(std::string_view target_device_name) { | 114 | CubebSink::CubebSink(std::string_view target_device_name) { |
| 115 | // Cubeb requires COM to be initialized on the thread calling cubeb_init on Windows | ||
| 116 | #ifdef _MSC_VER | ||
| 117 | com_init_result = CoInitializeEx(nullptr, COINIT_MULTITHREADED); | ||
| 118 | #endif | ||
| 119 | |||
| 111 | if (cubeb_init(&ctx, "yuzu", nullptr) != CUBEB_OK) { | 120 | if (cubeb_init(&ctx, "yuzu", nullptr) != CUBEB_OK) { |
| 112 | LOG_CRITICAL(Audio_Sink, "cubeb_init failed"); | 121 | LOG_CRITICAL(Audio_Sink, "cubeb_init failed"); |
| 113 | return; | 122 | return; |
| @@ -142,6 +151,12 @@ CubebSink::~CubebSink() { | |||
| 142 | } | 151 | } |
| 143 | 152 | ||
| 144 | cubeb_destroy(ctx); | 153 | cubeb_destroy(ctx); |
| 154 | |||
| 155 | #ifdef _MSC_VER | ||
| 156 | if (SUCCEEDED(com_init_result)) { | ||
| 157 | CoUninitialize(); | ||
| 158 | } | ||
| 159 | #endif | ||
| 145 | } | 160 | } |
| 146 | 161 | ||
| 147 | SinkStream& CubebSink::AcquireSinkStream(u32 sample_rate, u32 num_channels, | 162 | SinkStream& CubebSink::AcquireSinkStream(u32 sample_rate, u32 num_channels, |