hidapi: Allow disabling libusb support at runtime

This commit is contained in:
Ethan Lee 2022-05-30 16:17:04 -04:00 committed by Sam Lantinga
parent c87b0142fe
commit 964e979d06

View File

@ -1037,54 +1037,60 @@ int SDL_hid_init(void)
#endif #endif
#ifdef SDL_LIBUSB_DYNAMIC #ifdef SDL_LIBUSB_DYNAMIC
++attempts; if (SDL_getenv("SDL_HIDAPI_DISABLE_LIBUSB") != NULL) {
libusb_ctx.libhandle = SDL_LoadObject(SDL_LIBUSB_DYNAMIC); SDL_LogDebug(SDL_LOG_CATEGORY_INPUT,
if (libusb_ctx.libhandle != NULL) { "libusb disabled by SDL_HIDAPI_DISABLE_LIBUSB");
SDL_bool loaded = SDL_TRUE; libusb_ctx.libhandle = NULL;
#ifdef __OS2__ } else {
#define LOAD_LIBUSB_SYMBOL(func) \ ++attempts;
if (!(libusb_ctx.func = SDL_LoadFunction(libusb_ctx.libhandle,"_libusb_" #func))) {loaded = SDL_FALSE;} libusb_ctx.libhandle = SDL_LoadObject(SDL_LIBUSB_DYNAMIC);
#else if (libusb_ctx.libhandle != NULL) {
#define LOAD_LIBUSB_SYMBOL(func) \ SDL_bool loaded = SDL_TRUE;
if (!(libusb_ctx.func = SDL_LoadFunction(libusb_ctx.libhandle, "libusb_" #func))) {loaded = SDL_FALSE;} #ifdef __OS2__
#endif #define LOAD_LIBUSB_SYMBOL(func) \
LOAD_LIBUSB_SYMBOL(init) if (!(libusb_ctx.func = SDL_LoadFunction(libusb_ctx.libhandle,"_libusb_" #func))) {loaded = SDL_FALSE;}
LOAD_LIBUSB_SYMBOL(exit) #else
LOAD_LIBUSB_SYMBOL(get_device_list) #define LOAD_LIBUSB_SYMBOL(func) \
LOAD_LIBUSB_SYMBOL(free_device_list) if (!(libusb_ctx.func = SDL_LoadFunction(libusb_ctx.libhandle, "libusb_" #func))) {loaded = SDL_FALSE;}
LOAD_LIBUSB_SYMBOL(get_device_descriptor) #endif
LOAD_LIBUSB_SYMBOL(get_active_config_descriptor) LOAD_LIBUSB_SYMBOL(init)
LOAD_LIBUSB_SYMBOL(get_config_descriptor) LOAD_LIBUSB_SYMBOL(exit)
LOAD_LIBUSB_SYMBOL(free_config_descriptor) LOAD_LIBUSB_SYMBOL(get_device_list)
LOAD_LIBUSB_SYMBOL(get_bus_number) LOAD_LIBUSB_SYMBOL(free_device_list)
LOAD_LIBUSB_SYMBOL(get_device_address) LOAD_LIBUSB_SYMBOL(get_device_descriptor)
LOAD_LIBUSB_SYMBOL(open) LOAD_LIBUSB_SYMBOL(get_active_config_descriptor)
LOAD_LIBUSB_SYMBOL(close) LOAD_LIBUSB_SYMBOL(get_config_descriptor)
LOAD_LIBUSB_SYMBOL(claim_interface) LOAD_LIBUSB_SYMBOL(free_config_descriptor)
LOAD_LIBUSB_SYMBOL(release_interface) LOAD_LIBUSB_SYMBOL(get_bus_number)
LOAD_LIBUSB_SYMBOL(kernel_driver_active) LOAD_LIBUSB_SYMBOL(get_device_address)
LOAD_LIBUSB_SYMBOL(detach_kernel_driver) LOAD_LIBUSB_SYMBOL(open)
LOAD_LIBUSB_SYMBOL(attach_kernel_driver) LOAD_LIBUSB_SYMBOL(close)
LOAD_LIBUSB_SYMBOL(set_interface_alt_setting) LOAD_LIBUSB_SYMBOL(claim_interface)
LOAD_LIBUSB_SYMBOL(alloc_transfer) LOAD_LIBUSB_SYMBOL(release_interface)
LOAD_LIBUSB_SYMBOL(submit_transfer) LOAD_LIBUSB_SYMBOL(kernel_driver_active)
LOAD_LIBUSB_SYMBOL(cancel_transfer) LOAD_LIBUSB_SYMBOL(detach_kernel_driver)
LOAD_LIBUSB_SYMBOL(free_transfer) LOAD_LIBUSB_SYMBOL(attach_kernel_driver)
LOAD_LIBUSB_SYMBOL(control_transfer) LOAD_LIBUSB_SYMBOL(set_interface_alt_setting)
LOAD_LIBUSB_SYMBOL(interrupt_transfer) LOAD_LIBUSB_SYMBOL(alloc_transfer)
LOAD_LIBUSB_SYMBOL(handle_events) LOAD_LIBUSB_SYMBOL(submit_transfer)
LOAD_LIBUSB_SYMBOL(handle_events_completed) LOAD_LIBUSB_SYMBOL(cancel_transfer)
#undef LOAD_LIBUSB_SYMBOL LOAD_LIBUSB_SYMBOL(free_transfer)
LOAD_LIBUSB_SYMBOL(control_transfer)
LOAD_LIBUSB_SYMBOL(interrupt_transfer)
LOAD_LIBUSB_SYMBOL(handle_events)
LOAD_LIBUSB_SYMBOL(handle_events_completed)
#undef LOAD_LIBUSB_SYMBOL
if (!loaded) { if (!loaded) {
SDL_UnloadObject(libusb_ctx.libhandle); SDL_UnloadObject(libusb_ctx.libhandle);
libusb_ctx.libhandle = NULL; libusb_ctx.libhandle = NULL;
/* SDL_LogWarn(SDL_LOG_CATEGORY_INPUT, SDL_LIBUSB_DYNAMIC " found but could not load function"); */ /* SDL_LogWarn(SDL_LOG_CATEGORY_INPUT, SDL_LIBUSB_DYNAMIC " found but could not load function"); */
} else if (LIBUSB_hid_init() < 0) { } else if (LIBUSB_hid_init() < 0) {
SDL_UnloadObject(libusb_ctx.libhandle); SDL_UnloadObject(libusb_ctx.libhandle);
libusb_ctx.libhandle = NULL; libusb_ctx.libhandle = NULL;
} else { } else {
++success; ++success;
}
} }
} }
#endif /* SDL_LIBUSB_DYNAMIC */ #endif /* SDL_LIBUSB_DYNAMIC */