From e0f9754e80109a093dc061c490dd6a055a1d599d Mon Sep 17 00:00:00 2001 From: mjbudd77 Date: Tue, 5 Oct 2021 06:49:16 -0400 Subject: [PATCH] For Qt GUI, implemented a new method of timing frame advance hold delay so that the delay time is more constant with changing emulation speed. --- src/drivers/Qt/ConsoleWindow.cpp | 5 +++++ src/drivers/Qt/ConsoleWindow.h | 2 ++ src/drivers/Qt/input.cpp | 7 +++++++ src/fceu.cpp | 13 +++++++------ 4 files changed, 21 insertions(+), 6 deletions(-) diff --git a/src/drivers/Qt/ConsoleWindow.cpp b/src/drivers/Qt/ConsoleWindow.cpp index db7016c5..79ecfc76 100644 --- a/src/drivers/Qt/ConsoleWindow.cpp +++ b/src/drivers/Qt/ConsoleWindow.cpp @@ -4162,6 +4162,11 @@ void consoleWin_t::loadMostRecentROM(void) fceuWrapperUnLock(); } +int consoleWin_t::getPeriodicInterval(void) +{ + return gameTimer->interval(); +} + void consoleWin_t::transferVideoBuffer(void) { if ( nes_shm->blitUpdated ) diff --git a/src/drivers/Qt/ConsoleWindow.h b/src/drivers/Qt/ConsoleWindow.h index b1829d70..8bbe3391 100644 --- a/src/drivers/Qt/ConsoleWindow.h +++ b/src/drivers/Qt/ConsoleWindow.h @@ -175,6 +175,8 @@ class consoleWin_t : public QMainWindow void OpenHelpWindow(std::string subpage = ""); + int getPeriodicInterval(void); + protected: consoleMenuBar *menubar; diff --git a/src/drivers/Qt/input.cpp b/src/drivers/Qt/input.cpp index 2ee910a6..2be5dec0 100644 --- a/src/drivers/Qt/input.cpp +++ b/src/drivers/Qt/input.cpp @@ -52,6 +52,7 @@ int NoWaiting = 0; extern Config *g_config; extern bool bindSavestate, frameAdvanceLagSkip, lagCounterDisplay; +unsigned int frameAdvHoldTimer = 0; /* UsrInputType[] is user-specified. CurInputType[] is current (game loading can override user settings) @@ -989,10 +990,15 @@ static void KeyboardCommands(void) { if (frameAdvancing == false) { + frameAdvHoldTimer = 0; FCEUI_FrameAdvance(); frameAdvancing = true; //printf("Frame Advance Start\n"); } + if ( consoleWindow ) + { + frameAdvHoldTimer += consoleWindow->getPeriodicInterval(); + } } else { @@ -1000,6 +1006,7 @@ static void KeyboardCommands(void) { FCEUI_FrameAdvanceEnd(); frameAdvancing = false; + frameAdvHoldTimer = 0; //printf("Frame Advance End\n"); } } diff --git a/src/fceu.cpp b/src/fceu.cpp index f3677f95..80498b4a 100644 --- a/src/fceu.cpp +++ b/src/fceu.cpp @@ -717,8 +717,7 @@ void UpdateAutosave(void); #ifdef __QT_DRIVER__ -double getFrameRate(void); -double getBaseFrameRate(void); +extern unsigned int frameAdvHoldTimer; #endif ///Emulates a single frame. @@ -733,18 +732,20 @@ void FCEUI_Emulate(uint8 **pXBuf, int32 **SoundBuf, int32 *SoundBufSize, int ski if (frameAdvanceRequested) { #ifdef __QT_DRIVER__ - double baseFrameRatio = getFrameRate() / getBaseFrameRate(); - - int32_t frameAdvanceDelayScaled = (int32_t)( (double)frameAdvance_Delay * baseFrameRatio); + uint32_t frameAdvanceDelayScaled = frameAdvance_Delay * (PAL ? 20 : 16); if ( frameAdvanceDelayScaled < 1 ) { frameAdvanceDelayScaled = 1; } - if (frameAdvance_Delay_count == 0 || frameAdvance_Delay_count >= frameAdvanceDelayScaled) + if ( (frameAdvance_Delay_count == 0) || (frameAdvHoldTimer >= frameAdvanceDelayScaled) ) + { EmulationPaused = EMULATIONPAUSED_FA; + } if (frameAdvance_Delay_count < frameAdvanceDelayScaled) + { frameAdvance_Delay_count++; + } #else if (frameAdvance_Delay_count == 0 || frameAdvance_Delay_count >= frameAdvance_Delay) EmulationPaused = EMULATIONPAUSED_FA;