Procházet zdrojové kódy

Merge pull request #2195 from jpark37/com-sta

Clean up COM initialization
Jim před 6 roky
rodič
revize
c4ac9d47ce
3 změnil soubory, kde provedl 24 přidání a 6 odebrání
  1. 8 2
      libobs/obs-windows.c
  2. 5 3
      libobs/obs.c
  3. 11 1
      plugins/win-wasapi/win-wasapi.cpp

+ 8 - 2
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)

+ 5 - 3
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
 }
 

+ 11 - 1
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;