From 068c224d83ba6fb0ba6d477b01d96af930bc758a Mon Sep 17 00:00:00 2001 From: Themaister Date: Tue, 18 Oct 2011 14:05:30 +0200 Subject: [PATCH 01/11] Include windows.h properly. --- general.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/general.h b/general.h index 58d45a287d..711c157378 100644 --- a/general.h +++ b/general.h @@ -41,6 +41,9 @@ #ifndef _WIN32 #include // MAXPATHLEN +#else +#define WIN32_LEAN_AND_MEAN +#include #endif #ifndef MAXPATHLEN From 141eefb03b53de028d33966ad5abd4e85e87991d Mon Sep 17 00:00:00 2001 From: Themaister Date: Tue, 18 Oct 2011 14:39:54 +0200 Subject: [PATCH 02/11] Fix fullscreen pause toggle for windows. --- ssnes.c | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/ssnes.c b/ssnes.c index b304933b9a..3e1f54cbc4 100644 --- a/ssnes.c +++ b/ssnes.c @@ -1267,12 +1267,13 @@ static void check_savestates(void) old_should_loadstate = should_loadstate; } -static void check_fullscreen(void) +static bool check_fullscreen(void) { - static bool was_pressed = false; - bool pressed; // If we go fullscreen we drop all drivers and reinit to be safe. - if ((pressed = driver.input->key_pressed(driver.input_data, SSNES_FULLSCREEN_TOGGLE_KEY)) && !was_pressed) + static bool was_pressed = false; + bool pressed = driver.input->key_pressed(driver.input_data, SSNES_FULLSCREEN_TOGGLE_KEY); + bool toggle = pressed && !was_pressed; + if (toggle) { g_settings.video.fullscreen = !g_settings.video.fullscreen; uninit_drivers(); @@ -1280,6 +1281,7 @@ static void check_fullscreen(void) } was_pressed = pressed; + return toggle; } static void check_stateslots(void) @@ -1636,12 +1638,21 @@ static void do_state_checks(void) #endif check_pause(); check_oneshot(); - if (g_extern.is_paused && !g_extern.is_oneshot) + + if (check_fullscreen()) { - check_fullscreen(); - return; + // To avoid awkward behavior where things aren't showing up, + // we need to advance one frame for the window to show up. + // Poll input to avoid possibly stale data to corrupt things. + if (driver.input) + driver.input->poll(driver.input_data); + + g_extern.is_oneshot = true; } + if (g_extern.is_paused && !g_extern.is_oneshot) + return; + set_fast_forward_button( driver.input->key_pressed(driver.input_data, SSNES_FAST_FORWARD_KEY), driver.input->key_pressed(driver.input_data, SSNES_FAST_FORWARD_HOLD_KEY)); @@ -1664,8 +1675,8 @@ static void do_state_checks(void) check_dsp_config(); #endif } - - check_fullscreen(); + else + check_fullscreen(); #ifdef HAVE_DYLIB // DSP plugin doesn't use variable input rate. From 6467f51ea85c8704f46f0baa1e428ae9fe872687 Mon Sep 17 00:00:00 2001 From: Themaister Date: Tue, 18 Oct 2011 17:26:15 +0200 Subject: [PATCH 03/11] Frame caching for more "proper" fullscreen switch. --- general.h | 7 +++++++ ssnes.c | 39 +++++++++++++++++++++++++++++---------- 2 files changed, 36 insertions(+), 10 deletions(-) diff --git a/general.h b/general.h index 711c157378..a137a38232 100644 --- a/general.h +++ b/general.h @@ -285,6 +285,13 @@ struct global unsigned record_height; #endif + struct + { + const uint16_t *data; + unsigned width; + unsigned height; + } frame_cache; + char title_buf[64]; struct diff --git a/ssnes.c b/ssnes.c index 3e1f54cbc4..d327a87e89 100644 --- a/ssnes.c +++ b/ssnes.c @@ -181,6 +181,29 @@ static void video_frame(const uint16_t *data, unsigned width, unsigned height) if (!driver.video->frame(driver.video_data, data, width, height, (height == 448 || height == 478) ? 1024 : 2048, msg)) g_extern.video_active = false; #endif + + g_extern.frame_cache.data = data; + g_extern.frame_cache.width = width; + g_extern.frame_cache.height = height; +} + +static void video_cached_frame(void) +{ + // Cannot allow FFmpeg recording when pusing dup'ed frames. + bool recording = g_extern.recording; + g_extern.recording = false; + + // Not 100% safe, since the library might have + // freed the memory, but no known implementations do this :D + // It would be really stupid at any rate ... + if (g_extern.frame_cache.data) + { + video_frame(g_extern.frame_cache.data, + g_extern.frame_cache.width, + g_extern.frame_cache.height); + } + + g_extern.recording = recording; } static bool audio_flush(const int16_t *data, unsigned samples) @@ -1278,6 +1301,10 @@ static bool check_fullscreen(void) g_settings.video.fullscreen = !g_settings.video.fullscreen; uninit_drivers(); init_drivers(); + + // Poll input to avoid possibly stale data to corrupt things. + if (driver.input) + driver.input->poll(driver.input_data); } was_pressed = pressed; @@ -1639,16 +1666,8 @@ static void do_state_checks(void) check_pause(); check_oneshot(); - if (check_fullscreen()) - { - // To avoid awkward behavior where things aren't showing up, - // we need to advance one frame for the window to show up. - // Poll input to avoid possibly stale data to corrupt things. - if (driver.input) - driver.input->poll(driver.input_data); - - g_extern.is_oneshot = true; - } + if (check_fullscreen() && g_extern.is_paused) + video_cached_frame(); if (g_extern.is_paused && !g_extern.is_oneshot) return; From a79a1b46f72f75719a1e06e3108b345d4d6ce276 Mon Sep 17 00:00:00 2001 From: Themaister Date: Tue, 18 Oct 2011 19:12:28 +0200 Subject: [PATCH 04/11] Updates for 0.9-rc4. --- Makefile.win | 4 ++-- qb/config.params.sh | 2 +- ssnes.c | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Makefile.win b/Makefile.win index 05db70577d..407562ae04 100644 --- a/Makefile.win +++ b/Makefile.win @@ -166,10 +166,10 @@ clean: rm -f tools/*.o dist_x86: all - zip -r ssnes-win32-0.9-rc3.zip $(TARGET) $(JTARGET) ssnes.cfg snes.dll SDL.dll + zip -r ssnes-win32-0.9-rc4.zip $(TARGET) $(JTARGET) ssnes.cfg snes.dll SDL.dll dist_x86_64: all - zip -r ssnes-win64-0.9-rc3.zip $(TARGET) $(JTARGET) ssnes.cfg snes.dll SDL.dll + zip -r ssnes-win64-0.9-rc4.zip $(TARGET) $(JTARGET) ssnes.cfg snes.dll SDL.dll libs_x86: wget https://github.com/downloads/Themaister/SSNES/SSNES-win32-libs.zip --no-check-certificate diff --git a/qb/config.params.sh b/qb/config.params.sh index 4860cce882..36ca395a24 100644 --- a/qb/config.params.sh +++ b/qb/config.params.sh @@ -1,7 +1,7 @@ . qb/qb.params.sh PACKAGE_NAME=ssnes -PACKAGE_VERSION=0.9-rc3 +PACKAGE_VERSION=0.9-rc4 # Adds a command line opt to ./configure --help # $1: Variable (HAVE_ALSA, HAVE_OSS, etc) diff --git a/ssnes.c b/ssnes.c index d327a87e89..9f31c656ea 100644 --- a/ssnes.c +++ b/ssnes.c @@ -355,7 +355,7 @@ static int16_t input_state(bool port, unsigned device, unsigned index, unsigned #endif #ifdef _WIN32 -#define PACKAGE_VERSION "0.9-rc3" +#define PACKAGE_VERSION "0.9-rc4" #endif #include "config.features.h" From dd89e6fbe0171625cbbe3ae60ade57ff72d32f82 Mon Sep 17 00:00:00 2001 From: Themaister Date: Tue, 18 Oct 2011 19:16:38 +0200 Subject: [PATCH 05/11] Fix build without FFmpeg. --- ssnes.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ssnes.c b/ssnes.c index 9f31c656ea..93b4306480 100644 --- a/ssnes.c +++ b/ssnes.c @@ -189,9 +189,11 @@ static void video_frame(const uint16_t *data, unsigned width, unsigned height) static void video_cached_frame(void) { - // Cannot allow FFmpeg recording when pusing dup'ed frames. +#ifdef HAVE_FFMPEG + // Cannot allow FFmpeg recording when pushing duped frames. bool recording = g_extern.recording; g_extern.recording = false; +#endif // Not 100% safe, since the library might have // freed the memory, but no known implementations do this :D @@ -203,7 +205,9 @@ static void video_cached_frame(void) g_extern.frame_cache.height); } +#ifdef HAVE_FFMPEG g_extern.recording = recording; +#endif } static bool audio_flush(const int16_t *data, unsigned samples) From e134f8afc71f2ac53f7289d2e788c24c8de02115 Mon Sep 17 00:00:00 2001 From: Themaister Date: Tue, 18 Oct 2011 19:22:20 +0200 Subject: [PATCH 06/11] And yet another ... :) --- netplay.c | 36 ++++++++++++++++++++---------------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/netplay.c b/netplay.c index 86efc46dd8..2522b6de81 100644 --- a/netplay.c +++ b/netplay.c @@ -15,6 +15,25 @@ * If not, see . */ +#ifdef _WIN32 +#ifndef _WIN32_WINNT +#define _WIN32_WINNT 0x0501 +#endif +#define WIN32_LEAN_AND_MEAN +#include +#include +#include +#else +#include +#include +#include +#include +#include +#include +#include +#include +#endif + #include "netplay.h" #include "general.h" #include "autosave.h" @@ -25,32 +44,17 @@ #include #include + #ifdef _WIN32 -#ifndef _WIN32_WINNT -#define _WIN32_WINNT 0x0501 -#endif -#define WIN32_LEAN_AND_MEAN -#include -#include -#include // Woohoo, Winsock has headers from the STONE AGE! :D #define close(x) closesocket(x) #define CONST_CAST (const char*) #define NONCONST_CAST (char*) #else -#include -#include -#include -#include -#include -#include -#include -#include #define CONST_CAST #define NONCONST_CAST #endif - #define PREV_PTR(x) ((x) == 0 ? handle->buffer_size - 1 : (x) - 1) #define NEXT_PTR(x) ((x + 1) % handle->buffer_size) From 64ee13e6f4d862dc3bc39134c88112a71750748b Mon Sep 17 00:00:00 2001 From: Themaister Date: Tue, 18 Oct 2011 19:51:38 +0200 Subject: [PATCH 07/11] Push window loop in .alive(). --- gfx/gl.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/gfx/gl.c b/gfx/gl.c index ebdd04ec2b..f0d775d932 100644 --- a/gfx/gl.c +++ b/gfx/gl.c @@ -842,19 +842,14 @@ static void check_window(gl_t *gl) gl->frame_count); if (quit) - { gl->quitting = true; - } else if (resize) - { gl->should_resize = true; - } } static bool gl_frame(void *data, const void* frame, unsigned width, unsigned height, unsigned pitch, const char *msg) { gl_t *gl = data; - check_window(gl); gl_shader_use(1); gl->frame_count++; @@ -1336,6 +1331,7 @@ static void* gl_init(const video_info_t *video, const input_driver_t **input, vo static bool gl_alive(void *data) { gl_t *gl = data; + check_window(gl); return !gl->quitting; } From c7acd995484fadf4cb38c724889c6351ba64fa80 Mon Sep 17 00:00:00 2001 From: Themaister Date: Tue, 18 Oct 2011 19:52:43 +0200 Subject: [PATCH 08/11] Same for SDL ... --- gfx/sdl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gfx/sdl.c b/gfx/sdl.c index dd94d43c7c..bee4d82e91 100644 --- a/gfx/sdl.c +++ b/gfx/sdl.c @@ -465,7 +465,6 @@ static void check_window(sdl_video_t *vid) static bool sdl_gfx_frame(void *data, const void* frame, unsigned width, unsigned height, unsigned pitch, const char *msg) { sdl_video_t *vid = data; - check_window(vid); if (SDL_MUSTLOCK(vid->buffer)) SDL_LockSurface(vid->buffer); @@ -537,6 +536,7 @@ static void sdl_gfx_set_nonblock_state(void *data, bool state) static bool sdl_gfx_alive(void *data) { sdl_video_t *vid = data; + check_window(vid); return !vid->quitting; } From 8f5580be1018e5c340cf429ade9bea1eb053076a Mon Sep 17 00:00:00 2001 From: Themaister Date: Tue, 18 Oct 2011 21:57:28 +0200 Subject: [PATCH 09/11] Frame advance goes into pause. --- ssnes.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/ssnes.c b/ssnes.c index 93b4306480..bd5b7dcbab 100644 --- a/ssnes.c +++ b/ssnes.c @@ -1488,6 +1488,9 @@ static void check_pause(void) static bool old_state = false; bool new_state = driver.input->key_pressed(driver.input_data, SSNES_PAUSE_TOGGLE); + // FRAMEADVANCE will set us into pause mode. + new_state |= !g_extern.is_paused && driver.input->key_pressed(driver.input_data, SSNES_FRAMEADVANCE); + static bool old_focus = true; bool focus = true; @@ -1546,9 +1549,14 @@ 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; + g_extern.is_oneshot = (new_state && !old_state); old_state = new_state; + + // Rewind buttons works like FRAMEREWIND when paused. We will one-shot in that case. + static bool old_rewind_state = false; + bool new_rewind_state = driver.input->key_pressed(driver.input_data, SSNES_REWIND); + g_extern.is_oneshot |= new_rewind_state && !old_rewind_state; + old_rewind_state = new_rewind_state; } static void check_reset(void) @@ -1685,11 +1693,11 @@ static void do_state_checks(void) check_stateslots(); check_savestates(); } - check_rewind(); + check_rewind(); if (!g_extern.bsv_movie_playback) check_movie_record(); - + #ifdef HAVE_XML check_shader_dir(); #endif From efaa85ff9b61a684e5f11c29db4277c00db19630 Mon Sep 17 00:00:00 2001 From: Themaister Date: Tue, 18 Oct 2011 21:59:37 +0200 Subject: [PATCH 10/11] Cleaner. --- ssnes.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/ssnes.c b/ssnes.c index bd5b7dcbab..b577071205 100644 --- a/ssnes.c +++ b/ssnes.c @@ -1671,10 +1671,6 @@ static void do_state_checks(void) { if (!g_extern.netplay) { - check_reset(); -#ifdef HAVE_XML - check_cheats(); -#endif check_pause(); check_oneshot(); @@ -1700,11 +1696,13 @@ static void do_state_checks(void) #ifdef HAVE_XML check_shader_dir(); + check_cheats(); #endif #ifdef HAVE_DYLIB check_dsp_config(); #endif + check_reset(); } else check_fullscreen(); From f44733d7f6069891ea2ce9e1e533b18af075a0a8 Mon Sep 17 00:00:00 2001 From: Themaister Date: Wed, 26 Oct 2011 03:24:39 +0200 Subject: [PATCH 11/11] Only show paused rewind for 1 frame. --- ssnes.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ssnes.c b/ssnes.c index b577071205..0e54d07610 100644 --- a/ssnes.c +++ b/ssnes.c @@ -1423,7 +1423,7 @@ static void check_rewind(void) g_extern.frame_is_reverse = true; setup_rewind_audio(); - msg_queue_push(g_extern.msg_queue, "Rewinding!", 0, 30); + msg_queue_push(g_extern.msg_queue, "Rewinding!", 0, g_extern.is_paused ? 1 : 30); psnes_unserialize(buf, psnes_serialize_size()); if (g_extern.bsv_movie)