Skip to content

Commit 99387c0

Browse files
authored
Add dedicated RetroPad fast-forward button
1 parent ec5ecb2 commit 99387c0

File tree

1 file changed

+63
-8
lines changed

1 file changed

+63
-8
lines changed

src/platform/libretro/libretro.c

+63-8
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,9 @@ static retro_sensor_get_input_t sensorGetCallback;
6666
static retro_set_sensor_state_t sensorStateCallback;
6767

6868
static bool libretro_supports_bitmasks = false;
69+
static bool libretro_supports_ff_override = false;
70+
static bool libretro_ff_enabled;
71+
static bool libretro_ff_enabled_prev;
6972

7073
static void GBARetroLog(struct mLogger* logger, int category, enum mLogLevel level, const char* format, va_list args);
7174

@@ -512,6 +515,33 @@ static void _initColorCorrection(void) {
512515
}
513516
}
514517

518+
519+
/* Fast forward override */
520+
static void set_fastforward_override(bool fastforward)
521+
{
522+
struct retro_fastforwarding_override ff_override;
523+
524+
if (!libretro_supports_ff_override)
525+
return;
526+
527+
ff_override.ratio = -1.0f;
528+
ff_override.notification = true;
529+
530+
if (fastforward)
531+
{
532+
ff_override.fastforward = true;
533+
ff_override.inhibit_toggle = true;
534+
}
535+
else
536+
{
537+
ff_override.fastforward = false;
538+
ff_override.inhibit_toggle = false;
539+
}
540+
541+
environCallback(RETRO_ENVIRONMENT_SET_FASTFORWARDING_OVERRIDE, &ff_override);
542+
}
543+
544+
515545
static void _loadColorCorrectionSettings(void) {
516546
struct retro_variable var;
517547
unsigned oldCcType = ccType;
@@ -1386,12 +1416,14 @@ void retro_init(void) {
13861416
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_DOWN, "Down" },
13871417
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_R, "R" },
13881418
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_L, "L" },
1389-
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_R2, "Turbo R" },
1390-
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_L2, "Turbo L" },
1391-
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_R3, "Brighten Solar Sensor" },
1392-
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_L3, "Darken Solar Sensor" },
1419+
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_R2, "Fast Forward" },
1420+
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_L2, "" },
1421+
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_R3, "Turbo R" },
1422+
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_L3, "Turbo L" },
13931423
{ 0 }
13941424
};
1425+
1426+
13951427
environCallback(RETRO_ENVIRONMENT_SET_INPUT_DESCRIPTORS, &inputDescriptors);
13961428

13971429
useBitmasks = environCallback(RETRO_ENVIRONMENT_GET_INPUT_BITMASKS, NULL);
@@ -1443,6 +1475,12 @@ void retro_init(void) {
14431475
if (environCallback(RETRO_ENVIRONMENT_GET_INPUT_BITMASKS, NULL))
14441476
libretro_supports_bitmasks = true;
14451477

1478+
1479+
libretro_supports_ff_override = false;
1480+
if (environCallback(RETRO_ENVIRONMENT_SET_FASTFORWARDING_OVERRIDE, NULL))
1481+
libretro_supports_ff_override = true;
1482+
1483+
14461484
frameskipType = 0;
14471485
frameskipThreshold = 0;
14481486
frameskipCounter = 0;
@@ -1491,6 +1529,13 @@ void retro_deinit(void) {
14911529
audioLowPassRange = 0;
14921530
audioLowPassLeftPrev = 0;
14931531
audioLowPassRightPrev = 0;
1532+
1533+
1534+
if (libretro_ff_enabled)
1535+
set_fastforward_override(false);
1536+
libretro_supports_ff_override = false;
1537+
libretro_ff_enabled = false;
1538+
libretro_ff_enabled_prev = false;
14941539
}
14951540

14961541
static int turboclock = 0;
@@ -1565,7 +1610,7 @@ void retro_run(void) {
15651610
}
15661611
// XXX: turbo keys, should be moved to frontend
15671612
#define JOYPAD_BIT(BUTTON) (1 << RETRO_DEVICE_ID_JOYPAD_ ## BUTTON)
1568-
keys |= cycleturbo(joypadMask & JOYPAD_BIT(X), joypadMask & JOYPAD_BIT(Y), joypadMask & JOYPAD_BIT(L2), joypadMask & JOYPAD_BIT(R2));
1613+
keys |= cycleturbo(joypadMask & JOYPAD_BIT(X), joypadMask & JOYPAD_BIT(Y), joypadMask & JOYPAD_BIT(L3), joypadMask & JOYPAD_BIT(R3));
15691614
#undef JOYPAD_BIT
15701615
} else {
15711616
for (i = 0; i < sizeof(keymap) / sizeof(*keymap); ++i) {
@@ -1575,8 +1620,8 @@ void retro_run(void) {
15751620
keys |= cycleturbo(
15761621
inputCallback(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_X),
15771622
inputCallback(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_Y),
1578-
inputCallback(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_L2),
1579-
inputCallback(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_R2)
1623+
inputCallback(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_L3),
1624+
inputCallback(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_R3)
15801625
);
15811626
}
15821627

@@ -1649,7 +1694,9 @@ void retro_run(void) {
16491694
frameskipCounter = 0;
16501695
}
16511696
}
1652-
1697+
libretro_ff_enabled = libretro_supports_ff_override &&
1698+
inputCallback(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_R2);
1699+
16531700
/* If frameskip settings have changed, update
16541701
* frontend audio latency */
16551702
if (updateAudioLatency)
@@ -1738,6 +1785,14 @@ void retro_run(void) {
17381785
rumbleUp = 0;
17391786
rumbleDown = 0;
17401787
}
1788+
1789+
1790+
/* Handle fast forward button */
1791+
if (libretro_ff_enabled != libretro_ff_enabled_prev)
1792+
{
1793+
set_fastforward_override(libretro_ff_enabled);
1794+
libretro_ff_enabled_prev = libretro_ff_enabled;
1795+
}
17411796
}
17421797

17431798
static void _setupMaps(struct mCore* core) {

0 commit comments

Comments
 (0)