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 } 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;