From 9034e822989c90498bf05f8042b62c15ef6134e6 Mon Sep 17 00:00:00 2001 From: Themaister Date: Tue, 1 Feb 2011 17:30:18 +0100 Subject: [PATCH] Add rewind granularity. (Faster, but less accurate rewind.) --- config.def.h | 3 +++ general.h | 1 + settings.c | 2 ++ ssnes.c | 11 +++++++---- ssnes.cfg | 3 +++ 5 files changed, 16 insertions(+), 4 deletions(-) diff --git a/config.def.h b/config.def.h index 5b13d609ea..1a6c72a2b2 100644 --- a/config.def.h +++ b/config.def.h @@ -153,6 +153,9 @@ static const bool rewind_enable = false; // The buffer size for the rewind buffer. This needs to be about 15-20MB per minute. Very game dependant. static const unsigned rewind_buffer_size = 20 << 20; // 20MiB +// How many frames to rewind at a time. +static const unsigned rewind_granularity = 1; + diff --git a/general.h b/general.h index b16586c3b6..ecb7202cbd 100644 --- a/general.h +++ b/general.h @@ -88,6 +88,7 @@ struct settings bool rewind_enable; unsigned rewind_buffer_size; + unsigned rewind_granularity; }; enum ssnes_game_type diff --git a/settings.c b/settings.c index 902b45c977..f2b6b7f378 100644 --- a/settings.c +++ b/settings.c @@ -126,6 +126,7 @@ static void set_defaults(void) g_settings.rewind_enable = rewind_enable; g_settings.rewind_buffer_size = rewind_buffer_size; + g_settings.rewind_granularity = rewind_granularity; assert(sizeof(g_settings.input.binds[0]) >= sizeof(snes_keybinds_1)); assert(sizeof(g_settings.input.binds[1]) >= sizeof(snes_keybinds_2)); @@ -314,6 +315,7 @@ static void parse_config_file(void) CONFIG_GET_BOOL(rewind_enable, "rewind_enable"); CONFIG_GET_INT(rewind_buffer_size, "rewind_buffer_size"); + CONFIG_GET_INT(rewind_granularity, "rewind_granularity"); read_keybinds(conf); diff --git a/ssnes.c b/ssnes.c index 3e71b9a7a5..5956d65556 100644 --- a/ssnes.c +++ b/ssnes.c @@ -826,14 +826,17 @@ static void check_rewind(void) g_extern.frame_is_reverse = true; } else - { msg_queue_push(g_extern.msg_queue, "Reached end of rewind buffer!", 0, 30); - } } else { - snes_serialize(g_extern.state_buf, snes_serialize_size()); - state_manager_push(g_extern.state_manager, g_extern.state_buf); + static unsigned cnt = 0; + cnt = (cnt + 1) % (g_settings.rewind_granularity ? g_settings.rewind_granularity : 1); // Avoid possible SIGFPE. + if (cnt == 0) + { + snes_serialize(g_extern.state_buf, snes_serialize_size()); + state_manager_push(g_extern.state_manager, g_extern.state_buf); + } } } diff --git a/ssnes.cfg b/ssnes.cfg index d74ffb4c70..55548521e2 100644 --- a/ssnes.cfg +++ b/ssnes.cfg @@ -199,6 +199,9 @@ # The buffer should be approx. 20MB per minute of buffer time. # rewind_buffer_size = 20 +# Rewind granularity. When rewinding defined number of frames, you can rewind several frames at a time, increasing the rewinding speed. +# rewind_granularity = 1 + # Hold button down to rewind. Rewinding must be enabled. # input_rewind = r