Rewind: Ensure original speed is restored when rewind stops

This commit is contained in:
Souryo 2017-05-19 18:27:39 -04:00
parent 1ff6747e63
commit cd79022f60
8 changed files with 34 additions and 25 deletions

View file

@ -108,7 +108,7 @@ void AutomaticRomTest::ProcessNotification(ConsoleNotificationType type, void* p
int32_t AutomaticRomTest::Run(string filename) int32_t AutomaticRomTest::Run(string filename)
{ {
EmulationSettings::SetEmulationSpeed(0); EmulationSettings::SetFlags(EmulationFlags::ForceMaxSpeed);
EmulationSettings::SetMasterVolume(0); EmulationSettings::SetMasterVolume(0);
Console::Pause(); Console::Pause();
if(Console::LoadROM(filename)) { if(Console::LoadROM(filename)) {
@ -123,7 +123,7 @@ int32_t AutomaticRomTest::Run(string filename)
_errorCode |= 0x10; _errorCode |= 0x10;
} }
EmulationSettings::SetEmulationSpeed(100); EmulationSettings::ClearFlags(EmulationFlags::ForceMaxSpeed);
EmulationSettings::SetMasterVolume(1.0); EmulationSettings::SetMasterVolume(1.0);
Console::GetInstance()->Stop(); Console::GetInstance()->Stop();

View file

@ -113,4 +113,19 @@ void EmulationSettings::SetRewindBufferSize(uint32_t seconds)
Console::Resume(); Console::Resume();
} }
_rewindBufferSize = seconds; _rewindBufferSize = seconds;
}
uint32_t EmulationSettings::GetEmulationSpeed(bool ignoreTurbo)
{
if(ignoreTurbo) {
return _emulationSpeed;
} else if(CheckFlag(EmulationFlags::ForceMaxSpeed)) {
return 0;
} else if(CheckFlag(EmulationFlags::Turbo)) {
return _turboSpeed;
} else if(RewindManager::IsRewinding()) {
return _rewindSpeed;
} else {
return _emulationSpeed;
}
} }

View file

@ -57,6 +57,8 @@ enum EmulationFlags : uint64_t
DisplayMovieIcons = 0x10000000000, DisplayMovieIcons = 0x10000000000,
HidePauseOverlay = 0x20000000000, HidePauseOverlay = 0x20000000000,
ForceMaxSpeed = 0x40000000000,
ConsoleMode = 0x8000000000000000, ConsoleMode = 0x8000000000000000,
}; };
@ -672,10 +674,7 @@ public:
return _rewindBufferSize; return _rewindBufferSize;
} }
static uint32_t GetEmulationSpeed(bool ignoreTurbo = false) static uint32_t GetEmulationSpeed(bool ignoreTurbo = false);
{
return (CheckFlag(EmulationFlags::Turbo) && !ignoreTurbo) ? _turboSpeed : _emulationSpeed;
}
static void UpdateEffectiveOverclockRate() static void UpdateEffectiveOverclockRate()
{ {

View file

@ -135,13 +135,11 @@ void FDS::ProcessCpuClock()
} }
if(EmulationSettings::CheckFlag(EmulationFlags::FdsFastForwardOnLoad)) { if(EmulationSettings::CheckFlag(EmulationFlags::FdsFastForwardOnLoad)) {
bool enableFastforward = (_scanningDisk || _gameStarted < 2); if(_scanningDisk || _gameStarted < 2) {
uint32_t emulationSpeed = EmulationSettings::GetEmulationSpeed(true); EmulationSettings::SetFlags(EmulationFlags::ForceMaxSpeed);
if(emulationSpeed > 0 || !_fastForwarding) { } else {
_previousSpeed = emulationSpeed; EmulationSettings::ClearFlags(EmulationFlags::ForceMaxSpeed);
} }
EmulationSettings::SetEmulationSpeed(enableFastforward ? 0 : _previousSpeed);
_fastForwarding = enableFastforward;
} }
ClockIrq(); ClockIrq();
@ -412,9 +410,7 @@ FDS::FDS()
FDS::~FDS() FDS::~FDS()
{ {
//Restore emulation speed to normal when closing //Restore emulation speed to normal when closing
if(_previousSpeed >= 0) { EmulationSettings::ClearFlags(EmulationFlags::ForceMaxSpeed);
EmulationSettings::SetEmulationSpeed(_previousSpeed);
}
if(_isDirty) { if(_isDirty) {
FdsLoader loader; FdsLoader loader;

View file

@ -71,8 +71,6 @@ private:
string _romFilepath; string _romFilepath;
uint8_t _gameStarted = 0; uint8_t _gameStarted = 0;
int32_t _previousSpeed = -1;
bool _fastForwarding = false;
protected: protected:
virtual uint16_t GetPRGPageSize() override { return 0x2000; } virtual uint16_t GetPRGPageSize() override { return 0x2000; }

View file

@ -166,8 +166,9 @@ uint8_t GameClientConnection::GetControllerState(uint8_t port)
if(_inputData[port].size() > _minimumQueueSize) { if(_inputData[port].size() > _minimumQueueSize) {
//Too much data, catch up //Too much data, catch up
EmulationSettings::SetEmulationSpeed(0); EmulationSettings::SetFlags(EmulationFlags::ForceMaxSpeed);
} else { } else {
EmulationSettings::ClearFlags(EmulationFlags::ForceMaxSpeed);
EmulationSettings::SetEmulationSpeed(100); EmulationSettings::SetEmulationSpeed(100);
} }
return state; return state;

View file

@ -210,7 +210,7 @@ int32_t RecordedRomTest::Run(string filename)
return false; return false;
} }
EmulationSettings::SetEmulationSpeed(0); EmulationSettings::SetFlags(EmulationFlags::ForceMaxSpeed);
EmulationSettings::SetMasterVolume(0); EmulationSettings::SetMasterVolume(0);
Console::Pause(); Console::Pause();
@ -247,7 +247,7 @@ int32_t RecordedRomTest::Run(string filename)
Console::GetInstance()->Stop(); Console::GetInstance()->Stop();
EmulationSettings::SetEmulationSpeed(100); EmulationSettings::ClearFlags(EmulationFlags::ForceMaxSpeed);
EmulationSettings::SetMasterVolume(1.0); EmulationSettings::SetMasterVolume(1.0);
return _badFrameCount; return _badFrameCount;

View file

@ -60,7 +60,7 @@ void RewindManager::ProcessNotification(ConsoleNotificationType type, void * par
} }
_historyBackup.clear(); _historyBackup.clear();
_rewindState = RewindState::Stopped; _rewindState = RewindState::Stopped;
EmulationSettings::SetEmulationSpeed(100); EmulationSettings::ClearFlags(EmulationFlags::ForceMaxSpeed);
} }
} else { } else {
_currentHistory.FrameCount++; _currentHistory.FrameCount++;
@ -116,7 +116,7 @@ void RewindManager::Start()
PopHistory(); PopHistory();
SoundMixer::StopAudio(true); SoundMixer::StopAudio(true);
EmulationSettings::SetEmulationSpeed(0); EmulationSettings::SetFlags(EmulationFlags::ForceMaxSpeed);
Console::Resume(); Console::Resume();
} }
@ -154,11 +154,11 @@ void RewindManager::Stop()
if(_framesToFastForward > 0) { if(_framesToFastForward > 0) {
_rewindState = RewindState::Stopping; _rewindState = RewindState::Stopping;
_currentHistory.FrameCount = 0; _currentHistory.FrameCount = 0;
EmulationSettings::SetEmulationSpeed(0); EmulationSettings::SetFlags(EmulationFlags::ForceMaxSpeed);
} else { } else {
_rewindState = RewindState::Stopped; _rewindState = RewindState::Stopped;
_historyBackup.clear(); _historyBackup.clear();
EmulationSettings::SetEmulationSpeed(100); EmulationSettings::ClearFlags(EmulationFlags::ForceMaxSpeed);
} }
_videoHistoryBuilder.clear(); _videoHistoryBuilder.clear();
@ -195,7 +195,7 @@ void RewindManager::ProcessFrame(void * frameBuffer, uint32_t width, uint32_t he
if(_rewindState == RewindState::Started || _videoHistory.size() >= RewindManager::BufferSize) { if(_rewindState == RewindState::Started || _videoHistory.size() >= RewindManager::BufferSize) {
_rewindState = RewindState::Started; _rewindState = RewindState::Started;
EmulationSettings::SetEmulationSpeed(EmulationSettings::GetRewindSpeed()); EmulationSettings::ClearFlags(EmulationFlags::ForceMaxSpeed);
if(!_videoHistory.empty()) { if(!_videoHistory.empty()) {
VideoRenderer::GetInstance()->UpdateFrame(_videoHistory.back().data(), width, height); VideoRenderer::GetInstance()->UpdateFrame(_videoHistory.back().data(), width, height);
_videoHistory.pop_back(); _videoHistory.pop_back();