@@ -66,6 +66,9 @@ static retro_sensor_get_input_t sensorGetCallback;
66
66
static retro_set_sensor_state_t sensorStateCallback ;
67
67
68
68
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 ;
69
72
70
73
static void GBARetroLog (struct mLogger * logger , int category , enum mLogLevel level , const char * format , va_list args );
71
74
@@ -512,6 +515,33 @@ static void _initColorCorrection(void) {
512
515
}
513
516
}
514
517
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
+
515
545
static void _loadColorCorrectionSettings (void ) {
516
546
struct retro_variable var ;
517
547
unsigned oldCcType = ccType ;
@@ -1386,12 +1416,14 @@ void retro_init(void) {
1386
1416
{ 0 , RETRO_DEVICE_JOYPAD , 0 , RETRO_DEVICE_ID_JOYPAD_DOWN , "Down" },
1387
1417
{ 0 , RETRO_DEVICE_JOYPAD , 0 , RETRO_DEVICE_ID_JOYPAD_R , "R" },
1388
1418
{ 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 " },
1393
1423
{ 0 }
1394
1424
};
1425
+
1426
+
1395
1427
environCallback (RETRO_ENVIRONMENT_SET_INPUT_DESCRIPTORS , & inputDescriptors );
1396
1428
1397
1429
useBitmasks = environCallback (RETRO_ENVIRONMENT_GET_INPUT_BITMASKS , NULL );
@@ -1443,6 +1475,12 @@ void retro_init(void) {
1443
1475
if (environCallback (RETRO_ENVIRONMENT_GET_INPUT_BITMASKS , NULL ))
1444
1476
libretro_supports_bitmasks = true;
1445
1477
1478
+
1479
+ libretro_supports_ff_override = false;
1480
+ if (environCallback (RETRO_ENVIRONMENT_SET_FASTFORWARDING_OVERRIDE , NULL ))
1481
+ libretro_supports_ff_override = true;
1482
+
1483
+
1446
1484
frameskipType = 0 ;
1447
1485
frameskipThreshold = 0 ;
1448
1486
frameskipCounter = 0 ;
@@ -1491,6 +1529,13 @@ void retro_deinit(void) {
1491
1529
audioLowPassRange = 0 ;
1492
1530
audioLowPassLeftPrev = 0 ;
1493
1531
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;
1494
1539
}
1495
1540
1496
1541
static int turboclock = 0 ;
@@ -1565,7 +1610,7 @@ void retro_run(void) {
1565
1610
}
1566
1611
// XXX: turbo keys, should be moved to frontend
1567
1612
#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 ));
1569
1614
#undef JOYPAD_BIT
1570
1615
} else {
1571
1616
for (i = 0 ; i < sizeof (keymap ) / sizeof (* keymap ); ++ i ) {
@@ -1575,8 +1620,8 @@ void retro_run(void) {
1575
1620
keys |= cycleturbo (
1576
1621
inputCallback (0 , RETRO_DEVICE_JOYPAD , 0 , RETRO_DEVICE_ID_JOYPAD_X ),
1577
1622
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 )
1580
1625
);
1581
1626
}
1582
1627
@@ -1649,7 +1694,9 @@ void retro_run(void) {
1649
1694
frameskipCounter = 0 ;
1650
1695
}
1651
1696
}
1652
-
1697
+ libretro_ff_enabled = libretro_supports_ff_override &&
1698
+ inputCallback (0 , RETRO_DEVICE_JOYPAD , 0 , RETRO_DEVICE_ID_JOYPAD_R2 );
1699
+
1653
1700
/* If frameskip settings have changed, update
1654
1701
* frontend audio latency */
1655
1702
if (updateAudioLatency )
@@ -1738,6 +1785,14 @@ void retro_run(void) {
1738
1785
rumbleUp = 0 ;
1739
1786
rumbleDown = 0 ;
1740
1787
}
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
+ }
1741
1796
}
1742
1797
1743
1798
static void _setupMaps (struct mCore * core ) {
0 commit comments