diff --git a/Core/AsciiTurboFile.h b/Core/AsciiTurboFile.h index 776642eb..664fc551 100644 --- a/Core/AsciiTurboFile.h +++ b/Core/AsciiTurboFile.h @@ -26,7 +26,7 @@ protected: public: AsciiTurboFile(shared_ptr console) : BaseControlDevice(console, BaseControlDevice::ExpDevicePort) { - BatteryManager::LoadBattery(".tf", _data, AsciiTurboFile::FileSize); + _console->GetBatteryManager()->LoadBattery(".tf", _data, AsciiTurboFile::FileSize); } ~AsciiTurboFile() @@ -36,7 +36,7 @@ public: void SaveBattery() override { - BatteryManager::SaveBattery(".tf", _data, AsciiTurboFile::FileSize); + _console->GetBatteryManager()->SaveBattery(".tf", _data, AsciiTurboFile::FileSize); } uint8_t ReadRAM(uint16_t addr) override diff --git a/Core/BaseMapper.cpp b/Core/BaseMapper.cpp index a4270090..540bcb49 100644 --- a/Core/BaseMapper.cpp +++ b/Core/BaseMapper.cpp @@ -353,22 +353,22 @@ bool BaseMapper::HasBattery() void BaseMapper::LoadBattery() { if(HasBattery() && _saveRamSize > 0) { - BatteryManager::LoadBattery(".sav", _saveRam, _saveRamSize); + _console->GetBatteryManager()->LoadBattery(".sav", _saveRam, _saveRamSize); } if(_hasChrBattery && _chrRamSize > 0) { - BatteryManager::LoadBattery(".sav.chr", _chrRam, _chrRamSize); + _console->GetBatteryManager()->LoadBattery(".sav.chr", _chrRam, _chrRamSize); } } void BaseMapper::SaveBattery() { if(HasBattery() && _saveRamSize > 0) { - BatteryManager::SaveBattery(".sav", _saveRam, _saveRamSize); + _console->GetBatteryManager()->SaveBattery(".sav", _saveRam, _saveRamSize); } if(_hasChrBattery && _chrRamSize > 0) { - BatteryManager::SaveBattery(".sav.chr", _chrRam, _chrRamSize); + _console->GetBatteryManager()->SaveBattery(".sav.chr", _chrRam, _chrRamSize); } } diff --git a/Core/BatteryManager.cpp b/Core/BatteryManager.cpp index a4791a2d..9908f07a 100644 --- a/Core/BatteryManager.cpp +++ b/Core/BatteryManager.cpp @@ -3,14 +3,10 @@ #include "VirtualFile.h" #include "../Utilities/FolderUtilities.h" -string BatteryManager::_romName; -bool BatteryManager::_saveEnabled = true; -std::weak_ptr BatteryManager::_recorder; -std::weak_ptr BatteryManager::_provider; - void BatteryManager::Initialize(string romName) { _romName = romName; + _saveEnabled = true; } string BatteryManager::GetBasePath() diff --git a/Core/BatteryManager.h b/Core/BatteryManager.h index 7aa98014..1142e476 100644 --- a/Core/BatteryManager.h +++ b/Core/BatteryManager.h @@ -16,25 +16,23 @@ public: class BatteryManager { private: - static string _romName; - static bool _saveEnabled; - static string GetBasePath(); + string _romName; + bool _saveEnabled; + string GetBasePath(); - static std::weak_ptr _provider; - static std::weak_ptr _recorder; - - BatteryManager() = delete; + std::weak_ptr _provider; + std::weak_ptr _recorder; public: - static void Initialize(string romName); + void Initialize(string romName); - static void SetSaveEnabled(bool enabled); + void SetSaveEnabled(bool enabled); - static void SetBatteryProvider(shared_ptr provider); - static void SetBatteryRecorder(shared_ptr recorder); + void SetBatteryProvider(shared_ptr provider); + void SetBatteryRecorder(shared_ptr recorder); - static void SaveBattery(string extension, uint8_t* data, uint32_t length); + void SaveBattery(string extension, uint8_t* data, uint32_t length); - static vector LoadBattery(string extension); - static void LoadBattery(string extension, uint8_t* data, uint32_t length); + vector LoadBattery(string extension); + void LoadBattery(string extension, uint8_t* data, uint32_t length); }; \ No newline at end of file diff --git a/Core/BattleBox.h b/Core/BattleBox.h index 3622c60b..77fc1a20 100644 --- a/Core/BattleBox.h +++ b/Core/BattleBox.h @@ -33,7 +33,7 @@ protected: public: BattleBox(shared_ptr console) : BaseControlDevice(console, BaseControlDevice::ExpDevicePort) { - BatteryManager::LoadBattery(".bb", (uint8_t*)_data, BattleBox::FileSize); + _console->GetBatteryManager()->LoadBattery(".bb", (uint8_t*)_data, BattleBox::FileSize); } ~BattleBox() @@ -43,7 +43,7 @@ public: void SaveBattery() override { - BatteryManager::SaveBattery(".bb", (uint8_t*)_data, BattleBox::FileSize); + _console->GetBatteryManager()->SaveBattery(".bb", (uint8_t*)_data, BattleBox::FileSize); } uint8_t ReadRAM(uint16_t addr) override diff --git a/Core/Console.cpp b/Core/Console.cpp index 005cce86..4cb409fd 100644 --- a/Core/Console.cpp +++ b/Core/Console.cpp @@ -74,6 +74,7 @@ Console::~Console() void Console::Init() { _notificationManager.reset(new NotificationManager()); + _batteryManager.reset(new BatteryManager()); _videoRenderer.reset(new VideoRenderer(shared_from_this())); _videoDecoder.reset(new VideoDecoder(shared_from_this())); @@ -135,6 +136,11 @@ void Console::Release(bool forShutdown) _controlManager.reset(); } +shared_ptr Console::GetBatteryManager() +{ + return _batteryManager; +} + shared_ptr Console::GetSaveStateManager() { return _saveStateManager; @@ -264,7 +270,7 @@ bool Console::Initialize(VirtualFile &romFile, VirtualFile &patchFile) vector fileData; romFile.ReadFile(fileData); - BatteryManager::Initialize(FolderUtilities::GetFilename(romFile.GetFileName(), false)); + _batteryManager->Initialize(FolderUtilities::GetFilename(romFile.GetFileName(), false)); shared_ptr mapper = MapperFactory::InitializeFromFile(shared_from_this(), romFile.GetFileName(), fileData); if(mapper) { _soundMixer->StopAudio(true); @@ -324,7 +330,7 @@ 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); + _batteryManager->SetSaveEnabled(false); uint32_t pollCounter = 0; if(_controlManager && !isDifferentGame) { @@ -341,7 +347,7 @@ bool Console::Initialize(VirtualFile &romFile, VirtualFile &patchFile) _controlManager->UpdateControlDevices(); //Re-enable battery saves - BatteryManager::SetSaveEnabled(true); + _batteryManager->SetSaveEnabled(true); if(_hdData && (!_hdData->Tiles.empty() || !_hdData->Backgrounds.empty())) { _ppu.reset(new HdPpu(shared_from_this(), _hdData.get())); @@ -415,7 +421,7 @@ bool Console::Initialize(VirtualFile &romFile, VirtualFile &patchFile) } //Reset battery source to current game if new game failed to load - BatteryManager::Initialize(FolderUtilities::GetFilename(GetRomInfo().RomName, false)); + _batteryManager->Initialize(FolderUtilities::GetFilename(GetRomInfo().RomName, false)); if(_mapper) { _videoDecoder->StartThread(); } @@ -1275,6 +1281,8 @@ void Console::CopyRewindData(shared_ptr sourceConsole) sourceConsole->Pause(); Pause(); + //Disable battery saving for this instance + _batteryManager->SetSaveEnabled(false); _historyViewer.reset(new HistoryViewer(shared_from_this())); sourceConsole->_rewindManager->CopyHistory(_historyViewer); diff --git a/Core/Console.h b/Core/Console.h index 61e0f53b..8e81b23c 100644 --- a/Core/Console.h +++ b/Core/Console.h @@ -27,6 +27,7 @@ class SoundMixer; class NotificationManager; class Debugger; class EmulationSettings; +class BatteryManager; struct HdPackData; struct HashInfo; @@ -61,7 +62,8 @@ private: //Used by VS-DualSystem shared_ptr _master; shared_ptr _slave; - + + shared_ptr _batteryManager; shared_ptr _systemActionManager; shared_ptr _videoDecoder; @@ -106,6 +108,7 @@ public: void Init(); void Release(bool forShutdown); + shared_ptr GetBatteryManager(); shared_ptr GetSaveStateManager(); shared_ptr GetVideoDecoder(); shared_ptr GetVideoRenderer(); diff --git a/Core/FDS.cpp b/Core/FDS.cpp index 64c36494..d79b1d0b 100644 --- a/Core/FDS.cpp +++ b/Core/FDS.cpp @@ -31,7 +31,7 @@ void FDS::InitMapper(RomData &romData) _fdsRawData = romData.RawData; //Apply save data (saved as an IPS file), if found - vector ipsData = BatteryManager::LoadBattery(".ips"); + vector ipsData = _console->GetBatteryManager()->LoadBattery(".ips"); LoadDiskData(ipsData); } @@ -60,7 +60,7 @@ vector FDS::CreateIpsPatch() void FDS::SaveBattery() { vector ipsData = CreateIpsPatch(); - BatteryManager::SaveBattery(".ips", ipsData.data(), (uint32_t)ipsData.size()); + _console->GetBatteryManager()->SaveBattery(".ips", ipsData.data(), (uint32_t)ipsData.size()); } void FDS::Reset(bool softReset) diff --git a/Core/MesenMovie.cpp b/Core/MesenMovie.cpp index c7366da0..33ffecbd 100644 --- a/Core/MesenMovie.cpp +++ b/Core/MesenMovie.cpp @@ -112,7 +112,7 @@ bool MesenMovie::Play(VirtualFile &file) _console->Pause(); - BatteryManager::SetBatteryProvider(shared_from_this()); + _console->GetBatteryManager()->SetBatteryProvider(shared_from_this()); _console->GetNotificationManager()->RegisterNotificationListener(shared_from_this()); ApplySettings(); diff --git a/Core/MovieRecorder.cpp b/Core/MovieRecorder.cpp index 55d24230..180267ea 100644 --- a/Core/MovieRecorder.cpp +++ b/Core/MovieRecorder.cpp @@ -40,12 +40,12 @@ bool MovieRecorder::Record(RecordMovieOptions options) _console->Pause(); if(options.RecordFrom == RecordMovieFrom::StartWithoutSaveData) { - BatteryManager::SetBatteryProvider(shared_from_this()); + _console->GetBatteryManager()->SetBatteryProvider(shared_from_this()); } //Save existing battery files if(options.RecordFrom == RecordMovieFrom::StartWithSaveData) { - BatteryManager::SetBatteryRecorder(shared_from_this()); + _console->GetBatteryManager()->SetBatteryRecorder(shared_from_this()); } _console->GetNotificationManager()->RegisterNotificationListener(shared_from_this()); @@ -56,7 +56,7 @@ bool MovieRecorder::Record(RecordMovieOptions options) } else { _console->PowerCycle(); } - BatteryManager::SetBatteryRecorder(nullptr); + _console->GetBatteryManager()->SetBatteryRecorder(nullptr); _console->Resume(); MessageManager::DisplayMessage("Movies", "MovieRecordingTo", FolderUtilities::GetFilename(_filename, true)); @@ -238,7 +238,8 @@ bool MovieRecorder::CreateMovie(string movieFile, std::deque &data, if(startPosition < data.size() && endPosition <= data.size() && _writer->Initialize(_filename)) { vector> devices = _console->GetControlManager()->GetControlDevices(); - if(startPosition > 0) { + if(startPosition > 0 || _console->GetRomInfo().HasBattery) { + //Create a movie from a savestate if we don't start from the beginning (or if the game has save ram) _hasSaveState = true; _saveStateData = stringstream(); _console->GetSaveStateManager()->GetSaveStateHeader(_saveStateData);