Browse Source
Merge pull request #2176 from lioncash/com
audio_core/cubeb_sink: Ensure COM is initialized on Windows prior to calling cubeb_init
pull/15/merge
bunnei
7 years ago
committed by
GitHub
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with
19 additions and
0 deletions
-
src/audio_core/cubeb_sink.cpp
-
src/audio_core/cubeb_sink.h
|
|
|
@ -12,6 +12,10 @@ |
|
|
|
#include "common/ring_buffer.h"
|
|
|
|
#include "core/settings.h"
|
|
|
|
|
|
|
|
#ifdef _MSC_VER
|
|
|
|
#include <objbase.h>
|
|
|
|
#endif
|
|
|
|
|
|
|
|
namespace AudioCore { |
|
|
|
|
|
|
|
class CubebSinkStream final : public SinkStream { |
|
|
|
@ -108,6 +112,11 @@ private: |
|
|
|
}; |
|
|
|
|
|
|
|
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) { |
|
|
|
LOG_CRITICAL(Audio_Sink, "cubeb_init failed"); |
|
|
|
return; |
|
|
|
@ -142,6 +151,12 @@ CubebSink::~CubebSink() { |
|
|
|
} |
|
|
|
|
|
|
|
cubeb_destroy(ctx); |
|
|
|
|
|
|
|
#ifdef _MSC_VER
|
|
|
|
if (SUCCEEDED(com_init_result)) { |
|
|
|
CoUninitialize(); |
|
|
|
} |
|
|
|
#endif
|
|
|
|
} |
|
|
|
|
|
|
|
SinkStream& CubebSink::AcquireSinkStream(u32 sample_rate, u32 num_channels, |
|
|
|
|
|
|
|
@ -25,6 +25,10 @@ private: |
|
|
|
cubeb* ctx{}; |
|
|
|
cubeb_devid output_device{}; |
|
|
|
std::vector<SinkStreamPtr> sink_streams; |
|
|
|
|
|
|
|
#ifdef _MSC_VER |
|
|
|
u32 com_init_result = 0; |
|
|
|
#endif |
|
|
|
}; |
|
|
|
|
|
|
|
std::vector<std::string> ListCubebSinkDevices(); |
|
|
|
|