Merge pull request #2159 from mathieui/several-gcadapters

Allow several gc adapters to be plugged
This commit is contained in:
Dolphin Bot 2015-03-13 20:30:28 +01:00
commit 46a67dda6b

View File

@ -104,7 +104,7 @@ void Setup()
int dRet = libusb_get_device_descriptor(device, &desc);
if (dRet)
{
// could not aquire the descriptor, no point in trying to use it.
// could not acquire the descriptor, no point in trying to use it.
ERROR_LOG(SERIALINTERFACE, "libusb_get_device_descriptor failed with error: %d", dRet);
continue;
}
@ -143,36 +143,33 @@ void Setup()
if (ret == LIBUSB_ERROR_NOT_SUPPORTED)
s_libusb_driver_not_supported = true;
}
Shutdown();
}
else if ((ret = libusb_kernel_driver_active(s_handle, 0)) == 1)
{
if ((ret = libusb_detach_kernel_driver(s_handle, 0)) && ret != LIBUSB_ERROR_NOT_SUPPORTED)
{
ERROR_LOG(SERIALINTERFACE, "libusb_detach_kernel_driver failed with error: %d", ret);
Shutdown();
}
else
{
AddGCAdapter(device);
}
}
else if ((ret != 0 && ret != LIBUSB_ERROR_NOT_SUPPORTED))
// 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)
{
ERROR_LOG(SERIALINTERFACE, "libusb_kernel_driver_active error ret = %d", ret);
Shutdown();
continue;
}
else if ((ret = libusb_claim_interface(s_handle, 0)))
{
ERROR_LOG(SERIALINTERFACE, "libusb_claim_interface failed with error: %d", ret);
Shutdown();
}
else
{
AddGCAdapter(device);
break;
}
}
}
if (!s_detected)
Shutdown();
libusb_free_device_list(list, 1);
}
@ -224,7 +221,7 @@ void Shutdown()
void Reset()
{
if (!SConfig::GetInstance().m_GameCubeAdapter)
if (!s_detected)
return;
if (s_adapter_thread_running.TestAndClear())
@ -235,7 +232,6 @@ void Reset()
if (s_handle)
{
libusb_release_interface(s_handle, 0);
libusb_reset_device(s_handle);
libusb_close(s_handle);
s_handle = nullptr;
}
@ -253,9 +249,15 @@ void Input(int chan, GCPadStatus* pad)
if (s_handle == nullptr)
{
if (s_detected)
{
Init();
if (s_handle == nullptr)
return;
}
else
{
return;
}
}
u8 controller_payload_copy[37];
@ -334,7 +336,7 @@ void Output(int chan, u8 rumble_command)
bool IsDetected()
{
return s_handle != nullptr;
return s_detected;
}
bool IsDriverDetected()