Movies: Fixed regressions (due to refactoring) - PollCounter + bk2/fm2 playback

This commit is contained in:
Sour 2018-07-02 18:46:02 -04:00
parent 2504fe0b71
commit 97270f2b2e
7 changed files with 35 additions and 15 deletions

View file

@ -5,7 +5,8 @@
#include "VsSystemActionManager.h"
#include "BizhawkMovie.h"
#include "VsControlManager.h"
#include "FDS.h"
#include "Console.h"
#include "NotificationManager.h"
BizhawkMovie::BizhawkMovie(shared_ptr<Console> console)
{
@ -97,7 +98,7 @@ bool BizhawkMovie::InitializeGameData(ZipReader &reader)
return false;
}
_console->GetControlManager()->ResetPollCounter();
_console->GetControlManager()->SetPollCounter(0);
while(!fileData.eof()) {
string line;
@ -187,13 +188,12 @@ bool BizhawkMovie::Play(VirtualFile &file)
file.ReadFile(ss);
reader.LoadArchive(ss);
_console->GetControlManager()->RegisterInputProvider(this);
_console->GetNotificationManager()->RegisterNotificationListener(shared_from_this());
EmulationSettings::SetRamPowerOnState(RamPowerOnState::AllOnes);
if(InitializeInputData(reader) && InitializeGameData(reader)) {
//NesHawk initializes memory to 1s
EmulationSettings::SetRamPowerOnState(RamPowerOnState::AllOnes);
_isPlaying = true;
} else {
_console->GetControlManager()->UnregisterInputProvider(this);
}
_console->Resume();
return _isPlaying;
@ -203,3 +203,10 @@ bool BizhawkMovie::IsPlaying()
{
return _isPlaying;
}
void BizhawkMovie::ProcessNotification(ConsoleNotificationType type, void* parameter)
{
if(type == ConsoleNotificationType::GameLoaded) {
_console->GetControlManager()->RegisterInputProvider(this);
}
}

View file

@ -2,11 +2,12 @@
#include "stdafx.h"
#include "MovieManager.h"
#include "../Utilities/ZipReader.h"
#include "INotificationListener.h"
class VirtualFile;
class Console;
class BizhawkMovie : public IMovie
class BizhawkMovie : public IMovie, public INotificationListener, public std::enable_shared_from_this<BizhawkMovie>
{
private:
bool InitializeGameData(ZipReader &reader);
@ -28,4 +29,7 @@ public:
bool SetInput(BaseControlDevice *device) override;
bool Play(VirtualFile &file) override;
bool IsPlaying() override;
// Inherited via INotificationListener
virtual void ProcessNotification(ConsoleNotificationType type, void * parameter) override;
};

View file

@ -279,12 +279,20 @@ bool Console::Initialize(VirtualFile &romFile, VirtualFile &patchFile)
//Temporarely disable battery saves to prevent battery files from being created for the wrong game (for Battle Box & Turbo File)
BatteryManager::SetSaveEnabled(false);
uint32_t pollCounter = 0;
if(_controlManager && !isDifferentGame) {
//When power cycling, poll counter must be preserved to allow movies to playback properly
pollCounter = _controlManager->GetPollCounter();
}
if(system == GameSystem::VsUniSystem) {
_controlManager.reset(new VsControlManager(shared_from_this(), _systemActionManager, _mapper->GetMapperControlDevice()));
} else {
_controlManager.reset(new ControlManager(shared_from_this(), _systemActionManager, _mapper->GetMapperControlDevice()));
}
_controlManager->SetPollCounter(pollCounter);
_controlManager->UpdateControlDevices();
//Re-enable battery saves
BatteryManager::SetSaveEnabled(true);

View file

@ -305,9 +305,9 @@ uint32_t ControlManager::GetPollCounter()
return ControlManager::_pollCounter;
}
void ControlManager::ResetPollCounter()
void ControlManager::SetPollCounter(uint32_t value)
{
_pollCounter = 0;
_pollCounter = value;
}
uint8_t ControlManager::ReadRAM(uint16_t addr)

View file

@ -54,7 +54,7 @@ public:
void ResetLagCounter();
uint32_t GetPollCounter();
void ResetPollCounter();
void SetPollCounter(uint32_t value);
virtual void Reset(bool softReset);

View file

@ -6,6 +6,7 @@
#include "ControlManager.h"
#include "FceuxMovie.h"
#include "Console.h"
#include "NotificationManager.h"
bool FceuxMovie::InitializeData(stringstream &filestream)
{
@ -16,7 +17,7 @@ bool FceuxMovie::InitializeData(stringstream &filestream)
_dataByFrame[2].push_back("");
_dataByFrame[3].push_back("");
_console->GetControlManager()->ResetPollCounter();
_console->GetControlManager()->SetPollCounter(0);
while(!filestream.eof()) {
string line;
@ -25,6 +26,7 @@ bool FceuxMovie::InitializeData(stringstream &filestream)
vector<uint8_t> md5array = Base64::Decode(line.substr(19, line.size() - 20));
HashInfo hashInfo;
hashInfo.PrgChrMd5Hash = HexUtilities::ToHex(md5array);
EmulationSettings::SetRamPowerOnState(RamPowerOnState::AllZeros);
if(_console->LoadMatchingRom("", hashInfo)) {
result = true;
} else {
@ -65,9 +67,8 @@ bool FceuxMovie::Play(VirtualFile &file)
std::stringstream ss;
file.ReadFile(ss);
_console->GetNotificationManager()->RegisterNotificationListener(shared_from_this());
if(InitializeData(ss)) {
EmulationSettings::SetRamPowerOnState(RamPowerOnState::AllZeros);
_console->GetControlManager()->RegisterInputProvider(this);
_console->Reset(false);
_isPlaying = true;
}

View file

@ -112,7 +112,7 @@ bool MesenMovie::Play(VirtualFile &file)
//Disable auto-configure input option (otherwise the movie file's input types are ignored)
bool autoConfigureInput = EmulationSettings::CheckFlag(EmulationFlags::AutoConfigureInput);
EmulationSettings::ClearFlags(EmulationFlags::AutoConfigureInput);
_console->GetControlManager()->ResetPollCounter();
_console->GetControlManager()->SetPollCounter(0);
bool gameLoaded = LoadGame();
EmulationSettings::SetFlagState(EmulationFlags::AutoConfigureInput, autoConfigureInput);
@ -127,7 +127,7 @@ bool MesenMovie::Play(VirtualFile &file)
_console->Resume();
return false;
} else {
_console->GetControlManager()->ResetPollCounter();
_console->GetControlManager()->SetPollCounter(0);
}
}