mirror of
https://github.com/libretro/RetroArch
synced 2025-04-09 21:45:45 +00:00
Frame advance.
This commit is contained in:
parent
a1c19ed1f5
commit
466ab1ef8d
@ -252,6 +252,7 @@ static const struct snes_keybind snes_keybinds_1[] = {
|
|||||||
{ SSNES_REWIND, SK_r, NO_BTN, AXIS_NONE },
|
{ SSNES_REWIND, SK_r, NO_BTN, AXIS_NONE },
|
||||||
{ SSNES_MOVIE_RECORD_TOGGLE, SK_o, NO_BTN, AXIS_NONE },
|
{ SSNES_MOVIE_RECORD_TOGGLE, SK_o, NO_BTN, AXIS_NONE },
|
||||||
{ SSNES_PAUSE_TOGGLE, SK_p, NO_BTN, AXIS_NONE },
|
{ SSNES_PAUSE_TOGGLE, SK_p, NO_BTN, AXIS_NONE },
|
||||||
|
{ SSNES_FRAMEADVANCE, SK_k, NO_BTN, AXIS_NONE },
|
||||||
{ SSNES_RESET, SK_h, NO_BTN, AXIS_NONE },
|
{ SSNES_RESET, SK_h, NO_BTN, AXIS_NONE },
|
||||||
{ SSNES_SHADER_NEXT, SK_m, NO_BTN, AXIS_NONE },
|
{ SSNES_SHADER_NEXT, SK_m, NO_BTN, AXIS_NONE },
|
||||||
{ SSNES_SHADER_PREV, SK_n, NO_BTN, AXIS_NONE },
|
{ SSNES_SHADER_PREV, SK_n, NO_BTN, AXIS_NONE },
|
||||||
|
1
driver.h
1
driver.h
@ -41,6 +41,7 @@ enum
|
|||||||
SSNES_REWIND,
|
SSNES_REWIND,
|
||||||
SSNES_MOVIE_RECORD_TOGGLE,
|
SSNES_MOVIE_RECORD_TOGGLE,
|
||||||
SSNES_PAUSE_TOGGLE,
|
SSNES_PAUSE_TOGGLE,
|
||||||
|
SSNES_FRAMEADVANCE,
|
||||||
SSNES_RESET,
|
SSNES_RESET,
|
||||||
SSNES_SHADER_NEXT,
|
SSNES_SHADER_NEXT,
|
||||||
SSNES_SHADER_PREV,
|
SSNES_SHADER_PREV,
|
||||||
|
@ -260,6 +260,7 @@ struct global
|
|||||||
|
|
||||||
// Pausing support
|
// Pausing support
|
||||||
bool is_paused;
|
bool is_paused;
|
||||||
|
bool is_oneshot;
|
||||||
|
|
||||||
// Autosave support.
|
// Autosave support.
|
||||||
autosave_t *autosave[2];
|
autosave_t *autosave[2];
|
||||||
|
@ -479,6 +479,7 @@ static const struct bind_map bind_maps[MAX_PLAYERS][MAX_BINDS - 1] = {
|
|||||||
DECLARE_BIND(rewind, SSNES_REWIND)
|
DECLARE_BIND(rewind, SSNES_REWIND)
|
||||||
DECLARE_BIND(movie_record_toggle, SSNES_MOVIE_RECORD_TOGGLE)
|
DECLARE_BIND(movie_record_toggle, SSNES_MOVIE_RECORD_TOGGLE)
|
||||||
DECLARE_BIND(pause_toggle, SSNES_PAUSE_TOGGLE)
|
DECLARE_BIND(pause_toggle, SSNES_PAUSE_TOGGLE)
|
||||||
|
DECLARE_BIND(frame_advance, SSNES_FRAMEADVANCE)
|
||||||
DECLARE_BIND(reset, SSNES_RESET)
|
DECLARE_BIND(reset, SSNES_RESET)
|
||||||
DECLARE_BIND(shader_next, SSNES_SHADER_NEXT)
|
DECLARE_BIND(shader_next, SSNES_SHADER_NEXT)
|
||||||
DECLARE_BIND(shader_prev, SSNES_SHADER_PREV)
|
DECLARE_BIND(shader_prev, SSNES_SHADER_PREV)
|
||||||
@ -514,6 +515,7 @@ static const struct bind_map bind_maps[MAX_PLAYERS][MAX_BINDS - 1] = {
|
|||||||
DECLARE_BIND(rewind, SSNES_REWIND)
|
DECLARE_BIND(rewind, SSNES_REWIND)
|
||||||
DECLARE_BIND(movie_record_toggle, SSNES_MOVIE_RECORD_TOGGLE)
|
DECLARE_BIND(movie_record_toggle, SSNES_MOVIE_RECORD_TOGGLE)
|
||||||
DECLARE_BIND(pause_toggle, SSNES_PAUSE_TOGGLE)
|
DECLARE_BIND(pause_toggle, SSNES_PAUSE_TOGGLE)
|
||||||
|
DECLARE_BIND(frame_advance, SSNES_FRAMEADVANCE)
|
||||||
DECLARE_BIND(reset, SSNES_RESET)
|
DECLARE_BIND(reset, SSNES_RESET)
|
||||||
DECLARE_BIND(shader_next, SSNES_SHADER_NEXT)
|
DECLARE_BIND(shader_next, SSNES_SHADER_NEXT)
|
||||||
DECLARE_BIND(shader_prev, SSNES_SHADER_PREV)
|
DECLARE_BIND(shader_prev, SSNES_SHADER_PREV)
|
||||||
@ -549,6 +551,7 @@ static const struct bind_map bind_maps[MAX_PLAYERS][MAX_BINDS - 1] = {
|
|||||||
DECLARE_BIND(rewind, SSNES_REWIND)
|
DECLARE_BIND(rewind, SSNES_REWIND)
|
||||||
DECLARE_BIND(movie_record_toggle, SSNES_MOVIE_RECORD_TOGGLE)
|
DECLARE_BIND(movie_record_toggle, SSNES_MOVIE_RECORD_TOGGLE)
|
||||||
DECLARE_BIND(pause_toggle, SSNES_PAUSE_TOGGLE)
|
DECLARE_BIND(pause_toggle, SSNES_PAUSE_TOGGLE)
|
||||||
|
DECLARE_BIND(frame_advance, SSNES_FRAMEADVANCE)
|
||||||
DECLARE_BIND(reset, SSNES_RESET)
|
DECLARE_BIND(reset, SSNES_RESET)
|
||||||
DECLARE_BIND(shader_next, SSNES_SHADER_NEXT)
|
DECLARE_BIND(shader_next, SSNES_SHADER_NEXT)
|
||||||
DECLARE_BIND(shader_prev, SSNES_SHADER_PREV)
|
DECLARE_BIND(shader_prev, SSNES_SHADER_PREV)
|
||||||
@ -584,6 +587,7 @@ static const struct bind_map bind_maps[MAX_PLAYERS][MAX_BINDS - 1] = {
|
|||||||
DECLARE_BIND(rewind, SSNES_REWIND)
|
DECLARE_BIND(rewind, SSNES_REWIND)
|
||||||
DECLARE_BIND(movie_record_toggle, SSNES_MOVIE_RECORD_TOGGLE)
|
DECLARE_BIND(movie_record_toggle, SSNES_MOVIE_RECORD_TOGGLE)
|
||||||
DECLARE_BIND(pause_toggle, SSNES_PAUSE_TOGGLE)
|
DECLARE_BIND(pause_toggle, SSNES_PAUSE_TOGGLE)
|
||||||
|
DECLARE_BIND(frame_advance, SSNES_FRAMEADVANCE)
|
||||||
DECLARE_BIND(reset, SSNES_RESET)
|
DECLARE_BIND(reset, SSNES_RESET)
|
||||||
DECLARE_BIND(shader_next, SSNES_SHADER_NEXT)
|
DECLARE_BIND(shader_next, SSNES_SHADER_NEXT)
|
||||||
DECLARE_BIND(shader_prev, SSNES_SHADER_PREV)
|
DECLARE_BIND(shader_prev, SSNES_SHADER_PREV)
|
||||||
@ -619,6 +623,7 @@ static const struct bind_map bind_maps[MAX_PLAYERS][MAX_BINDS - 1] = {
|
|||||||
DECLARE_BIND(rewind, SSNES_REWIND)
|
DECLARE_BIND(rewind, SSNES_REWIND)
|
||||||
DECLARE_BIND(movie_record_toggle, SSNES_MOVIE_RECORD_TOGGLE)
|
DECLARE_BIND(movie_record_toggle, SSNES_MOVIE_RECORD_TOGGLE)
|
||||||
DECLARE_BIND(pause_toggle, SSNES_PAUSE_TOGGLE)
|
DECLARE_BIND(pause_toggle, SSNES_PAUSE_TOGGLE)
|
||||||
|
DECLARE_BIND(frame_advance, SSNES_FRAMEADVANCE)
|
||||||
DECLARE_BIND(reset, SSNES_RESET)
|
DECLARE_BIND(reset, SSNES_RESET)
|
||||||
DECLARE_BIND(shader_next, SSNES_SHADER_NEXT)
|
DECLARE_BIND(shader_next, SSNES_SHADER_NEXT)
|
||||||
DECLARE_BIND(shader_prev, SSNES_SHADER_PREV)
|
DECLARE_BIND(shader_prev, SSNES_SHADER_PREV)
|
||||||
|
27
ssnes.c
27
ssnes.c
@ -185,11 +185,6 @@ static void video_frame(const uint16_t *data, unsigned width, unsigned height)
|
|||||||
|
|
||||||
static bool audio_flush(const int16_t *data, unsigned samples)
|
static bool audio_flush(const int16_t *data, unsigned samples)
|
||||||
{
|
{
|
||||||
audio_convert_s16_to_float(g_extern.audio_data.data, data, samples);
|
|
||||||
|
|
||||||
const float *output_data = NULL;
|
|
||||||
unsigned output_frames = 0;
|
|
||||||
|
|
||||||
#ifdef HAVE_FFMPEG
|
#ifdef HAVE_FFMPEG
|
||||||
if (g_extern.recording)
|
if (g_extern.recording)
|
||||||
{
|
{
|
||||||
@ -201,6 +196,14 @@ static bool audio_flush(const int16_t *data, unsigned samples)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
if (g_extern.is_paused)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
const float *output_data = NULL;
|
||||||
|
unsigned output_frames = 0;
|
||||||
|
|
||||||
|
audio_convert_s16_to_float(g_extern.audio_data.data, data, samples);
|
||||||
|
|
||||||
ssnes_dsp_input_t dsp_input = {
|
ssnes_dsp_input_t dsp_input = {
|
||||||
.samples = g_extern.audio_data.data,
|
.samples = g_extern.audio_data.data,
|
||||||
.frames = samples / 2
|
.frames = samples / 2
|
||||||
@ -1506,6 +1509,15 @@ static void check_pause(void)
|
|||||||
old_state = new_state;
|
old_state = new_state;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void check_oneshot(void)
|
||||||
|
{
|
||||||
|
static bool old_state = false;
|
||||||
|
bool new_state = driver.input->key_pressed(driver.input_data, SSNES_FRAMEADVANCE);
|
||||||
|
|
||||||
|
g_extern.is_oneshot = new_state && !old_state;
|
||||||
|
old_state = new_state;
|
||||||
|
}
|
||||||
|
|
||||||
static void check_reset(void)
|
static void check_reset(void)
|
||||||
{
|
{
|
||||||
if (driver.input->key_pressed(driver.input_data, SSNES_RESET))
|
if (driver.input->key_pressed(driver.input_data, SSNES_RESET))
|
||||||
@ -1623,7 +1635,8 @@ static void do_state_checks(void)
|
|||||||
check_cheats();
|
check_cheats();
|
||||||
#endif
|
#endif
|
||||||
check_pause();
|
check_pause();
|
||||||
if (g_extern.is_paused)
|
check_oneshot();
|
||||||
|
if (g_extern.is_paused && !g_extern.is_oneshot)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
set_fast_forward_button(
|
set_fast_forward_button(
|
||||||
@ -1751,7 +1764,7 @@ int main(int argc, char *argv[])
|
|||||||
do_state_checks();
|
do_state_checks();
|
||||||
|
|
||||||
// Run libsnes for one frame.
|
// Run libsnes for one frame.
|
||||||
if (!g_extern.is_paused)
|
if (!g_extern.is_paused || g_extern.is_oneshot)
|
||||||
{
|
{
|
||||||
lock_autosave();
|
lock_autosave();
|
||||||
|
|
||||||
|
@ -276,6 +276,9 @@
|
|||||||
# Toggle between paused and non-paused state
|
# Toggle between paused and non-paused state
|
||||||
# input_pause_toggle = p
|
# input_pause_toggle = p
|
||||||
|
|
||||||
|
# Frame advance when game is paused
|
||||||
|
# input_frame_advance = k
|
||||||
|
|
||||||
# Reset the emulated SNES.
|
# Reset the emulated SNES.
|
||||||
# input_reset = h
|
# input_reset = h
|
||||||
|
|
||||||
|
@ -92,6 +92,7 @@ static struct bind binds[] = {
|
|||||||
MISC_BIND("Rewind", rewind)
|
MISC_BIND("Rewind", rewind)
|
||||||
MISC_BIND("Movie recording toggle", movie_record_toggle)
|
MISC_BIND("Movie recording toggle", movie_record_toggle)
|
||||||
MISC_BIND("Pause", pause_toggle)
|
MISC_BIND("Pause", pause_toggle)
|
||||||
|
MISC_BIND("Frame advance", frame_advance)
|
||||||
MISC_BIND("Reset", reset)
|
MISC_BIND("Reset", reset)
|
||||||
MISC_BIND("Next shader", shader_next)
|
MISC_BIND("Next shader", shader_next)
|
||||||
MISC_BIND("Previous shader", shader_prev)
|
MISC_BIND("Previous shader", shader_prev)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user