diff --git a/input/connect/joypad_connection.c b/input/connect/joypad_connection.c index 0d8fd086ff..dd916eb4e2 100644 --- a/input/connect/joypad_connection.c +++ b/input/connect/joypad_connection.c @@ -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, diff --git a/input/drivers_hid/wiiu_hid.c b/input/drivers_hid/wiiu_hid.c index 3efc2ac0c6..844cbef651 100644 --- a/input/drivers_hid/wiiu_hid.c +++ b/input/drivers_hid/wiiu_hid.c @@ -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; } } diff --git a/input/drivers_joypad/wiiu/kpad_driver.c b/input/drivers_joypad/wiiu/kpad_driver.c index a7fd8c02c7..96aca4a233 100644 --- a/input/drivers_joypad/wiiu/kpad_driver.c +++ b/input/drivers_joypad/wiiu/kpad_driver.c @@ -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();