From 7d3e086e6f59f4354e57f3fa48a81285a1b4db5e Mon Sep 17 00:00:00 2001 From: jpark37 Date: Sun, 24 Nov 2019 09:43:39 -0800 Subject: [PATCH 1/2] win-wasapi: Verify and balance CoInitializeEx call --- plugins/win-wasapi/win-wasapi.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/plugins/win-wasapi/win-wasapi.cpp b/plugins/win-wasapi/win-wasapi.cpp index 68432b08c..b66a29064 100644 --- a/plugins/win-wasapi/win-wasapi.cpp +++ b/plugins/win-wasapi/win-wasapi.cpp @@ -386,7 +386,14 @@ DWORD WINAPI WASAPISource::ReconnectThread(LPVOID param) os_set_thread_name("win-wasapi: reconnect thread"); - CoInitializeEx(0, COINIT_MULTITHREADED); + const HRESULT hr = CoInitializeEx(0, COINIT_MULTITHREADED); + const bool com_initialized = SUCCEEDED(hr); + if (!com_initialized) { + blog(LOG_ERROR, + "[WASAPISource::ReconnectThread]" + " CoInitializeEx failed: 0x%08X", + hr); + } obs_monitoring_type type = obs_source_get_monitoring_type(source->source); @@ -400,6 +407,9 @@ DWORD WINAPI WASAPISource::ReconnectThread(LPVOID param) obs_source_set_monitoring_type(source->source, type); + if (com_initialized) + CoUninitialize(); + source->reconnectThread = nullptr; source->reconnecting = false; return 0; From 66d78275e2aa0eab7b2cae7d3770b5d996a1587a Mon Sep 17 00:00:00 2001 From: jpark37 Date: Sun, 24 Nov 2019 09:46:41 -0800 Subject: [PATCH 2/2] libobs: Robust COM initialization Qt seems to force STA, so it's misleading to ask for MTA and ignore the failure result, so just ask for STA. Also, don't uninitialize COM if initialization failed. --- libobs/obs-windows.c | 10 ++++++++-- libobs/obs.c | 8 +++++--- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/libobs/obs-windows.c b/libobs/obs-windows.c index 2317f450f..731fffed0 100644 --- a/libobs/obs-windows.c +++ b/libobs/obs-windows.c @@ -1259,9 +1259,15 @@ void obs_init_win32_crash_handler(void) initialize_crash_handler(); } -void initialize_com(void) +bool initialize_com(void) { - CoInitializeEx(0, COINIT_MULTITHREADED); + const HRESULT hr = CoInitializeEx(0, COINIT_APARTMENTTHREADED); + const bool success = SUCCEEDED(hr); + if (success) + blog(LOG_INFO, "CoInitializeEx succeeded: 0x%08X", hr); + else + blog(LOG_ERROR, "CoInitializeEx failed: 0x%08X", hr); + return success; } void uninitialize_com(void) diff --git a/libobs/obs.c b/libobs/obs.c index 9ea3a8ac5..03289e02c 100644 --- a/libobs/obs.c +++ b/libobs/obs.c @@ -871,8 +871,9 @@ static bool obs_init(const char *locale, const char *module_config_path, } #ifdef _WIN32 -extern void initialize_com(void); +extern bool initialize_com(void); extern void uninitialize_com(void); +static bool com_initialized = false; #endif /* Separate from actual context initialization @@ -933,7 +934,7 @@ bool obs_startup(const char *locale, const char *module_config_path, } #ifdef _WIN32 - initialize_com(); + com_initialized = initialize_com(); #endif success = obs_init(locale, module_config_path, store); @@ -1048,7 +1049,8 @@ void obs_shutdown(void) bfree(cmdline_args.argv); #ifdef _WIN32 - uninitialize_com(); + if (com_initialized) + uninitialize_com(); #endif }