// Copyright 2017 Dolphin Emulator Project // Licensed under GPLv2+ // Refer to the license.txt file included. #include #include #include #include "Common/LibusbContext.h" #include "Common/MsgHandler.h" namespace LibusbContext { static std::shared_ptr s_libusb_context; static std::once_flag s_context_initialized; static libusb_context* Create() { libusb_context* context; const int ret = libusb_init(&context); if (ret < LIBUSB_SUCCESS) { bool is_windows = false; #ifdef _WIN32 is_windows = true; #endif if (is_windows && ret == LIBUSB_ERROR_NOT_FOUND) PanicAlertT("Failed to initialize libusb because usbdk is not installed."); else PanicAlertT("Failed to initialize libusb: %s", libusb_error_name(ret)); return nullptr; } return context; } std::shared_ptr Get() { std::call_once(s_context_initialized, []() { s_libusb_context.reset(Create(), [](auto* context) { if (context != nullptr) libusb_exit(context); }); }); return s_libusb_context; } }