mirror of
				https://git.suyu.dev/suyu/suyu
				synced 2025-11-04 00:49:02 -06:00 
			
		
		
		
	Merge pull request #2176 from lioncash/com
audio_core/cubeb_sink: Ensure COM is initialized on Windows prior to calling cubeb_init
This commit is contained in:
		@@ -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,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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();
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user