diff --git a/Source/Core/Common/Src/Setup.h b/Source/Core/Common/Src/Setup.h deleted file mode 100644 index c0faec3059..0000000000 --- a/Source/Core/Common/Src/Setup.h +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright (C) 2003 Dolphin Project. - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 2.0. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License 2.0 for more details. - -// A copy of the GPL 2.0 should have been included with the program. -// If not, see http://www.gnu.org/licenses/ - -// Official SVN repository and contact information can be found at -// http://code.google.com/p/dolphin-emu/ - -#ifndef _SETUP_H_ -#define _SETUP_H_ - -// ----------------------------------------------------------------------------------------------------- -// File description: -// Compilation settings. I avoid placing this in Common.h or some place where lots of files needs -// to be rebuilt if any of these settings are changed. I'd rather have it in as few files as possible. -// This file can be kept on the ignore list in your SVN program. It allows local optional settings -// depending on what works on your computer. -// ----------------------------------------------------------------------------------------------------- - -// ----------------------------------------------------------------------------------------------------- -// Settings: - -// This may remove sound artifacts in Wario Land Shake It and perhaps other games -//#define SETUP_AVOID_SOUND_ARTIFACTS - -// Build with playback rerecording options -//#define RERECORDING - -// ----------------------------------------------------------------------------------------------------- - -#endif // _SETUP_H_ - diff --git a/Source/Core/Common/Src/Thread.cpp b/Source/Core/Common/Src/Thread.cpp index ce91aac651..73f83c204f 100644 --- a/Source/Core/Common/Src/Thread.cpp +++ b/Source/Core/Common/Src/Thread.cpp @@ -15,7 +15,6 @@ // Official SVN repository and contact information can be found at // http://code.google.com/p/dolphin-emu/ -#include "Setup.h" #include "Thread.h" #include "Common.h" diff --git a/Source/Core/Common/Src/Timer.cpp b/Source/Core/Common/Src/Timer.cpp index 087f8fcead..b1beed2066 100644 --- a/Source/Core/Common/Src/Timer.cpp +++ b/Source/Core/Common/Src/Timer.cpp @@ -97,12 +97,6 @@ void Timer::AddTimeDifference() m_StartTime += GetTimeDifference(); } -// Wind back the starting time to a custom time -void Timer::WindBackStartingTime(u64 WindBack) -{ - m_StartTime += WindBack; -} - // Get the time elapsed since the Start() u64 Timer::GetTimeElapsed() { diff --git a/Source/Core/Common/Src/Timer.h b/Source/Core/Common/Src/Timer.h index a638920409..152d4c60e6 100644 --- a/Source/Core/Common/Src/Timer.h +++ b/Source/Core/Common/Src/Timer.h @@ -35,7 +35,6 @@ public: // The time difference is always returned in milliseconds, regardless of alternative internal representation u64 GetTimeDifference(); void AddTimeDifference(); - void WindBackStartingTime(u64 WindBack); static void IncreaseResolution(); static void RestoreResolution(); diff --git a/Source/Core/Core/CMakeLists.txt b/Source/Core/Core/CMakeLists.txt index 734d966781..d11c4a350a 100644 --- a/Source/Core/Core/CMakeLists.txt +++ b/Source/Core/Core/CMakeLists.txt @@ -5,7 +5,6 @@ set(SRCS Src/ActionReplay.cpp Src/Console.cpp Src/Core.cpp Src/CoreParameter.cpp - Src/CoreRerecording.cpp Src/CoreTiming.cpp Src/DSPEmulator.cpp Src/GeckoCodeConfig.cpp diff --git a/Source/Core/Core/Core.vcxproj b/Source/Core/Core/Core.vcxproj index e03d40e43a..c39d61c6f2 100644 --- a/Source/Core/Core/Core.vcxproj +++ b/Source/Core/Core/Core.vcxproj @@ -207,7 +207,6 @@ - @@ -385,7 +384,11 @@ - + + false + false + false + Create Create diff --git a/Source/Core/Core/Src/Core.cpp b/Source/Core/Core/Src/Core.cpp index d3c9fb7033..e92b9088bc 100644 --- a/Source/Core/Core/Src/Core.cpp +++ b/Source/Core/Core/Src/Core.cpp @@ -18,9 +18,9 @@ #ifdef _WIN32 #include +#include "EmuWindow.h" #endif -#include "Setup.h" // Common #include "Atomic.h" #include "Thread.h" #include "Timer.h" @@ -61,9 +61,6 @@ #include "VideoBackendBase.h" #include "AudioCommon.h" #include "OnScreenDisplay.h" -#ifdef _WIN32 -#include "EmuWindow.h" -#endif #include "VolumeHandler.h" #include "FileMonitor.h" @@ -293,7 +290,7 @@ void Stop() // - Hammertime! SConfig::GetInstance().m_SYSCONF->Reload(); INFO_LOG(CONSOLE, "Stop [Main Thread]\t\t---- Shutdown complete ----"); - Movie::g_currentInputCount = 0; + Movie::Shutdown(); g_bStopping = false; } diff --git a/Source/Core/Core/Src/Core.h b/Source/Core/Core/Src/Core.h index 448bd55bb6..312c446744 100644 --- a/Source/Core/Core/Src/Core.h +++ b/Source/Core/Core/Src/Core.h @@ -95,21 +95,6 @@ void RequestRefreshInfo(); // the return value of the first call should be passed in as the second argument of the second call. bool PauseAndLock(bool doLock, bool unpauseOnUnlock=true); -#ifdef RERECORDING - -void FrameUpdate(); -void FrameAdvance(); -void FrameStepOnOff(); -void WriteStatus(); -void RerecordingStart(); -void RerecordingStop(); -void WindBack(int Counter); - -extern int g_FrameCounter,g_InputCounter; -extern bool g_FrameStep; - -#endif - } // namespace #endif diff --git a/Source/Core/Core/Src/CoreRerecording.cpp b/Source/Core/Core/Src/CoreRerecording.cpp deleted file mode 100644 index 3064ed37ad..0000000000 --- a/Source/Core/Core/Src/CoreRerecording.cpp +++ /dev/null @@ -1,248 +0,0 @@ -// Copyright (C) 2003 Dolphin Project. - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 2.0. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License 2.0 for more details. - -// A copy of the GPL 2.0 should have been included with the program. -// If not, see http://www.gnu.org/licenses/ - -// Official SVN repository and contact information can be found at -// http://code.google.com/p/dolphin-emu/ - - -#include "Setup.h" -#ifndef RERECORDING -bool rerecording = false; -#else - -// Include -// -------------- -#ifdef _WIN32 - #include -#endif - -#include "Thread.h" // Common - -#include "Timer.h" -#include "Common.h" - -#include "Console.h" -#include "Core.h" -#include "CPUDetect.h" -#include "CoreTiming.h" -#include "Boot/Boot.h" -#include "PatchEngine.h" - -#include "HW/Memmap.h" -#include "HW/ProcessorInterface.h" -#include "HW/GPFifo.h" -#include "HW/CPU.h" -#include "HW/HW.h" -#include "HW/DSP.h" -#include "HW/GPFifo.h" -#include "HW/AudioInterface.h" -#include "HW/VideoInterface.h" -#include "HW/CommandProcessor.h" -#include "HW/PixelEngine.h" -#include "HW/SystemTimers.h" - -#include "PowerPC/PowerPC.h" - -#include "ConfigManager.h" - -#include "MemTools.h" -#include "Host.h" -#include "LogManager.h" - - - - - -// File description: Rerecording Functions -/* --------------- - -How the timer works: We measure the time between drawn frames, not when the game is paused. So time -should be a fairly comparable measure of the time it took to play the game. However the time it takes -to draw a frame will be lower on a fast computer. Therefore we could perhaps measure time as an -internal game time that is adjusted by the average time it takes to draw a frame. Also if it only takes -ten or twenty milliseconds to draw a frame I'm not certain about how accurate the mmsystem timers are for -such short periods. - -//////////////////////////////////////*/ - - - -namespace Core -{ - - - -// Declarations and definitions -// --------------- -int g_FrameCounter = 0; -bool g_FrameStep = false; -Common::Timer ReRecTimer; - - - - -// Control Run, Pause, Stop and the Timer. -// --------------- - -// Subtract the paused time when we run again -void Run() -{ - ReRecTimer.AddTimeDifference(); -} -// Update the time -void Pause() -{ - ReRecTimer.Update(); -} - -// Start the timer when a game is booted -void RerecordingStart() -{ - g_FrameCounter = 0; - ReRecTimer.Start(); - - // Logging - //DEBUG_LOG(CONSOLE, "RerecordingStart: %i\n", g_FrameCounter); -} - -// Reset the frame counter -void RerecordingStop() -{ - // Write the final time and Stop the timer - ReRecTimer.Stop(); - - // Update status bar - WriteStatus(); -} - -/* Wind back the frame counter when a save state is loaded. Currently we don't know what that means in - time so we just guess that the time is proportional the the number of frames - - Todo: There are many assumptions here: We probably want to replace the time here by the actual time - that we save together with the save state or the input recording for example. And have it adjusted - for full speed playback (whether it's 30 fps or 60 fps or some other speed that the game is natively - capped at). Also the input interrupts do not occur as often as the frame renderings, they occur more - often. So we may want to move the input recording to fram updates, or perhaps sync the input interrupts - to frame updates. - */ -void WindBack(int Counter) -{ - /* Counter should be smaller than g_FrameCounter, however it currently updates faster than the - frames so currently it may not be the same. Therefore I use the abs() function. */ - int AbsoluteFrameDifference = abs(g_FrameCounter - Counter); - float FractionalFrameDifference = (float) AbsoluteFrameDifference / (float) g_FrameCounter; - - // Update the frame counter - g_FrameCounter = Counter; - - // Approximate a time to wind back the clock to - // Get the current time - u64 CurrentTimeMs = ReRecTimer.GetTimeElapsed(); - // Save the current time in seconds in a new double - double CurrentTimeSeconds = (double) (CurrentTimeMs / 1000); - // Reduce it by the same proportion as the counter was wound back - CurrentTimeSeconds = CurrentTimeSeconds * FractionalFrameDifference; - // Update the clock - ReRecTimer.WindBackStartingTime((u64)CurrentTimeSeconds * 1000); - - // Logging - DEBUG_LOG(CONSOLE, "WindBack: %i %u\n", Counter, (u64)CurrentTimeSeconds); -} - - - - -// Frame advance -// --------------- -void FrameAdvance() -{ - // Update status bar - WriteStatus(); - - // If a game is not started, return - if (Core::GetState() == Core::CORE_UNINITIALIZED) return; - - // Play to the next frame - if (g_FrameStep) - { - Run(); - Core::SetState(Core::CORE_RUN); - } -} - -// Turn on frame stepping -void FrameStepOnOff() -{ - /* Turn frame step on or off. If a game is running and we turn this on it means that the game - will pause after the next frame update */ - g_FrameStep = !g_FrameStep; - - // Update status bar - WriteStatus(); - - // If a game is not started, return - if(Core::GetState() == Core::CORE_UNINITIALIZED) return; - - // Run the emulation if we turned off framestepping - if (!g_FrameStep) - { - Run(); - Core::SetState(Core::CORE_RUN); - } -} - - - - -// General functions -// --------------- - -// Write to the status bar -void WriteStatus() -{ - std::string TmpStr = "Time: " + ReRecTimer.GetTimeElapsedFormatted(); - TmpStr += StringFromFormat(" Frame: %s", ThousandSeparate(g_FrameCounter).c_str()); - // The FPS is the total average since the game was booted - TmpStr += StringFromFormat(" FPS: %i", (g_FrameCounter * 1000) / ReRecTimer.GetTimeElapsed()); - TmpStr += StringFromFormat(" FrameStep: %s", g_FrameStep ? "On" : "Off"); - Host_UpdateStatusBar(TmpStr.c_str(), 1); -} - - -// When a new frame is drawn -void FrameUpdate() -{ - // Write to the status bar - WriteStatus(); - /* I don't think the frequent update has any material speed inpact at all, but should it - have you can controls the update speed by changing the "% 10" in this line */ - //if (g_FrameCounter % 10 == 0) WriteStatus(); - - // Pause if frame stepping is on - if(g_FrameStep) - { - Pause(); - Core::SetState(Core::CORE_PAUSE); - } - - // Count one frame - g_FrameCounter++; -} - - - -} // Core - - -#endif // RERECORDING diff --git a/Source/Core/Core/Src/HW/DSPHLE/DSPHLE.cpp b/Source/Core/Core/Src/HW/DSPHLE/DSPHLE.cpp index 66ee4bef84..817610ea0f 100644 --- a/Source/Core/Core/Src/HW/DSPHLE/DSPHLE.cpp +++ b/Source/Core/Core/Src/HW/DSPHLE/DSPHLE.cpp @@ -20,7 +20,6 @@ #include "ChunkFile.h" #include "IniFile.h" #include "HLEMixer.h" -#include "Setup.h" #include "StringUtil.h" #include "LogManager.h" #include "IniFile.h" diff --git a/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_AXWii.cpp b/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_AXWii.cpp index 03b1d3b75b..bc50269037 100644 --- a/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_AXWii.cpp +++ b/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_AXWii.cpp @@ -193,7 +193,8 @@ bool CUCode_AXWii::AXTask(u32& _uMail) case 0x0004: // PBs are here now m_addressPBs = HLEMemory_Read_U32(uAddress); - soundStream->GetMixer()->SetHLEReady(true); + if (soundStream) + soundStream->GetMixer()->SetHLEReady(true); // soundStream->Update(); uAddress += 4; break; diff --git a/Source/Core/Core/Src/HW/SI_DeviceGCController.cpp b/Source/Core/Core/Src/HW/SI_DeviceGCController.cpp index a9b708324d..8e8adf33fd 100644 --- a/Source/Core/Core/Src/HW/SI_DeviceGCController.cpp +++ b/Source/Core/Core/Src/HW/SI_DeviceGCController.cpp @@ -132,13 +132,13 @@ bool CSIDevice_GCController::GetData(u32& _Hi, u32& _Low) if(Movie::IsPlayingInput()) { Movie::PlayController(&PadStatus, ISIDevice::m_iDeviceNumber); - if(!Core::g_CoreStartupParameter.bWii) + if(!Movie::IsUsingWiimote(0)) Movie::InputUpdate(); } else if(Movie::IsRecordingInput()) { Movie::RecordInput(&PadStatus, ISIDevice::m_iDeviceNumber); - if(!Core::g_CoreStartupParameter.bWii) + if(!Movie::IsUsingWiimote(0)) Movie::InputUpdate(); } diff --git a/Source/Core/Core/Src/HW/Wiimote.cpp b/Source/Core/Core/Src/HW/Wiimote.cpp index 30ab7af141..0928deffb1 100644 --- a/Source/Core/Core/Src/HW/Wiimote.cpp +++ b/Source/Core/Core/Src/HW/Wiimote.cpp @@ -136,9 +136,9 @@ void DoState(unsigned char **ptr, int mode) { // TODO: - //PointerWrap p(ptr, mode); - //for (unsigned int i=0; i<4; ++i) - // ((WiimoteEmu::Wiimote*)g_plugin.controllers[i])->DoState(p); + PointerWrap p(ptr, mode); + for (unsigned int i=0; i<4; ++i) + ((WiimoteEmu::Wiimote*)g_plugin.controllers[i])->DoState(p); } // ___________________________________________________________________________ diff --git a/Source/Core/Core/Src/HW/WiimoteEmu/EmuSubroutines.cpp b/Source/Core/Core/Src/HW/WiimoteEmu/EmuSubroutines.cpp index e7036c8fcb..e5ed088b66 100644 --- a/Source/Core/Core/Src/HW/WiimoteEmu/EmuSubroutines.cpp +++ b/Source/Core/Core/Src/HW/WiimoteEmu/EmuSubroutines.cpp @@ -594,13 +594,69 @@ void Wiimote::SendReadDataReply(ReadRequest& _request) void Wiimote::DoState(PointerWrap& p) { - // not working :( - //if (p.MODE_READ == p.GetMode()) - //{ - // // LOAD - // Reset(); // should cause a status report to be sent, then wii should re-setup wiimote - //} - //p.Do(m_reporting_channel); + p.Do(m_extension->active_extension); + p.Do(m_extension->switch_extension); + + p.Do(m_accel); + p.Do(m_index); + p.Do(ir_sin); + p.Do(ir_cos); + p.Do(m_rumble_on); + p.Do(m_speaker_mute); + p.Do(m_motion_plus_present); + p.Do(m_motion_plus_active); + p.Do(m_reporting_auto); + p.Do(m_reporting_mode); + p.Do(m_reporting_channel); + p.Do(m_shake_step); + p.Do(m_sensor_bar_on_top); + p.Do(m_status); + p.Do(m_adpcm_state); + p.Do(m_ext_key); + p.Do(m_eeprom); + p.Do(m_reg_motion_plus); + p.Do(m_reg_ir); + p.Do(m_reg_ext); + p.Do(m_reg_speaker); + + //Do 'm_read_requests' queue + { + u32 size; + if (p.mode == PointerWrap::MODE_READ) + { + //clear + while (m_read_requests.size()) + m_read_requests.pop(); + + p.Do(size); + while (size--) + { + ReadRequest tmp; + p.Do(tmp.address); + p.Do(tmp.position); + p.Do(tmp.size); + tmp.data = new u8[tmp.size]; + p.DoArray(tmp.data, tmp.size); + m_read_requests.push(tmp); + } + } + else + { + std::queue tmp_queue(m_read_requests); + size = m_read_requests.size(); + p.Do(size); + while (!tmp_queue.empty()) + { + ReadRequest tmp = tmp_queue.front(); + p.Do(tmp.address); + p.Do(tmp.position); + p.Do(tmp.size); + p.DoArray(tmp.data, tmp.size); + tmp_queue.pop(); + } + } + } + p.DoMarker("Wiimote"); } } diff --git a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device.h b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device.h index c124bb4448..4eb4a3e554 100644 --- a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device.h +++ b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device.h @@ -62,7 +62,11 @@ public: virtual ~IWII_IPC_HLE_Device() { } - virtual void DoState(PointerWrap& p) { DoStateShared(p); } + virtual void DoState(PointerWrap& p) + { + DoStateShared(p); + p.Do(m_Active); + } void DoStateShared(PointerWrap& p); diff --git a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp index d53d1ebd2a..0b6de9b4f6 100644 --- a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp +++ b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp @@ -112,6 +112,7 @@ void CWII_IPC_HLE_Device_usb_oh1_57e_305::DoState(PointerWrap &p) std::deque m_EventQueue; */ + p.Do(m_ControllerBD); p.Do(m_CtrlSetup); p.Do(m_ACLSetup); p.Do(m_HCIEndpoint); diff --git a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_WiiMote.cpp b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_WiiMote.cpp index 8445eeffdc..e59e1b3208 100644 --- a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_WiiMote.cpp +++ b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_WiiMote.cpp @@ -102,6 +102,7 @@ void CWII_IPC_HLE_WiiMote::DoState(PointerWrap &p) p.Do(uclass); p.Do(features); p.Do(lmp_version); + p.Do(lmp_subversion); p.Do(m_LinkKey); p.Do(m_Name); diff --git a/Source/Core/Core/Src/Movie.cpp b/Source/Core/Core/Src/Movie.cpp index 0b6d3adae3..e4f3fb3f29 100644 --- a/Source/Core/Core/Src/Movie.cpp +++ b/Source/Core/Core/Src/Movie.cpp @@ -27,7 +27,6 @@ #include "HW/WiimoteEmu/WiimoteEmu.h" #include "HW/WiimoteEmu/WiimoteHid.h" #include "IPC_HLE/WII_IPC_HLE_Device_usb.h" -#include "VideoBackendBase.h" #include "State.h" #include "Timer.h" #include "VideoConfig.h" @@ -36,9 +35,10 @@ #include "HW/EXI_Channel.h" #include "HW/DVDInterface.h" #include "../../Common/Src/NandPaths.h" +#include "Crypto/md5.h" -// large enough for just over 24 hours of single-player recording -#define MAX_DTM_LENGTH (40 * 1024 * 1024) +// The chunk to allocate movie data in multiples of. +#define DTM_BASE_LENGTH (1024) std::mutex cs_frameSkip; @@ -56,6 +56,7 @@ u8 g_numPads = 0; ControllerState g_padState; DTMHeader tmpHeader; u8* tmpInput = NULL; +size_t tmpInputAllocated = 0; u64 g_currentByte = 0, g_totalBytes = 0; u64 g_currentFrame = 0, g_totalFrames = 0; // VI u64 g_currentLagCount = 0, g_totalLagCount = 0; // just stats @@ -63,12 +64,13 @@ u64 g_currentInputCount = 0, g_totalInputCount = 0; // just stats u64 g_recordingStartTime; // seconds since 1970 that recording started bool bSaveConfig, bSkipIdle, bDualCore, bProgressive, bDSPHLE, bFastDiscSpeed = false; bool bMemcard, g_bClearSave = false; -std::string videoBackend = "opengl"; +std::string videoBackend = "unknown"; int iCPUCore = 1; bool g_bDiscChange = false; std::string g_discChange = ""; std::string author = ""; u64 g_titleID = 0; +unsigned char MD5[16]; bool g_bRecordingFromSaveState = false; bool g_bPolled = false; @@ -80,6 +82,25 @@ std::string g_InputDisplay[8]; ManipFunction mfunc = NULL; +void EnsureTmpInputSize(size_t bound) +{ + if (tmpInputAllocated >= bound) + return; + // The buffer expands in powers of two of DTM_BASE_LENGTH + // (standard exponential buffer growth). + size_t newAlloc = DTM_BASE_LENGTH; + while (newAlloc < bound) + newAlloc *= 2; + u8* newTmpInput = new u8[newAlloc]; + tmpInputAllocated = newAlloc; + if (tmpInput != NULL) + { + if (g_totalBytes > 0) + memcpy(newTmpInput, tmpInput, g_totalBytes); + delete[] tmpInput; + } + tmpInput = newTmpInput; +} std::string GetInputDisplay() { @@ -135,6 +156,7 @@ void Init() if (IsPlayingInput()) { ReadHeader(); + std::thread md5thread(CheckMD5); if ((strncmp((char *)tmpHeader.gameID, Core::g_CoreStartupParameter.GetUniqueID().c_str(), 6))) { PanicAlert("The recorded game (%s) is not the same as the selected game (%s)", tmpHeader.gameID, Core::g_CoreStartupParameter.GetUniqueID().c_str()); @@ -144,7 +166,9 @@ void Init() if (IsRecordingInput()) { GetSettings(); + std::thread md5thread(GetMD5); } + g_frameSkipCounter = g_framesToSkip; memset(&g_padState, 0, sizeof(g_padState)); if (!tmpHeader.bFromSaveState || !IsPlayingInput()) @@ -162,10 +186,6 @@ void Init() g_currentFrame = 0; g_currentLagCount = 0; g_currentInputCount = 0; - // we don't clear these things because otherwise we can't resume playback if we load a movie state later - //g_totalFrames = g_totalBytes = 0; - //delete tmpInput; - //tmpInput = NULL; } } @@ -392,16 +412,20 @@ bool BeginRecordingInput(int controllers) // This is only done here if starting from save state because otherwise we won't have the titleid. Otherwise it's set in WII_IPC_HLE_Device_es.cpp. // TODO: find a way to GetTitleDataPath() from Movie::Init() - if (File::Exists((Common::GetTitleDataPath(g_titleID) + "banner.bin").c_str())) - Movie::g_bClearSave = false; - else - Movie::g_bClearSave = true; + if (Core::g_CoreStartupParameter.bWii) + { + if (File::Exists((Common::GetTitleDataPath(g_titleID) + "banner.bin").c_str())) + Movie::g_bClearSave = false; + else + Movie::g_bClearSave = true; + } + std::thread md5thread(GetMD5); } g_playMode = MODE_RECORDING; GetSettings(); author = SConfig::GetInstance().m_strMovieAuthor; - delete [] tmpInput; - tmpInput = new u8[MAX_DTM_LENGTH]; + EnsureTmpInputSize(1); + g_currentByte = g_totalBytes = 0; Core::DisplayMessage("Starting movie recording", 2000); @@ -581,7 +605,7 @@ void RecordInput(SPADStatus *PadStatus, int controllerID) g_padState.CStickX = PadStatus->substickX; g_padState.CStickY = PadStatus->substickY; - + EnsureTmpInputSize(g_currentByte + 8); memcpy(&(tmpInput[g_currentByte]), &g_padState, 8); g_currentByte += 8; g_totalBytes = g_currentByte; @@ -605,6 +629,7 @@ void RecordWiimote(int wiimote, u8 *data, const WiimoteEmu::ReportFeatures& rptf u8 size = rptf.size; InputUpdate(); + EnsureTmpInputSize(g_currentByte + size + 1); tmpInput[g_currentByte++] = size; memcpy(&(tmpInput[g_currentByte]), data, size); g_currentByte += size; @@ -635,7 +660,6 @@ void ReadHeader() else { GetSettings(); - bSaveConfig = false; } videoBackend.resize(ARRAYSIZE(tmpHeader.videoBackend)); @@ -655,6 +679,7 @@ void ReadHeader() { author[i] = tmpHeader.author[i]; } + memcpy(MD5, tmpHeader.md5, 16); } bool PlayInput(const char *filename) @@ -698,8 +723,7 @@ bool PlayInput(const char *filename) g_playMode = MODE_PLAYING; g_totalBytes = g_recordfd.GetSize() - 256; - delete tmpInput; - tmpInput = new u8[MAX_DTM_LENGTH]; + EnsureTmpInputSize((size_t)g_totalBytes); g_recordfd.ReadArray(tmpInput, (size_t)g_totalBytes); g_currentByte = 0; g_recordfd.Close(); @@ -766,9 +790,8 @@ void LoadInput(const char *filename) g_totalLagCount = tmpHeader.lagCount; g_totalInputCount = tmpHeader.inputCount; + EnsureTmpInputSize((size_t)totalSavedBytes); g_totalBytes = totalSavedBytes; - delete [] tmpInput; - tmpInput = new u8[MAX_DTM_LENGTH]; t_record.ReadArray(tmpInput, (size_t)g_totalBytes); } else if (g_currentByte > 0) @@ -1077,6 +1100,7 @@ void SaveRecording(const char *filename) header.bClearSave = g_bClearSave; strncpy((char *)header.discChange, g_discChange.c_str(),ARRAYSIZE(header.discChange)); strncpy((char *)header.author, author.c_str(),ARRAYSIZE(header.author)); + memcpy(header.md5,MD5,16); // TODO header.uniqueID = 0; @@ -1135,4 +1159,46 @@ void GetSettings() g_bClearSave = !File::Exists(SConfig::GetInstance().m_strMemoryCardA); bMemcard = SConfig::GetInstance().m_EXIDevice[0] == EXIDEVICE_MEMORYCARD; } + +void CheckMD5() +{ + for (int i=0, n=0; i<16; i++) + { + if (tmpHeader.md5[i] != 0) + continue; + n++; + if (n == 16) + return; + } + Core::DisplayMessage("Verifying checksum...", 2000); + + unsigned char gameMD5[16]; + char game[255]; + memcpy(game, SConfig::GetInstance().m_LocalCoreStartupParameter.m_strFilename.c_str(), SConfig::GetInstance().m_LocalCoreStartupParameter.m_strFilename.size()); + md5_file(game, gameMD5); + + if (memcmp(gameMD5,MD5,16) == 0) + Core::DisplayMessage("Checksum of current game matches the recorded game.", 2000); + else + PanicAlert("Checksum of current game does not match the recorded game!"); +} + +void GetMD5() +{ + Core::DisplayMessage("Calculating checksum of game file...", 2000); + for (int i = 0; i < 16; i++) + MD5[i] = 0; + char game[255]; + memcpy(game, SConfig::GetInstance().m_LocalCoreStartupParameter.m_strFilename.c_str(),SConfig::GetInstance().m_LocalCoreStartupParameter.m_strFilename.size()); + md5_file(game, MD5); + Core::DisplayMessage("Finished calculating checksum.", 2000); +} + +void Shutdown() +{ + g_currentInputCount = g_totalInputCount = g_totalFrames = g_totalBytes = 0; + delete [] tmpInput; + tmpInput = NULL; + tmpInputAllocated = 0; +} }; diff --git a/Source/Core/Core/Src/Movie.h b/Source/Core/Core/Src/Movie.h index 0152a66879..401b28be50 100644 --- a/Source/Core/Core/Src/Movie.h +++ b/Source/Core/Core/Src/Movie.h @@ -19,7 +19,6 @@ #define __MOVIE_H #include "Common.h" -#include "FileUtil.h" #include "../../InputCommon/Src/GCPadStatus.h" #include @@ -99,7 +98,7 @@ struct DTMHeader { u8 videoBackend[16]; // UTF-8 representation of the video backend u8 audioEmulator[16]; // UTF-8 representation of the audio emulator - u8 padBackend[16]; // UTF-8 representation of the input backend + unsigned char md5[16]; // MD5 of game iso u64 recordingStartTime; // seconds since 1970 that recording started (used for RTC) @@ -133,7 +132,6 @@ void Init(); void SetPolledDevice(); -bool IsAutoFiring(); bool IsRecordingInput(); bool IsRecordingInputFromSaveState(); bool IsJustStartingRecordingInputFromSaveState(); @@ -178,6 +176,9 @@ bool PlayWiimote(int wiimote, u8* data, const struct WiimoteEmu::ReportFeatures& void EndPlayInput(bool cont); void SaveRecording(const char *filename); void DoState(PointerWrap &p); +void CheckMD5(); +void GetMD5(); +void Shutdown(); std::string GetInputDisplay(); @@ -188,4 +189,4 @@ void SetInputManip(ManipFunction); void CallInputManip(SPADStatus *PadStatus, int controllerID); }; -#endif // __FRAME_H +#endif // __MOVIE_H diff --git a/Source/Core/Core/Src/State.cpp b/Source/Core/Core/Src/State.cpp index ab2313be4e..35299688ad 100644 --- a/Source/Core/Core/Src/State.cpp +++ b/Source/Core/Core/Src/State.cpp @@ -71,7 +71,7 @@ static Common::Event g_compressAndDumpStateSyncEvent; static std::thread g_save_thread; // Don't forget to increase this after doing changes on the savestate system -static const int STATE_VERSION = 8; +static const int STATE_VERSION = 9; struct StateHeader { diff --git a/Source/Core/DolphinWX/Src/Frame.cpp b/Source/Core/DolphinWX/Src/Frame.cpp index 9d59ca1788..da6c565ddf 100644 --- a/Source/Core/DolphinWX/Src/Frame.cpp +++ b/Source/Core/DolphinWX/Src/Frame.cpp @@ -26,7 +26,6 @@ #include "Common.h" // Common #include "FileUtil.h" #include "Timer.h" -#include "Setup.h" #include "Globals.h" // Local #include "Frame.h" @@ -458,13 +457,6 @@ CFrame::CFrame(wxFrame* parent, // Update controls UpdateGUI(); - - // If we are rerecording create the status bar now instead of later when a game starts - #ifdef RERECORDING - ModifyStatusBar(); - // It's to early for the OnHostMessage(), we will update the status when Ctrl or Space is pressed - //Core::WriteStatus(); - #endif } // Destructor CFrame::~CFrame() diff --git a/Source/Core/DolphinWX/Src/FrameTools.cpp b/Source/Core/DolphinWX/Src/FrameTools.cpp index a1f4355dd7..9011d5e844 100644 --- a/Source/Core/DolphinWX/Src/FrameTools.cpp +++ b/Source/Core/DolphinWX/Src/FrameTools.cpp @@ -27,9 +27,6 @@ window handle that is returned by CreateWindow() can be accessed from Core::GetWindowHandle(). */ - -#include "Setup.h" // Common - #include "NetWindow.h" #include "Common.h" // Common #include "FileUtil.h" diff --git a/Source/Core/DolphinWX/Src/Main.cpp b/Source/Core/DolphinWX/Src/Main.cpp index 2a0b8a3de4..59c77f1e32 100644 --- a/Source/Core/DolphinWX/Src/Main.cpp +++ b/Source/Core/DolphinWX/Src/Main.cpp @@ -28,7 +28,6 @@ #include "CPUDetect.h" #include "IniFile.h" #include "FileUtil.h" -#include "Setup.h" #include "Host.h" // Core #include "HW/Wiimote.h" diff --git a/Source/Core/VideoCommon/Src/Fifo.cpp b/Source/Core/VideoCommon/Src/Fifo.cpp index 565684297a..50aa21ebbf 100644 --- a/Source/Core/VideoCommon/Src/Fifo.cpp +++ b/Source/Core/VideoCommon/Src/Fifo.cpp @@ -16,7 +16,6 @@ // http://code.google.com/p/dolphin-emu/ #include "VideoConfig.h" -#include "Setup.h" #include "MemoryUtil.h" #include "Thread.h" #include "Atomic.h" diff --git a/Source/Core/VideoCommon/VideoCommon.vcxproj b/Source/Core/VideoCommon/VideoCommon.vcxproj index 0869f33ff4..bf9122e6b5 100644 --- a/Source/Core/VideoCommon/VideoCommon.vcxproj +++ b/Source/Core/VideoCommon/VideoCommon.vcxproj @@ -111,7 +111,8 @@ ..\Common\Src;..\Core\Src;..\..\..\Externals\SOIL;..\..\..\Externals\CLRun\include;%(AdditionalIncludeDirectories) - + false + true @@ -129,7 +130,7 @@ ..\Common\Src;..\Core\Src;..\..\..\Externals\SOIL;..\..\..\Externals\CLRun\include;%(AdditionalIncludeDirectories) - true + false true @@ -141,7 +142,8 @@ ..\Common\Src;..\Core\Src;..\..\..\Externals\SOIL;..\..\..\Externals\CLRun\include;%(AdditionalIncludeDirectories) - + false + true true diff --git a/Source/Plugins/Plugin_VideoOGL/Src/GLUtil.cpp b/Source/Plugins/Plugin_VideoOGL/Src/GLUtil.cpp index 5110023ee3..d6abb014c4 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/GLUtil.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/GLUtil.cpp @@ -18,7 +18,6 @@ #include "Globals.h" #include "VideoConfig.h" #include "IniFile.h" -#include "Setup.h" #include "Core.h" #include "Host.h" #include "VideoBackend.h" diff --git a/Source/Plugins/Plugin_VideoOGL/Src/main.cpp b/Source/Plugins/Plugin_VideoOGL/Src/main.cpp index 543fb9824d..fb26ba2781 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/main.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/main.cpp @@ -88,7 +88,6 @@ Make AA apply instantly during gameplay if possible #include "TextureConverter.h" #include "PostProcessing.h" #include "OnScreenDisplay.h" -#include "Setup.h" #include "DLCache.h" #include "FramebufferManager.h" #include "Core.h"