Changes for input on rising edge only

Pausing, changing audio and changing subtitles are only performed on the
rising edge of a button press only. They no longer change whilst the
button is pressed.

Signed-off-by: Mahyar Koshkouei <mahyar.koshkouei@gmail.com>
This commit is contained in:
Mahyar Koshkouei 2018-01-07 23:36:24 +00:00
parent a907c8756f
commit f50d33ac68
1 changed files with 46 additions and 12 deletions

View File

@ -31,8 +31,17 @@ static unsigned int event_waiting = 0;
/* Save the current playback time for context changes */ /* Save the current playback time for context changes */
static int64_t *playback_time = 0; static int64_t *playback_time = 0;
/* filepath required globaly as mpv is reopened on context change */
static char *filepath = NULL; static char *filepath = NULL;
struct Input
{
unsigned int l : 1;
unsigned int r : 1;
unsigned int a : 1;
};
static void fallback_log(enum retro_log_level level, const char *fmt, ...) static void fallback_log(enum retro_log_level level, const char *fmt, ...)
{ {
(void)level; (void)level;
@ -292,8 +301,37 @@ static void audio_callback(void)
static void retropad_update_input(void) static void retropad_update_input(void)
{ {
struct Input current;
static struct Input last;
input_poll_cb(); input_poll_cb();
/* Commands that are called on rising edge only */
/* A ternary operator is used since input_state_cb returns an int16_t, but
* we only care about whether the button is on or off which is why we store
* the value in a single bit for each button.
*
* Unsure if saving the memory is worth the extra checks, costing CPU time,
* but both are incredibly miniscule anyway.
*/
current.l = input_state_cb(0, RETRO_DEVICE_JOYPAD,
0, RETRO_DEVICE_ID_JOYPAD_L) != 0 ? 1 : 0;
current.r = input_state_cb(0, RETRO_DEVICE_JOYPAD,
0, RETRO_DEVICE_ID_JOYPAD_R) != 0 ? 1 : 0;
current.a = input_state_cb(0, RETRO_DEVICE_JOYPAD,
0, RETRO_DEVICE_ID_JOYPAD_A) != 0 ? 1 : 0;
if(current.l == 1 && last.l == 0)
mpv_command_string(mpv, "cycle audio");
if(current.r == 1 && last.r == 0)
mpv_command_string(mpv, "cycle sub");
if(current.a == 1 && last.a == 0)
mpv_command_string(mpv, "cycle pause");
/* Press and hold commands with small delay */
if(input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, if(input_state_cb(0, RETRO_DEVICE_JOYPAD, 0,
RETRO_DEVICE_ID_JOYPAD_LEFT)) RETRO_DEVICE_ID_JOYPAD_LEFT))
mpv_command_string(mpv, "seek -5"); mpv_command_string(mpv, "seek -5");
@ -310,21 +348,17 @@ static void retropad_update_input(void)
RETRO_DEVICE_ID_JOYPAD_DOWN)) RETRO_DEVICE_ID_JOYPAD_DOWN))
mpv_command_string(mpv, "seek -60"); mpv_command_string(mpv, "seek -60");
if(input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, /* Press and hold commands */
RETRO_DEVICE_ID_JOYPAD_L))
mpv_command_string(mpv, "cycle audio");
if(input_state_cb(0, RETRO_DEVICE_JOYPAD, 0,
RETRO_DEVICE_ID_JOYPAD_R))
mpv_command_string(mpv, "cycle sub");
if(input_state_cb(0, RETRO_DEVICE_JOYPAD, 0,
RETRO_DEVICE_ID_JOYPAD_A))
mpv_command_string(mpv, "cycle pause");
if(input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, if(input_state_cb(0, RETRO_DEVICE_JOYPAD, 0,
RETRO_DEVICE_ID_JOYPAD_X)) RETRO_DEVICE_ID_JOYPAD_X))
mpv_command_string(mpv, "show-progress"); mpv_command_string(mpv, "show-progress");
/* Instead of copying the structs as though they were a union, we assign
* each variable one-by-one to avoid endian issues.
*/
last.l = current.l;
last.r = current.r;
last.a = current.a;
} }
void retro_run(void) void retro_run(void)