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:
gblues 2018-04-14 21:30:44 -07:00
parent 6ab91a422e
commit 4cd301bd92
6 changed files with 26 additions and 35 deletions

View File

@ -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)

View File

@ -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)

View File

@ -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);
}
}
/**

View File

@ -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) {

View File

@ -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)

View File

@ -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);