Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Merge pull request #10599 from shuffle2/libusb
Libusb fixups
  • Loading branch information
AdmiralCurtiss committed Apr 23, 2022
2 parents 19c71db + 12cd81b commit 8b5a61b
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 8 deletions.
2 changes: 2 additions & 0 deletions .gitmodules
Expand Up @@ -16,3 +16,5 @@
[submodule "libusb"]
path = Externals/libusb/libusb
url = https://github.com/libusb/libusb.git
branch = master
shallow = true
2 changes: 1 addition & 1 deletion Externals/libusb/libusb
33 changes: 26 additions & 7 deletions Source/Core/InputCommon/GCAdapter.cpp
Expand Up @@ -25,6 +25,15 @@
#include "InputCommon/GCAdapter.h"
#include "InputCommon/GCPadStatus.h"

#if defined(LIBUSB_API_VERSION)
#define LIBUSB_API_VERSION_EXIST 1
#else
#define LIBUSB_API_VERSION_EXIST 0
#endif

#define LIBUSB_API_VERSION_ATLEAST(v) (LIBUSB_API_VERSION_EXIST && LIBUSB_API_VERSION >= (v))
#define LIBUSB_API_HAS_HOTPLUG LIBUSB_API_VERSION_ATLEAST(0x01000102)

namespace GCAdapter
{
static bool CheckDeviceAccess(libusb_device* device);
Expand Down Expand Up @@ -71,7 +80,7 @@ static bool s_libusb_hotplug_enabled = true;
#else
static bool s_libusb_hotplug_enabled = false;
#endif
#if defined(LIBUSB_API_VERSION) && LIBUSB_API_VERSION >= 0x01000102
#if LIBUSB_API_HAS_HOTPLUG
static libusb_hotplug_callback_handle s_hotplug_handle;
#endif

Expand All @@ -89,6 +98,8 @@ static std::array<bool, SerialInterface::MAX_SI_CHANNELS> s_config_rumble_enable

static void Read()
{
Common::SetCurrentThreadName("GCAdapter Read Thread");

int payload_size = 0;
while (s_adapter_thread_running.IsSet())
{
Expand All @@ -110,6 +121,8 @@ static void Read()

static void Write()
{
Common::SetCurrentThreadName("GCAdapter Write Thread");

int size = 0;

while (true)
Expand All @@ -134,7 +147,7 @@ static void Write()
}
}

#if defined(LIBUSB_API_VERSION) && LIBUSB_API_VERSION >= 0x01000102
#if LIBUSB_API_HAS_HOTPLUG
static int HotplugCallback(libusb_context* ctx, libusb_device* dev, libusb_hotplug_event event,
void* user_data)
{
Expand Down Expand Up @@ -165,7 +178,7 @@ static void ScanThreadFunc()
Common::SetCurrentThreadName("GC Adapter Scanning Thread");
NOTICE_LOG_FMT(CONTROLLERINTERFACE, "GC Adapter scanning thread started");

#if defined(LIBUSB_API_VERSION) && LIBUSB_API_VERSION >= 0x01000102
#if LIBUSB_API_HAS_HOTPLUG
#ifndef __FreeBSD__
s_libusb_hotplug_enabled = libusb_has_capability(LIBUSB_CAP_HAS_HOTPLUG) != 0;
#endif
Expand Down Expand Up @@ -322,11 +335,17 @@ static bool CheckDeviceAccess(libusb_device* device)
return false;
}

bool detach_failed = false;
ret = libusb_kernel_driver_active(s_handle, 0);
if (ret == 1)
{
// On macos detaching would fail without root or entitlement.
// We assume user is using GCAdapterDriver and therefor don't want to detach anything
#if !defined(__APPLE__)
ret = libusb_detach_kernel_driver(s_handle, 0);
if (ret != 0 && ret != LIBUSB_ERROR_NOT_SUPPORTED)
detach_failed = ret < 0 && ret != LIBUSB_ERROR_NOT_FOUND && ret != LIBUSB_ERROR_NOT_SUPPORTED;
#endif
if (detach_failed)
ERROR_LOG_FMT(CONTROLLERINTERFACE, "libusb_detach_kernel_driver failed with error: {}", ret);
}

Expand All @@ -338,7 +357,7 @@ static bool CheckDeviceAccess(libusb_device* device)

// this split is needed so that we don't avoid claiming the interface when
// detaching the kernel driver is successful
if (ret != 0 && ret != LIBUSB_ERROR_NOT_SUPPORTED)
if (detach_failed)
{
libusb_close(s_handle);
s_handle = nullptr;
Expand Down Expand Up @@ -398,12 +417,12 @@ static void AddGCAdapter(libusb_device* device)
void Shutdown()
{
StopScanThread();
#if defined(LIBUSB_API_VERSION) && LIBUSB_API_VERSION >= 0x01000102
#if LIBUSB_API_HAS_HOTPLUG
if (s_libusb_context->IsValid() && s_libusb_hotplug_enabled)
libusb_hotplug_deregister_callback(*s_libusb_context, s_hotplug_handle);
#endif
s_libusb_context.reset();
Reset();
s_libusb_context.reset();

s_status = NO_ADAPTER_DETECTED;

Expand Down

0 comments on commit 8b5a61b

Please sign in to comment.