diff --git a/plugins/win-capture/game-capture.c b/plugins/win-capture/game-capture.c index fa755407e..819db844a 100644 --- a/plugins/win-capture/game-capture.c +++ b/plugins/win-capture/game-capture.c @@ -452,9 +452,14 @@ static void game_capture_update(void *data, obs_data_t *settings) } } +extern void wait_for_hook_initialization(void); + static void *game_capture_create(obs_data_t *settings, obs_source_t *source) { struct game_capture *gc = bzalloc(sizeof(*gc)); + + wait_for_hook_initialization(); + gc->source = source; gc->initial_config = true; gc->retry_interval = DEFAULT_RETRY_INTERVAL; diff --git a/plugins/win-capture/plugin-main.c b/plugins/win-capture/plugin-main.c index 5c3cbb2e4..92ee8da7e 100644 --- a/plugins/win-capture/plugin-main.c +++ b/plugins/win-capture/plugin-main.c @@ -11,6 +11,8 @@ extern struct obs_source_info monitor_capture_info; extern struct obs_source_info window_capture_info; extern struct obs_source_info game_capture_info; +static HANDLE init_hooks_thread = NULL; + extern bool cached_versions_match(void); extern bool load_cached_graphics_offsets(bool is32bit); extern bool load_graphics_offsets(bool is32bit); @@ -25,6 +27,37 @@ extern bool load_graphics_offsets(bool is32bit); #define USE_HOOK_ADDRESS_CACHE false +static DWORD WINAPI init_hooks(LPVOID unused) +{ + if (USE_HOOK_ADDRESS_CACHE && + cached_versions_match() && + load_cached_graphics_offsets(IS32BIT)) { + + load_cached_graphics_offsets(!IS32BIT); + obs_register_source(&game_capture_info); + + } else if (load_graphics_offsets(IS32BIT)) { + load_graphics_offsets(!IS32BIT); + } + + UNUSED_PARAMETER(unused); + return 0; +} + +void wait_for_hook_initialization(void) +{ + static bool initialized = false; + + if (!initialized) { + if (init_hooks_thread) { + WaitForSingleObject(init_hooks_thread, INFINITE); + CloseHandle(init_hooks_thread); + init_hooks_thread = NULL; + } + initialized = true; + } +} + bool obs_module_load(void) { struct win_version_info ver; @@ -52,17 +85,13 @@ bool obs_module_load(void) obs_register_source(&window_capture_info); - if (USE_HOOK_ADDRESS_CACHE && - cached_versions_match() && - load_cached_graphics_offsets(IS32BIT)) { - - load_cached_graphics_offsets(!IS32BIT); - obs_register_source(&game_capture_info); - - } else if (load_graphics_offsets(IS32BIT)) { - load_graphics_offsets(!IS32BIT); - obs_register_source(&game_capture_info); - } + init_hooks_thread = CreateThread(NULL, 0, init_hooks, NULL, 0, NULL); + obs_register_source(&game_capture_info); return true; } + +void obs_module_unload(void) +{ + wait_for_hook_initialization(); +}