From 311312335dca8b82913397418ca5c8aa8a677081 Mon Sep 17 00:00:00 2001 From: negativeExponent Date: Mon, 2 Nov 2020 20:49:24 +0800 Subject: Move input type selection to RETRO_ENVIRONMENT_SET_CONTROLLER_INFO --- frontend/libretro.c | 80 ++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 73 insertions(+), 7 deletions(-) (limited to 'frontend') diff --git a/frontend/libretro.c b/frontend/libretro.c index 6416b67..62c4fbf 100644 --- a/frontend/libretro.c +++ b/frontend/libretro.c @@ -516,6 +516,41 @@ void out_register_libretro(struct out_driver *drv) drv->feed = snd_feed; } +#define RETRO_DEVICE_PSE_STANDARD RETRO_DEVICE_SUBCLASS(RETRO_DEVICE_JOYPAD, 0) +#define RETRO_DEVICE_PSE_ANALOG RETRO_DEVICE_SUBCLASS(RETRO_DEVICE_ANALOG, 0) +#define RETRO_DEVICE_PSE_DUALSHOCK RETRO_DEVICE_SUBCLASS(RETRO_DEVICE_ANALOG, 1) +#define RETRO_DEVICE_PSE_NEGCON RETRO_DEVICE_SUBCLASS(RETRO_DEVICE_ANALOG, 2) +#define RETRO_DEVICE_PSE_GUNCON RETRO_DEVICE_SUBCLASS(RETRO_DEVICE_LIGHTGUN, 0) +#define RETRO_DEVICE_PSE_MOUSE RETRO_DEVICE_SUBCLASS(RETRO_DEVICE_MOUSE, 0) + +static char *get_pse_pad_label[] = { + "none", "mouse", "negcon", "konami gun", "standard", "analog", "guncon", "dualshock" +}; + +static const struct retro_controller_description pads[7] = +{ + { "standard", RETRO_DEVICE_JOYPAD }, + { "analog", RETRO_DEVICE_PSE_ANALOG }, + { "dualshock", RETRO_DEVICE_PSE_DUALSHOCK }, + { "negcon", RETRO_DEVICE_PSE_NEGCON }, + { "guncon", RETRO_DEVICE_PSE_GUNCON }, + { "mouse", RETRO_DEVICE_PSE_MOUSE }, + { NULL, 0 }, +}; + +static const struct retro_controller_info ports[9] = +{ + { pads, 7 }, + { pads, 7 }, + { pads, 7 }, + { pads, 7 }, + { pads, 7 }, + { pads, 7 }, + { pads, 7 }, + { pads, 7 }, + { NULL, 0 }, +}; + /* libretro */ void retro_set_environment(retro_environment_t cb) { @@ -524,6 +559,7 @@ void retro_set_environment(retro_environment_t cb) if (cb(RETRO_ENVIRONMENT_GET_LOG_INTERFACE, &logging)) log_cb = logging.log; + environ_cb(RETRO_ENVIRONMENT_SET_CONTROLLER_INFO, (void*)ports); libretro_set_core_options(environ_cb); } @@ -638,7 +674,7 @@ static void update_controller_port_device(unsigned port, unsigned device) } } -static void update_multitap() +static void update_multitap(void) { struct retro_variable var; int auto_case, port; @@ -692,13 +728,37 @@ static void update_multitap() void retro_set_controller_port_device(unsigned port, unsigned device) { - SysPrintf("port %u device %u", port, device); - if (port >= PORTS_NUMBER) return; - update_controller_port_device(port, device); - update_multitap(); + switch (device) + { + case RETRO_DEVICE_JOYPAD: + case RETRO_DEVICE_PSE_STANDARD: + in_type[port] = PSE_PAD_TYPE_STANDARD; + break; + case RETRO_DEVICE_PSE_ANALOG: + in_type[port] = PSE_PAD_TYPE_ANALOGJOY; + break; + case RETRO_DEVICE_PSE_DUALSHOCK: + in_type[port] = PSE_PAD_TYPE_ANALOGPAD; + break; + case RETRO_DEVICE_PSE_MOUSE: + in_type[port] = PSE_PAD_TYPE_MOUSE; + break; + case RETRO_DEVICE_PSE_NEGCON: + in_type[port] = PSE_PAD_TYPE_NEGCON; + break; + case RETRO_DEVICE_PSE_GUNCON: + in_type[port] = PSE_PAD_TYPE_GUNCON; + break; + case RETRO_DEVICE_NONE: + default: + in_type[port] = PSE_PAD_TYPE_NONE; + break; + } + + SysPrintf("port: %u device: %s\n", port + 1, get_pse_pad_label[in_type[port]]); } void retro_get_system_info(struct retro_system_info *info) @@ -1548,8 +1608,8 @@ static void update_variables(bool in_flight) Config.PsxType = 1; } - for (i = 0; i < PORTS_NUMBER; i++) - update_controller_port_variable(i); + /*for (i = 0; i < PORTS_NUMBER; i++) + update_controller_port_variable(i);*/ update_multitap(); @@ -2221,6 +2281,12 @@ static void update_variables(bool in_flight) } } } + + for (i = 0; i < 8; i++) { + SysPrintf("[DEBUG] Player %d: %s\n", i + 1, get_pse_pad_label[in_type[i]]); + } + SysPrintf("Multiplayer 1: %s\n", multitap1 ? "enabled" : "disabled"); + SysPrintf("Multiplayer 2: %s\n", multitap2 ? "enabled" : "disabled"); } // Taken from beetle-psx-libretro -- cgit v1.2.3 From 82df580d6a00527fd55898b21a0d8e82b951620b Mon Sep 17 00:00:00 2001 From: negativeExponent Date: Tue, 3 Nov 2020 22:24:00 +0800 Subject: Indicate that multitap requires restart and cleanup Multi-tap related feature like enabling/changing controllers type on port 4-8 and changing multitap option requires a restart. Port 1 and 2 (player 1-2) are mostly safe to change options anytime --- frontend/libretro.c | 130 +++++----------------------------- frontend/libretro_core_options.h | 129 +-------------------------------- frontend/libretro_core_options_intl.h | 125 -------------------------------- 3 files changed, 19 insertions(+), 365 deletions(-) (limited to 'frontend') diff --git a/frontend/libretro.c b/frontend/libretro.c index 62c4fbf..e18b190 100644 --- a/frontend/libretro.c +++ b/frontend/libretro.c @@ -117,6 +117,7 @@ int in_mouse[8][2]; int multitap1 = 0; int multitap2 = 0; int in_enable_vibration = 1; +static int input_changed = 0; // NegCon adjustment parameters // > The NegCon 'twist' action is somewhat awkward when mapped @@ -574,106 +575,6 @@ unsigned retro_api_version(void) return RETRO_API_VERSION; } -static int controller_port_variable(unsigned port, struct retro_variable *var) -{ - if (port >= PORTS_NUMBER) - return 0; - - if (!environ_cb) - return 0; - - var->value = NULL; - switch (port) - { - case 0: - var->key = "pcsx_rearmed_pad1type"; - break; - case 1: - var->key = "pcsx_rearmed_pad2type"; - break; - case 2: - var->key = "pcsx_rearmed_pad3type"; - break; - case 3: - var->key = "pcsx_rearmed_pad4type"; - break; - case 4: - var->key = "pcsx_rearmed_pad5type"; - break; - case 5: - var->key = "pcsx_rearmed_pad6type"; - break; - case 6: - var->key = "pcsx_rearmed_pad7type"; - break; - case 7: - var->key = "pcsx_rearmed_pad8type"; - break; - } - - return environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, var) && var->value; -} - -static void update_controller_port_variable(unsigned port) -{ - if (port >= PORTS_NUMBER) - return; - - struct retro_variable var; - - if (controller_port_variable(port, &var)) - { - if (strcmp(var.value, "standard") == 0) - in_type[port] = PSE_PAD_TYPE_STANDARD; - else if (strcmp(var.value, "analog") == 0) - in_type[port] = PSE_PAD_TYPE_ANALOGJOY; - else if (strcmp(var.value, "dualshock") == 0) - in_type[port] = PSE_PAD_TYPE_ANALOGPAD; - else if (strcmp(var.value, "negcon") == 0) - in_type[port] = PSE_PAD_TYPE_NEGCON; - else if (strcmp(var.value, "guncon") == 0) - in_type[port] = PSE_PAD_TYPE_GUNCON; - else if (strcmp(var.value, "mouse") == 0) - in_type[port] = PSE_PAD_TYPE_MOUSE; - else if (strcmp(var.value, "none") == 0) - in_type[port] = PSE_PAD_TYPE_NONE; - // else 'default' case, do nothing - } -} - -static void update_controller_port_device(unsigned port, unsigned device) -{ - if (port >= PORTS_NUMBER) - return; - - struct retro_variable var; - - if (!controller_port_variable(port, &var)) - return; - - if (strcmp(var.value, "default") != 0) - return; - - switch (device) - { - case RETRO_DEVICE_JOYPAD: - in_type[port] = PSE_PAD_TYPE_STANDARD; - break; - case RETRO_DEVICE_ANALOG: - in_type[port] = PSE_PAD_TYPE_ANALOGPAD; - break; - case RETRO_DEVICE_MOUSE: - in_type[port] = PSE_PAD_TYPE_MOUSE; - break; - case RETRO_DEVICE_LIGHTGUN: - in_type[port] = PSE_PAD_TYPE_GUN; - break; - case RETRO_DEVICE_NONE: - default: - in_type[port] = PSE_PAD_TYPE_NONE; - } -} - static void update_multitap(void) { struct retro_variable var; @@ -1519,6 +1420,8 @@ bool retro_load_game(const struct retro_game_info *info) set_retro_memmap(); + input_changed = 1; + return true; } @@ -1585,7 +1488,6 @@ static float GunconAdjustRatioY = 1; static void update_variables(bool in_flight) { struct retro_variable var; - int i; #ifdef GPU_PEOPS int gpu_peops_fix = 0; #endif @@ -2221,12 +2123,6 @@ static void update_variables(bool in_flight) char gpu_peops_option[][50] = { "pcsx_rearmed_multitap1", "pcsx_rearmed_multitap2", - "pcsx_rearmed_pad3type", - "pcsx_rearmed_pad4type", - "pcsx_rearmed_pad5type", - "pcsx_rearmed_pad6type", - "pcsx_rearmed_pad7type", - "pcsx_rearmed_pad8type", "pcsx_rearmed_negcon_deadzone", "pcsx_rearmed_negcon_response", "pcsx_rearmed_analog_axis_modifier", @@ -2281,12 +2177,6 @@ static void update_variables(bool in_flight) } } } - - for (i = 0; i < 8; i++) { - SysPrintf("[DEBUG] Player %d: %s\n", i + 1, get_pse_pad_label[in_type[i]]); - } - SysPrintf("Multiplayer 1: %s\n", multitap1 ? "enabled" : "disabled"); - SysPrintf("Multiplayer 2: %s\n", multitap2 ? "enabled" : "disabled"); } // Taken from beetle-psx-libretro @@ -2621,6 +2511,19 @@ static void print_internal_fps(void) void retro_run(void) { + /* update multitap when inputs have changed */ + /* this is only applied on core restart */ + if (input_changed) + { + int i; + input_changed = 0; + update_multitap(); + for (i = 0; i < 8; i++) + SysDLog("Player %d: %s\n", i + 1, get_pse_pad_label[in_type[i]]); + SysDLog("Multiplayer 1: %s\n", multitap1 ? "enabled" : "disabled"); + SysDLog("Multiplayer 2: %s\n", multitap2 ? "enabled" : "disabled"); + } + //SysReset must be run while core is running,Not in menu (Locks up Retroarch) if (rebootemu != 0) { @@ -2631,6 +2534,7 @@ void retro_run(void) // skip BIOS logos psxRegs.pc = psxRegs.GPR.n.ra; } + return; } print_internal_fps(); diff --git a/frontend/libretro_core_options.h b/frontend/libretro_core_options.h index c28de2a..3f589cc 100644 --- a/frontend/libretro_core_options.h +++ b/frontend/libretro_core_options.h @@ -156,134 +156,9 @@ struct retro_core_option_definition option_defs_us[] = { }, "1.00", }, - { - "pcsx_rearmed_pad1type", - "Pad 1 Type", - "Pad type for player 1", - { - { "standard", NULL }, - { "analog", NULL }, - { "dualshock", NULL }, - { "negcon", NULL }, - { "guncon", NULL }, - { "mouse", NULL }, - { "none", NULL }, - { NULL, NULL }, - }, - "standard", - }, - { - "pcsx_rearmed_pad2type", - "Pad 2 Type", - "Pad type for player 2", - { - { "standard", NULL }, - { "analog", NULL }, - { "dualshock", NULL }, - { "negcon", NULL }, - { "guncon", NULL }, - { "mouse", NULL }, - { "none", NULL }, - { NULL, NULL }, - }, - "standard", - }, - { - "pcsx_rearmed_pad3type", - "Pad 3 Type", - "Pad type for player 3", - { - { "standard", NULL }, - { "analog", NULL }, - { "dualshock", NULL }, - { "negcon", NULL }, - { "guncon", NULL }, - { "mouse", NULL }, - { "none", NULL }, - { NULL, NULL }, - }, - "none", - }, - { - "pcsx_rearmed_pad4type", - "Pad 4 Type", - "Pad type for player 4", - { - { "standard", NULL }, - { "analog", NULL }, - { "dualshock", NULL }, - { "negcon", NULL }, - { "guncon", NULL }, - { "mouse", NULL }, - { "none", NULL }, - { NULL, NULL }, - }, - "none", - }, - { - "pcsx_rearmed_pad5type", - "Pad 5 Type", - "Pad type for player 5", - { - { "standard", NULL }, - { "analog", NULL }, - { "dualshock", NULL }, - { "negcon", NULL }, - { "guncon", NULL }, - { "mouse", NULL }, - { "none", NULL }, - { NULL, NULL }, - }, - "none", - },{ - "pcsx_rearmed_pad6type", - "Pad 6 Type", - "Pad type for player 6", - { - { "standard", NULL }, - { "analog", NULL }, - { "dualshock", NULL }, - { "negcon", NULL }, - { "guncon", NULL }, - { "mouse", NULL }, - { "none", NULL }, - { NULL, NULL }, - }, - "none", - },{ - "pcsx_rearmed_pad7type", - "Pad 7 Type", - "Pad type for player 7", - { - { "standard", NULL }, - { "analog", NULL }, - { "dualshock", NULL }, - { "negcon", NULL }, - { "guncon", NULL }, - { "mouse", NULL }, - { "none", NULL }, - { NULL, NULL }, - }, - "none", - },{ - "pcsx_rearmed_pad8type", - "Pad 8 Type", - "Pad type for player 8", - { - { "standard", NULL }, - { "analog", NULL }, - { "dualshock", NULL }, - { "negcon", NULL }, - { "guncon", NULL }, - { "mouse", NULL }, - { "none", NULL }, - { NULL, NULL }, - }, - "none", - }, { "pcsx_rearmed_multitap1", - "Multitap 1", + "Multitap 1 (Restart)", "Enables/Disables multitap on port 1, allowing upto 5 players in games that permit it.", { { "auto", NULL }, @@ -295,7 +170,7 @@ struct retro_core_option_definition option_defs_us[] = { }, { "pcsx_rearmed_multitap2", - "Multitap 2", + "Multitap 2 (Restart)", "Enables/Disables multitap on port 2, allowing up to 8 players in games that permit it. Multitap 1 has to be enabled for this to work.", { { "auto", NULL }, diff --git a/frontend/libretro_core_options_intl.h b/frontend/libretro_core_options_intl.h index 1e7fd79..1601ec4 100644 --- a/frontend/libretro_core_options_intl.h +++ b/frontend/libretro_core_options_intl.h @@ -115,131 +115,6 @@ struct retro_core_option_definition option_defs_tr[] = { }, NULL }, - { - "pcsx_rearmed_pad1type", - "Kumanda 1 Tipi", - "1. Oyuncu için kontrolör tipi", - { - { "standard", NULL }, - { "analog", NULL }, - { "dualshock", NULL }, - { "negcon", NULL }, - { "guncon", NULL }, - { "mouse", NULL }, - { "none", "hiçbiri" }, - { NULL, NULL }, - }, - "standard", - }, - { - "pcsx_rearmed_pad2type", - "Kumanda 2 Tipi", - "2. Oyuncu için kontrolör tipi", - { - { "standard", NULL }, - { "analog", NULL }, - { "dualshock", NULL }, - { "negcon", NULL }, - { "guncon", NULL }, - { "mouse", NULL }, - { "none", "hiçbiri" }, - { NULL, NULL }, - }, - "standard", - }, - { - "pcsx_rearmed_pad3type", - "Kumanda 3 Tipi", - "3. Oyuncu için kontrolör tipi", - { - { "standard", NULL }, - { "analog", NULL }, - { "dualshock", NULL }, - { "negcon", NULL }, - { "guncon", NULL }, - { "mouse", NULL }, - { "none", "hiçbiri" }, - { NULL, NULL }, - }, - "none", - }, - { - "pcsx_rearmed_pad4type", - "Kumanda 4 Tipi", - "4. Oyuncu için kontrolör tipi", - { - { "standard", NULL }, - { "analog", NULL }, - { "dualshock", NULL }, - { "negcon", NULL }, - { "guncon", NULL }, - { "mouse", NULL }, - { "none", "hiçbiri" }, - { NULL, NULL }, - }, - "none", - }, - { - "pcsx_rearmed_pad5type", - "Kumanda 5 Tipi", - "5. Oyuncu için kontrolör tipi", - { - { "standard", NULL }, - { "analog", NULL }, - { "dualshock", NULL }, - { "negcon", NULL }, - { "guncon", NULL }, - { "mouse", NULL }, - { "none", "hiçbiri" }, - { NULL, NULL }, - }, - "none", - },{ - "pcsx_rearmed_pad6type", - "Kumanda 6 Tipi", - "6. Oyuncu için kontrolör tipi", - { - { "standard", NULL }, - { "analog", NULL }, - { "dualshock", NULL }, - { "negcon", NULL }, - { "guncon", NULL }, - { "mouse", NULL }, - { "none", "hiçbiri" }, - { NULL, NULL }, - }, - "none", - },{ - "pcsx_rearmed_pad7type", - "Kumanda 7 Tipi", - "7. Oyuncu için kontrolör tipi", - { - { "standard", NULL }, - { "analog", NULL }, - { "dualshock", NULL }, - { "negcon", NULL }, - { "guncon", NULL }, - { "mouse", NULL }, - { "none", "hiçbiri" }, - { NULL, NULL }, - }, - "none", - },{ - "pcsx_rearmed_pad8type", - "Kumanda 8 Tipi", - "8. Oyuncu için kontrolör tipi", - { - { "standard", NULL }, - { "analog", NULL }, - { "dualshock", NULL }, - { "negcon", NULL }, - { "guncon", NULL }, - { "mouse", NULL }, - { "none", "hiçbiri" }, - { NULL, NULL }, - }, - "none", - }, { "pcsx_rearmed_multitap1", "Multitap 1", -- cgit v1.2.3