mirror of
https://github.com/libretro/RetroArch.git
synced 2025-02-24 03:42:31 +00:00
Add pad unregistration
== DETAILS I think this will fix the problem with duplicate pads--pads weren't properly de-initializing and registering as disconnected. When a pad is disconnected, the slot should properly release now.
This commit is contained in:
parent
6ab91a422e
commit
4cd301bd92
@ -192,8 +192,10 @@ static void ds3_free(void *data)
|
||||
{
|
||||
ds3_instance_t *instance = (ds3_instance_t *)data;
|
||||
|
||||
if(instance)
|
||||
if(instance) {
|
||||
hid_pad_deregister(instance->pad);
|
||||
free(instance);
|
||||
}
|
||||
}
|
||||
|
||||
static void ds3_handle_packet(void *data, uint8_t *packet, size_t size)
|
||||
|
@ -63,8 +63,10 @@ static void ds4_free(void *data)
|
||||
{
|
||||
ds4_instance_t *instance = (ds4_instance_t *)data;
|
||||
|
||||
if(instance)
|
||||
if(instance) {
|
||||
hid_pad_deregister(instance->pad);
|
||||
free(instance);
|
||||
}
|
||||
}
|
||||
|
||||
static void ds4_handle_packet(void *data, uint8_t *buffer, size_t size)
|
||||
|
@ -79,8 +79,10 @@ static void null_free(void *data)
|
||||
{
|
||||
null_instance_t *instance = (null_instance_t *)data;
|
||||
|
||||
if(instance)
|
||||
if(instance) {
|
||||
hid_pad_deregister(instance->pad);
|
||||
free(instance);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -145,34 +145,6 @@ static void update_pad_state(wiiu_gca_instance_t *instance)
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
static joypad_connection_t *register_pad(wiiu_gca_instance_t *instance, int port) {
|
||||
int slot;
|
||||
joypad_connection_t *result;
|
||||
|
||||
if(!instance || !instance->online)
|
||||
{
|
||||
RARCH_ERR("[gca]: bad instance\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
slot = pad_connection_find_vacant_pad(hid_instance.pad_list);
|
||||
if(slot < 0)
|
||||
{
|
||||
RARCH_ERR("[gca]: failed to find a free slot\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
result = &(hid_instance.pad_list[slot]);
|
||||
result->iface = &wiiu_gca_pad_connection;
|
||||
result->data = result->iface->init(instance, slot, hid_instance.os_driver);
|
||||
result->connected = true;
|
||||
input_pad_connect(slot, hid_instance.pad_driver);
|
||||
|
||||
return result;
|
||||
}
|
||||
*/
|
||||
|
||||
static void unregister_pad(wiiu_gca_instance_t *instance, int slot)
|
||||
{
|
||||
if(!instance || slot < 0 || slot >= 4 || instance->pads[slot] == NULL)
|
||||
@ -180,10 +152,8 @@ static void unregister_pad(wiiu_gca_instance_t *instance, int slot)
|
||||
|
||||
joypad_connection_t *pad = instance->pads[slot];
|
||||
instance->pads[slot] = NULL;
|
||||
pad->iface->deinit(pad->data);
|
||||
pad->data = NULL;
|
||||
pad->iface = NULL;
|
||||
pad->connected = false;
|
||||
|
||||
hid_pad_deregister(pad);
|
||||
}
|
||||
|
||||
static bool wiiu_gca_detect(uint16_t vendor_id, uint16_t product_id) {
|
||||
|
@ -60,6 +60,20 @@ joypad_connection_t *hid_pad_register(void *pad_handle, pad_connection_interface
|
||||
return result;
|
||||
}
|
||||
|
||||
void hid_pad_deregister(joypad_connection_t *pad)
|
||||
{
|
||||
if(!pad)
|
||||
return;
|
||||
|
||||
if(pad->data) {
|
||||
pad->iface->deinit(pad->data);
|
||||
pad->data = NULL;
|
||||
}
|
||||
|
||||
pad->iface = NULL;
|
||||
pad->connected = false;
|
||||
}
|
||||
|
||||
static bool init_pad_list(hid_driver_instance_t *instance, unsigned slots)
|
||||
{
|
||||
if(!instance || slots > MAX_USERS)
|
||||
|
@ -37,6 +37,7 @@ extern hid_driver_instance_t hid_instance;
|
||||
|
||||
hid_device_t *hid_device_driver_lookup(uint16_t vendor_id, uint16_t product_id);
|
||||
joypad_connection_t *hid_pad_register(void *pad_handle, pad_connection_interface_t *iface);
|
||||
void hid_pad_deregister(joypad_connection_t *pad);
|
||||
bool hid_init(hid_driver_instance_t *instance, hid_driver_t *hid_driver, input_device_driver_t *pad_driver, unsigned slots);
|
||||
void hid_deinit(hid_driver_instance_t *instance);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user