From a4836bbb17e1e65c62d06a7fa6985968a773582f Mon Sep 17 00:00:00 2001 From: Autechre Date: Mon, 15 Mar 2021 01:32:56 +0100 Subject: [PATCH] Fix analog triggers (#12151) * Restore RETRO_DEVICE_ANALOG code while making less changes * * When input_remap_binds_enable is true, input_driver_mapper is always allocated and initialized - no need to NULL check * Get rid of input_remote local variable for network gamepad code --- retroarch.c | 92 ++++++++++++++++++++++++++++++----------------------- 1 file changed, 52 insertions(+), 40 deletions(-) diff --git a/retroarch.c b/retroarch.c index 55622769f9..718e47ad63 100644 --- a/retroarch.c +++ b/retroarch.c @@ -22876,65 +22876,77 @@ static int16_t input_state_device( case RETRO_DEVICE_ANALOG: { #if defined(HAVE_NETWORKGAMEPAD) || defined(HAVE_OVERLAY) -#if defined(HAVE_NETWORKGAMEPAD) - input_remote_state_t *input_state = &p_rarch->remote_st_ptr; -#endif - unsigned base = (idx == RETRO_DEVICE_INDEX_ANALOG_RIGHT) ? 2 : 0; - if (id == RETRO_DEVICE_ID_ANALOG_Y) - base += 1; #ifdef HAVE_NETWORKGAMEPAD - /* Don't process binds if input is coming from Remote RetroPad */ - if (p_rarch->input_driver_remote && input_state - && input_state->analog[base][port]) - res = input_state->analog[base][port]; + input_remote_state_t + *input_state = &p_rarch->remote_st_ptr; + +#endif + unsigned base = (idx == RETRO_DEVICE_INDEX_ANALOG_RIGHT) + ? 2 : 0; + if (id == RETRO_DEVICE_ID_ANALOG_Y) + base += 1; +#ifdef HAVE_NETWORKGAMEPAD + if (p_rarch->input_driver_remote + && input_state && input_state->analog[base][port]) + res = input_state->analog[base][port]; else #endif #endif { - if (input_remap_binds_enable) + if (id < RARCH_FIRST_META_KEY) { bool bind_valid = p_rarch->libretro_input_binds[port] && p_rarch->libretro_input_binds[port][id].valid; - if (id < RARCH_FIRST_META_KEY && bind_valid) - { - if (idx < 2 && id < 2) - { - unsigned offset = RARCH_FIRST_CUSTOM_BIND + - (idx * 4) + (id * 2); - if ( settings->uints.input_remap_ids - [port][offset] == offset - || settings->uints.input_remap_ids - [port][offset+1] == (offset+1) - ) + if (bind_valid) + { + /* reset_state - used to reset input state of a button + * when the gamepad mapper is in action for that button*/ + bool reset_state = false; + if (input_remap_binds_enable) + { + if (idx < 2 && id < 2) { - res = ret; -#ifdef HAVE_OVERLAY - if (port == 0) - { - input_overlay_state_t *ol_state = - &p_rarch->overlay_ptr->overlay_state; - if ( - p_rarch->overlay_ptr - && p_rarch->overlay_ptr->alive - && ol_state - && ol_state->analog[base]) - res |= ol_state->analog[base]; - } -#endif + unsigned offset = RARCH_FIRST_CUSTOM_BIND + + (idx * 4) + (id * 2); + + if (settings->uints.input_remap_ids + [port][offset] != offset) + reset_state = true; + else if (settings->uints.input_remap_ids + [port][offset+1] != (offset+1)) + reset_state = true; } } + + if (reset_state) + res = 0; + else + { + res = ret; + +#ifdef HAVE_OVERLAY + if ( p_rarch->overlay_ptr && + p_rarch->overlay_ptr->alive && port == 0) + { + input_overlay_state_t *ol_state = + &p_rarch->overlay_ptr->overlay_state; + if (ol_state->analog[base]) + res |= ol_state->analog[base]; + } +#endif + } } } } - if (p_rarch->input_driver_mapper) + if (input_remap_binds_enable) { if (idx < 2 && id < 2) { - unsigned offset = 0 + (idx * 4) + (id * 2); - int val1 = p_rarch->input_driver_mapper->analog_value[port][offset]; - int val2 = p_rarch->input_driver_mapper->analog_value[port][offset+1]; + unsigned offset = 0 + (idx * 4) + (id * 2); + int val1 = p_rarch->input_driver_mapper->analog_value[port][offset]; + int val2 = p_rarch->input_driver_mapper->analog_value[port][offset+1]; if (val1) res |= val1;