Added an untested driver for the Nintendo GameCube adapter, based on code contributed by Ethan Lee

This commit is contained in:
Sam Lantinga 2019-12-19 15:01:35 -08:00
parent 15d30298cf
commit e22e77dadc
6 changed files with 34 additions and 5 deletions

View File

@ -609,6 +609,17 @@ extern "C" {
*/ */
#define SDL_HINT_JOYSTICK_HIDAPI_XBOX "SDL_JOYSTICK_HIDAPI_XBOX" #define SDL_HINT_JOYSTICK_HIDAPI_XBOX "SDL_JOYSTICK_HIDAPI_XBOX"
/**
* \brief A variable controlling whether the HIDAPI driver for Nintendo GameCube controllers should be used.
*
* This variable can be set to the following values:
* "0" - HIDAPI driver is not used
* "1" - HIDAPI driver is used
*
* The default is the value of SDL_HINT_JOYSTICK_HIDAPI
*/
#define SDL_HINT_JOYSTICK_HIDAPI_GAMECUBE "SDL_JOYSTICK_HIDAPI_GAMECUBE"
/** /**
* \brief A variable that controls whether Steam Controllers should be exposed using the SDL joystick and game controller APIs * \brief A variable that controls whether Steam Controllers should be exposed using the SDL joystick and game controller APIs
* *

View File

@ -66,6 +66,7 @@
#if __LINUX__ #if __LINUX__
#include "../../core/linux/SDL_udev.h" #include "../../core/linux/SDL_udev.h"
#undef SDL_USE_LIBUDEV
#if SDL_USE_LIBUDEV #if SDL_USE_LIBUDEV
static const SDL_UDEV_Symbols *udev_ctx = NULL; static const SDL_UDEV_Symbols *udev_ctx = NULL;

View File

@ -33,6 +33,7 @@
#include "../events/SDL_events_c.h" #include "../events/SDL_events_c.h"
#endif #endif
#include "../video/SDL_sysvideo.h" #include "../video/SDL_sysvideo.h"
#include "hidapi/SDL_hidapijoystick_c.h"
/* This is included in only one place because it has a large static list of controllers */ /* This is included in only one place because it has a large static list of controllers */
#include "controller_type.h" #include "controller_type.h"
@ -1043,6 +1044,11 @@ SDL_JoystickUpdate(void)
/* Make sure the list is unlocked while dispatching events to prevent application deadlocks */ /* Make sure the list is unlocked while dispatching events to prevent application deadlocks */
SDL_UnlockJoysticks(); SDL_UnlockJoysticks();
#ifdef SDL_JOYSTICK_HIDAPI
/* Special function for HIDAPI devices, as a single device can provide multiple SDL_Joysticks */
HIDAPI_UpdateDevices();
#endif /* SDL_JOYSTICK_HIDAPI */
for (joystick = SDL_joysticks; joystick; joystick = joystick->next) { for (joystick = SDL_joysticks; joystick; joystick = joystick->next) {
if (joystick->attached) { if (joystick->attached) {
/* This should always be true, but seeing a crash in the wild...? */ /* This should always be true, but seeing a crash in the wild...? */

View File

@ -637,15 +637,15 @@ HIDAPI_DriverSwitch_OpenJoystick(SDL_HIDAPI_Device *device, SDL_Joystick *joysti
ctx = (SDL_DriverSwitch_Context *)SDL_calloc(1, sizeof(*ctx)); ctx = (SDL_DriverSwitch_Context *)SDL_calloc(1, sizeof(*ctx));
if (!ctx) { if (!ctx) {
SDL_OutOfMemory(); SDL_OutOfMemory();
return SDL_FALSE; goto error;
} }
device->context = ctx;
device->dev = ctx->dev = hid_open_path(device->path, 0); device->dev = ctx->dev = hid_open_path(device->path, 0);
if (!device->dev) { if (!device->dev) {
SDL_SetError("Couldn't open %s", device->path); SDL_SetError("Couldn't open %s", device->path);
goto error; goto error;
} }
device->context = ctx;
/* Find out whether or not we can send output reports */ /* Find out whether or not we can send output reports */
ctx->m_bInputOnly = SDL_IsJoystickNintendoSwitchProInputOnly(device->vendor_id, device->product_id); ctx->m_bInputOnly = SDL_IsJoystickNintendoSwitchProInputOnly(device->vendor_id, device->product_id);

View File

@ -74,6 +74,9 @@ static SDL_HIDAPI_DeviceDriver *SDL_HIDAPI_drivers[] = {
#ifdef SDL_JOYSTICK_HIDAPI_XBOXONE #ifdef SDL_JOYSTICK_HIDAPI_XBOXONE
&SDL_HIDAPI_DriverXboxOne, &SDL_HIDAPI_DriverXboxOne,
#endif #endif
#ifdef SDL_JOYSTICK_HIDAPI_GAMECUBE
&SDL_HIDAPI_DriverGameCube,
#endif
}; };
static int SDL_HIDAPI_numdrivers = 0; static int SDL_HIDAPI_numdrivers = 0;
static SDL_mutex *SDL_HIDAPI_mutex; static SDL_mutex *SDL_HIDAPI_mutex;
@ -569,6 +572,7 @@ HIDAPI_JoystickInit(void)
SDL_HIDAPIDriverHintChanged, NULL); SDL_HIDAPIDriverHintChanged, NULL);
HIDAPI_InitializeDiscovery(); HIDAPI_InitializeDiscovery();
HIDAPI_JoystickDetect(); HIDAPI_JoystickDetect();
HIDAPI_UpdateDevices();
initialized = SDL_TRUE; initialized = SDL_TRUE;
@ -842,14 +846,18 @@ HIDAPI_IsDevicePresent(Uint16 vendor_id, Uint16 product_id, Uint16 version, cons
static void static void
HIDAPI_JoystickDetect(void) HIDAPI_JoystickDetect(void)
{ {
SDL_HIDAPI_Device *device;
HIDAPI_UpdateDiscovery(); HIDAPI_UpdateDiscovery();
if (SDL_HIDAPI_discovery.m_bHaveDevicesChanged) { if (SDL_HIDAPI_discovery.m_bHaveDevicesChanged) {
/* FIXME: We probably need to schedule an update in a few seconds as well */ /* FIXME: We probably need to schedule an update in a few seconds as well */
HIDAPI_UpdateDeviceList(); HIDAPI_UpdateDeviceList();
SDL_HIDAPI_discovery.m_bHaveDevicesChanged = SDL_FALSE; SDL_HIDAPI_discovery.m_bHaveDevicesChanged = SDL_FALSE;
} }
}
void
HIDAPI_UpdateDevices(void)
{
SDL_HIDAPI_Device *device;
/* Update the devices, which may change connected joysticks and send events */ /* Update the devices, which may change connected joysticks and send events */
SDL_LockMutex(SDL_HIDAPI_mutex); SDL_LockMutex(SDL_HIDAPI_mutex);
@ -961,7 +969,7 @@ HIDAPI_JoystickRumble(SDL_Joystick * joystick, Uint16 low_frequency_rumble, Uint
static void static void
HIDAPI_JoystickUpdate(SDL_Joystick * joystick) HIDAPI_JoystickUpdate(SDL_Joystick * joystick)
{ {
/* This is handled in HIDAPI_JoystickDetect() */ /* This is handled in SDL_HIDAPI_UpdateDevices() */
} }
static void static void

View File

@ -30,6 +30,7 @@
#define SDL_JOYSTICK_HIDAPI_SWITCH #define SDL_JOYSTICK_HIDAPI_SWITCH
#define SDL_JOYSTICK_HIDAPI_XBOX360 #define SDL_JOYSTICK_HIDAPI_XBOX360
#define SDL_JOYSTICK_HIDAPI_XBOXONE #define SDL_JOYSTICK_HIDAPI_XBOXONE
#define SDL_JOYSTICK_HIDAPI_GAMECUBE
#ifdef __WINDOWS__ #ifdef __WINDOWS__
/* On Windows, Xbox One controllers are handled by the Xbox 360 driver */ /* On Windows, Xbox One controllers are handled by the Xbox 360 driver */
@ -95,10 +96,12 @@ extern SDL_HIDAPI_DeviceDriver SDL_HIDAPI_DriverSwitch;
extern SDL_HIDAPI_DeviceDriver SDL_HIDAPI_DriverXbox360; extern SDL_HIDAPI_DeviceDriver SDL_HIDAPI_DriverXbox360;
extern SDL_HIDAPI_DeviceDriver SDL_HIDAPI_DriverXbox360W; extern SDL_HIDAPI_DeviceDriver SDL_HIDAPI_DriverXbox360W;
extern SDL_HIDAPI_DeviceDriver SDL_HIDAPI_DriverXboxOne; extern SDL_HIDAPI_DeviceDriver SDL_HIDAPI_DriverXboxOne;
extern SDL_HIDAPI_DeviceDriver SDL_HIDAPI_DriverGameCube;
/* Return true if a HID device is present and supported as a joystick */ /* Return true if a HID device is present and supported as a joystick */
extern SDL_bool HIDAPI_IsDevicePresent(Uint16 vendor_id, Uint16 product_id, Uint16 version, const char *name); extern SDL_bool HIDAPI_IsDevicePresent(Uint16 vendor_id, Uint16 product_id, Uint16 version, const char *name);
extern void HIDAPI_UpdateDevices(void);
extern SDL_bool HIDAPI_JoystickConnected(SDL_HIDAPI_Device *device, SDL_JoystickID *pJoystickID); extern SDL_bool HIDAPI_JoystickConnected(SDL_HIDAPI_Device *device, SDL_JoystickID *pJoystickID);
extern void HIDAPI_JoystickDisconnected(SDL_HIDAPI_Device *device, SDL_JoystickID joystickID); extern void HIDAPI_JoystickDisconnected(SDL_HIDAPI_Device *device, SDL_JoystickID joystickID);