From d1d2dad2cb3cc5bbfb6cc684e70af76acaca9018 Mon Sep 17 00:00:00 2001 From: zoltanvb Date: Sun, 2 Jun 2024 21:28:16 +0200 Subject: [PATCH] Refinement and cleanup --- input/drivers_joypad/test_joypad.c | 4 +- tasks/task_autodetect.c | 98 +++++++++++++++++++----------- 2 files changed, 63 insertions(+), 39 deletions(-) diff --git a/input/drivers_joypad/test_joypad.c b/input/drivers_joypad/test_joypad.c index 08bceda0b4f7..ac9a87a9f4c4 100644 --- a/input/drivers_joypad/test_joypad.c +++ b/input/drivers_joypad/test_joypad.c @@ -72,8 +72,8 @@ typedef struct static input_test_step_t input_test_steps[MAX_TEST_STEPS]; -static unsigned current_frame = 0; -static unsigned next_teststep_frame = 0; +static uint32_t current_frame = 0; +static uint32_t next_teststep_frame = 0; static unsigned current_test_step = 0; static unsigned last_test_step = MAX_TEST_STEPS + 1; static uint32_t input_state_validated = 0; diff --git a/tasks/task_autodetect.c b/tasks/task_autodetect.c index f987fadd808e..44f396bacd34 100644 --- a/tasks/task_autodetect.c +++ b/tasks/task_autodetect.c @@ -354,12 +354,18 @@ static bool input_autoconfigure_scan_config_files_internal( return false; } -/* Reallocate the automatically assigned player <-> port mapping if needed. +/* Reallocate the automatically assigned player <-> port mapping if needed. * Objectives: - * - if there is no reservation, do not change anything - * - if detected port is reserved for something else (reserved mode), change it to first free player * - if there is reservation for the device, assign it to the reserved player -*/ + * - when assigning a new device to a reserved port, move the previous entry + * to first free slot if it was occupied + * - use first free player port by default for new entries (overriding saved + * input_joypad_index, as it can + * get quite messy if reservations are done, due to the swaps above) + * - do not consider "reserved" ports free + * - if there is no reservation, do not change anything + * (not even the assignment to first free player port) + */ static void reallocate_port_if_needed(unsigned detected_port, int vendor_id, int product_id, const char *device_name) { @@ -369,6 +375,7 @@ static void reallocate_port_if_needed(unsigned detected_port, int vendor_id, unsigned first_free_player_slot = MAX_USERS + 1; unsigned prev_assigned_player_slots[MAX_USERS]; bool device_has_reserved_slot = false; + bool no_reservation_at_all = true; char settings_value[256] = {0}; int settings_value_vendor_id; int settings_value_product_id; @@ -377,41 +384,56 @@ static void reallocate_port_if_needed(unsigned detected_port, int vendor_id, for (player = 0; player < MAX_USERS; player++) { if (first_free_player_slot > settings->uints.input_max_users && - (detected_port == settings->uints.input_joypad_index[player] || !input_config_get_device_name(settings->uints.input_joypad_index[player])) && + ( detected_port == settings->uints.input_joypad_index[player] || + !input_config_get_device_name(settings->uints.input_joypad_index[player])) && settings->uints.input_device_reservation_type[player] != INPUT_DEVICE_RESERVATION_RESERVED ) { first_free_player_slot = player; - RARCH_DBG("[Autoconf]: First unconfigured / unreserved player is %d\n", player+1); + RARCH_DBG("[Autoconf]: First unconfigured / unreserved player is %d\n", + player+1); } prev_assigned_player_slots[settings->uints.input_joypad_index[player]] = player; + if (settings->uints.input_device_reservation_type[player] != INPUT_DEVICE_RESERVATION_NONE) + no_reservation_at_all = false; } if (first_free_player_slot > settings->uints.input_max_users) { - RARCH_ERR( "[Autoconf]: No free and unreserved player slots found for adding new device \"%s\"! Detected port %d, max_users: %d, first free slot %d\n", - device_name, detected_port, settings->uints.input_max_users, first_free_player_slot+1); - RARCH_WARN("[Autoconf]: Leaving detected player slot in place: %d\n", prev_assigned_player_slots[detected_port]); + RARCH_ERR( "[Autoconf]: No free and unreserved player slots found for adding new device" + " \"%s\"! Detected port %d, max_users: %d, first free slot %d\n", + device_name, detected_port, + settings->uints.input_max_users, + first_free_player_slot+1); + RARCH_WARN("[Autoconf]: Leaving detected player slot in place: %d\n", + prev_assigned_player_slots[detected_port]); return; } for (player = 0; player < MAX_USERS; player++) { if (settings->uints.input_device_reservation_type[player] != INPUT_DEVICE_RESERVATION_NONE) - strlcpy(settings_value, settings->arrays.input_reserved_devices[player], sizeof(settings_value)); + strlcpy(settings_value, settings->arrays.input_reserved_devices[player], + sizeof(settings_value)); else settings_value[0] = '\0'; if (!string_is_empty(settings_value)) { - RARCH_DBG("[Autoconf]: Examining reserved device for player %d type %d: %s against %04x:%04x\n", - player+1, settings->uints.input_device_reservation_type[player], - settings_value, vendor_id, product_id); + RARCH_DBG("[Autoconf]: Examining reserved device for player %d " + "type %d: %s against %04x:%04x\n", + player+1, + settings->uints.input_device_reservation_type[player], + settings_value, vendor_id, product_id); - if (sscanf(settings_value, "%04x:%04x ", &settings_value_vendor_id, &settings_value_product_id) != 2) + if (sscanf(settings_value, "%04x:%04x ", + &settings_value_vendor_id, + &settings_value_product_id) != 2) { - strlcpy(settings_value_device_name, settings_value, sizeof(settings_value_device_name)); + strlcpy(settings_value_device_name, settings_value, + sizeof(settings_value_device_name)); device_has_reserved_slot = string_is_equal(device_name, settings_value_device_name); } else - device_has_reserved_slot = (vendor_id == settings_value_vendor_id && product_id == settings_value_product_id); + device_has_reserved_slot = (vendor_id == settings_value_vendor_id && + product_id == settings_value_product_id); if (device_has_reserved_slot) { @@ -426,44 +448,45 @@ static void reallocate_port_if_needed(unsigned detected_port, int vendor_id, unsigned prev_assigned_port = settings->uints.input_joypad_index[player]; if(detected_port != prev_assigned_port) { - RARCH_LOG("[Autoconf]: Device \"%s\" (%x:%x) is reserved for player %d, updating.\n", + RARCH_LOG("[Autoconf]: Device \"%s\" (%x:%x) is reserved " + "for player %d, updating.\n", device_name, vendor_id, product_id, player+1); // todo: fix the pushed info message settings->uints.input_joypad_index[player] = detected_port; - /*if ((settings->uints.input_device_reservation_type[player] == INPUT_DEVICE_RESERVATION_PREFERRED) && - input_config_get_device_name(prev_assigned_port))*/ + RARCH_LOG("[Autoconf]: Preferred slot was taken earlier by " + "\"%s\", reassigning that to %d\n", + input_config_get_device_name(prev_assigned_port), + prev_assigned_player_slots[detected_port]+1); + settings->uints.input_joypad_index[prev_assigned_player_slots[detected_port]] = prev_assigned_port; + if (input_config_get_device_name(prev_assigned_port)) { - RARCH_LOG("[Autoconf]: Preferred slot was taken earlier by \"%s\", reassigning that to %d\n", - input_config_get_device_name(prev_assigned_port), prev_assigned_player_slots[detected_port]+1); - settings->uints.input_joypad_index[prev_assigned_player_slots[detected_port]] = prev_assigned_port; - if (input_config_get_device_name(prev_assigned_port)) - { - unsigned prev_assigned_port_l2 = settings->uints.input_joypad_index[first_free_player_slot]; - - RARCH_LOG("[Autoconf]: 2nd level reassignment, moving previously assigned port %d to first free player %d\n", - prev_assigned_port_l2, first_free_player_slot+1); - settings->uints.input_joypad_index[prev_assigned_player_slots[detected_port]] = prev_assigned_port_l2; - settings->uints.input_joypad_index[first_free_player_slot] = prev_assigned_port; - - } + unsigned prev_assigned_port_l2 = settings->uints.input_joypad_index[first_free_player_slot]; + RARCH_LOG("[Autoconf]: 2nd level reassignment, moving " + "previously assigned port %d to first free player %d\n", + prev_assigned_port_l2, first_free_player_slot+1); + settings->uints.input_joypad_index[prev_assigned_player_slots[detected_port]] = prev_assigned_port_l2; + settings->uints.input_joypad_index[first_free_player_slot] = prev_assigned_port; } - } else { - RARCH_DBG("[Autoconf]: Device \"%s\" (%x:%x) is reserved for player %d, same as default assignment.\n", + RARCH_DBG("[Autoconf]: Device \"%s\" (%x:%x) is reserved for " + "player %d, same as default assignment.\n", device_name, vendor_id, product_id, player+1); } return; } else { - RARCH_DBG("[Autoconf]: Device \"%s\" (%d:%d) is not reserved for any player slot.\n", + RARCH_DBG("[Autoconf]: Device \"%s\" (%d:%d) is not reserved for " + "any player slot.\n", device_name, vendor_id, product_id); - if (prev_assigned_player_slots[detected_port] == first_free_player_slot) + /* Fallback in case no reservation is set up at all - to preserve any previous setup where input_joypad_index may have been customized. */ + if (no_reservation_at_all || + prev_assigned_player_slots[detected_port] == first_free_player_slot) { return; } @@ -472,7 +495,8 @@ static void reallocate_port_if_needed(unsigned detected_port, int vendor_id, unsigned prev_assigned_port = settings->uints.input_joypad_index[first_free_player_slot]; settings->uints.input_joypad_index[first_free_player_slot] = detected_port; settings->uints.input_joypad_index[prev_assigned_player_slots[detected_port]] = prev_assigned_port; - RARCH_DBG("[Autoconf]: Earlier free player slot found, reassigning to player %d.\n", + RARCH_DBG("[Autoconf]: Earlier free player slot found, " + "reassigning to player %d.\n", first_free_player_slot+1); } }