Fix a couple regressions (#13101)

== DETAILS

- rewrote the HID deregistration algorithm; it should no longer
  cause issues when dealing with multiple pads of the same HID/VID
  combo
- fix initialization bug that caused wiimotes to fail to register
  without an accessory attached
This commit is contained in:
gblues 2021-10-11 00:39:13 -07:00 committed by GitHub
parent a9125fffaa
commit dd6c70a083
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 40 additions and 37 deletions

View File

@ -172,47 +172,15 @@ joypad_connection_entry_t *find_connection_entry(int16_t vid, int16_t pid, const
return NULL;
}
void pad_connection_pad_deregister(joypad_connection_t *joyconn,
pad_connection_interface_t *iface, void *pad_data)
{
int i;
#if 0
RARCH_LOG("pad_connection_pad_deregister\n");
RARCH_LOG("joyconn: 0x%08lx iface: 0x%08lx pad_data: 0x%08lx\n", (unsigned long)joyconn, (unsigned long)iface, (unsigned long)pad_data);
#endif
for(i = 0; !joypad_is_end_of_list(&joyconn[i]); i++)
{
if(joyconn[i].connected && joyconn[i].iface == iface
&& iface)
{
if(iface->set_rumble)
{
iface->set_rumble(joyconn[i].connection,
RETRO_RUMBLE_STRONG, 0);
iface->set_rumble(joyconn[i].connection,
RETRO_RUMBLE_WEAK, 0);
}
input_autoconfigure_disconnect(i,
iface->get_name(joyconn[i].connection));
if(iface->multi_pad)
{
RARCH_LOG("multi-pad cleanup");
iface->pad_deinit(&joyconn[i].connection);
}
memset(&joyconn[i], 0, sizeof(joypad_connection_t));
}
}
}
static int joypad_to_slot(joypad_connection_t *haystack,
joypad_connection_t *needle)
{
int i;
if(needle == NULL) {
return -1;
}
for(i = 0; !joypad_is_end_of_list(&haystack[i]); i++)
{
if(&haystack[i] == needle)
@ -221,6 +189,40 @@ static int joypad_to_slot(joypad_connection_t *haystack,
return -1;
}
void legacy_pad_connection_pad_deregister(joypad_connection_t *pad_list, pad_connection_interface_t *iface, void *pad_data) {
int i;
for(i = 0; !joypad_is_end_of_list(&pad_list[i]); i++)
{
if(pad_list[i].connection == pad_data) {
input_autoconfigure_disconnect(i, iface->get_name(pad_data));
return;
}
}
}
void pad_connection_pad_deregister(joypad_connection_t *joyconn,
pad_connection_interface_t *iface, void *pad_data)
{
int i;
int slot;
joypad_connection_t *pad;
if(!iface->multi_pad) {
legacy_pad_connection_pad_deregister(joyconn, iface, pad_data);
return;
}
for(i = 0; i < iface->max_pad; i++) {
slot = joypad_to_slot(joyconn, iface->joypad(pad_data, i));
if(slot >= 0) {
input_autoconfigure_disconnect(slot, iface->get_name(joyconn[slot].connection));
iface->pad_deinit(joyconn[slot].connection);
}
}
}
void pad_connection_pad_refresh(joypad_connection_t *joyconn,
pad_connection_interface_t *iface,
void *device_data, void *handle,

View File

@ -733,7 +733,7 @@ static void wiiu_poll_adapters(wiiu_hid_t *hid)
wiiu_poll_adapter(it);
if (it->state == ADAPTER_STATE_DONE) {
RARCH_LOG("poll_adapters: read done, ready for garbage collection");
it->state = ADAPTER_STATE_GC;
}
}

View File

@ -58,6 +58,7 @@ static void *kpad_init(void *data)
for(int i = 0; i < WIIU_WIIMOTE_CHANNELS; i++) {
joypad_state.kpad.channel_slot_map[i] = -1;
joypad_state.kpad.wiimotes[i].type = WIIMOTE_TYPE_NONE;
}
kpad_poll();