New "TAS Input" feature for precise joystick inputs. The feature is still a work in progress, but is functional. Currently overwrites any joystick/keyboard analog inputs and does so for all controllers.

Renamed OnFrame.cpp/h to a more accurate Movie.cpp/h. Made some small changes that may improve movie synchronization.

git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@7620 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
baby.lueshi
2011-06-24 06:50:50 +00:00
parent 2309e36b28
commit d8fc690838
23 changed files with 131 additions and 71 deletions

View File

@ -11,10 +11,10 @@ set(SRCS Src/ActionReplay.cpp
Src/GeckoCodeConfig.cpp
Src/GeckoCode.cpp
Src/MemTools.cpp
Src/Movie.cpp
Src/NetPlay.cpp
Src/NetPlayClient.cpp
Src/NetPlayServer.cpp
Src/OnFrame.cpp
Src/PatchEngine.cpp
Src/State.cpp
Src/stdafx.cpp

View File

@ -333,10 +333,10 @@
<ClCompile Include="Src\IPC_HLE\WII_IPC_HLE_Device_usb_kbd.cpp" />
<ClCompile Include="Src\IPC_HLE\WII_IPC_HLE_WiiMote.cpp" />
<ClCompile Include="Src\MemTools.cpp" />
<ClCompile Include="Src\Movie.cpp" />
<ClCompile Include="Src\NetPlay.cpp" />
<ClCompile Include="Src\NetPlayClient.cpp" />
<ClCompile Include="Src\NetPlayServer.cpp" />
<ClCompile Include="Src\OnFrame.cpp" />
<ClCompile Include="Src\PatchEngine.cpp" />
<ClCompile Include="Src\DSPEmulator.cpp" />
<ClCompile Include="Src\PowerPC\Interpreter\Interpreter.cpp" />
@ -533,8 +533,8 @@
<ClInclude Include="Src\IPC_HLE\WII_IPC_HLE_Device_usb_kbd.h" />
<ClInclude Include="Src\IPC_HLE\WII_IPC_HLE_WiiMote.h" />
<ClInclude Include="Src\MemTools.h" />
<ClInclude Include="Src\Movie.h" />
<ClInclude Include="Src\NetPlay.h" />
<ClInclude Include="Src\OnFrame.h" />
<ClInclude Include="Src\PatchEngine.h" />
<ClInclude Include="Src\DSPEmulator.h" />
<ClInclude Include="Src\PowerPC\CPUCoreBase.h" />

View File

@ -8,7 +8,6 @@
<ClCompile Include="Src\CoreRerecording.cpp" />
<ClCompile Include="Src\CoreTiming.cpp" />
<ClCompile Include="Src\MemTools.cpp" />
<ClCompile Include="Src\OnFrame.cpp" />
<ClCompile Include="Src\PatchEngine.cpp" />
<ClCompile Include="Src\DSPEmulator.cpp" />
<ClCompile Include="Src\State.cpp" />
@ -553,6 +552,7 @@
<ClCompile Include="Src\FifoPlayer\FifoAnalyzer.cpp">
<Filter>FifoPlayer</Filter>
</ClCompile>
<ClCompile Include="Src\Movie.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="Src\ConfigManager.h" />
@ -562,7 +562,6 @@
<ClInclude Include="Src\CoreTiming.h" />
<ClInclude Include="Src\Host.h" />
<ClInclude Include="Src\MemTools.h" />
<ClInclude Include="Src\OnFrame.h" />
<ClInclude Include="Src\PatchEngine.h" />
<ClInclude Include="Src\DSPEmulator.h" />
<ClInclude Include="Src\State.h" />
@ -1027,6 +1026,7 @@
<ClInclude Include="Src\FifoPlayer\FifoAnalyzer.h">
<Filter>FifoPlayer</Filter>
</ClInclude>
<ClInclude Include="Src\Movie.h" />
</ItemGroup>
<ItemGroup>
<None Include="CMakeLists.txt" />

View File

@ -71,7 +71,7 @@
#include "LogManager.h"
#include "State.h"
#include "OnFrame.h"
#include "Movie.h"
// TODO: ugly, remove
bool g_aspect_wide;
@ -261,7 +261,7 @@ void Stop() // - Hammertime!
SConfig::GetInstance().m_SYSCONF->Reload();
INFO_LOG(CONSOLE, "Stop [Main Thread]\t\t---- Shutdown complete ----");
Frame::g_InputCounter = 0;
Movie::g_InputCounter = 0;
g_bStopping = false;
}
@ -561,7 +561,7 @@ void VideoThrottle()
// Update info per second
u32 ElapseTime = (u32)Timer.GetTimeDifference();
if ((ElapseTime >= 1000 && DrawnVideo > 0) || Frame::g_bFrameStep)
if ((ElapseTime >= 1000 && DrawnVideo > 0) || Movie::g_bFrameStep)
{
SCoreStartupParameter& _CoreParameter = SConfig::GetInstance().m_LocalCoreStartupParameter;
@ -599,8 +599,8 @@ void VideoThrottle()
#else // Summary information
std::string SFPS;
if (Frame::IsPlayingInput() || Frame::IsRecordingInput())
SFPS = StringFromFormat("VI: %u - Frame: %u - FPS: %u - VPS: %u - SPEED: %u%%", Frame::g_frameCounter, Frame::g_InputCounter, FPS, VPS, Speed);
if (Movie::IsPlayingInput() || Movie::IsRecordingInput())
SFPS = StringFromFormat("VI: %u - Frame: %u - FPS: %u - VPS: %u - SPEED: %u%%", Movie::g_frameCounter, Movie::g_InputCounter, FPS, VPS, Speed);
else
SFPS = StringFromFormat("FPS: %u - VPS: %u - SPEED: %u%%", FPS, VPS, Speed);
#endif
@ -652,7 +652,7 @@ void Callback_VideoCopiedToXFB(bool video_update)
{
if(video_update)
Common::AtomicIncrement(DrawnFrame);
Frame::FrameUpdate();
Movie::FrameUpdate();
}
// Callback_ISOName: Let the DSP emulator get the game name

View File

@ -24,7 +24,7 @@
#include "../ConfigManager.h"
#include "MemoryUtil.h"
#include "FileUtil.h"
#include "../OnFrame.h"
#include "../Movie.h"
// We should provide an option to choose from the above, or figure out the checksum (the algo in yagcd seems wrong)
// so that people can change default language.
@ -340,7 +340,7 @@ u32 CEXIIPL::GetGCTime()
// hack in some netplay stuff
ltime = NetPlay_GetGCTime();
if (Frame::IsRecordingInput() || Frame::IsPlayingInput())
if (Movie::IsRecordingInput() || Movie::IsPlayingInput())
ltime = 1234567890; // TODO: Should you be able to set a custom time in movies?
else if (0 == ltime)
ltime = Common::Timer::GetLocalTimeSinceJan1970();

View File

@ -106,7 +106,9 @@ void GCPad::GetInput(SPADStatus* const pad)
// buttons
m_buttons->GetState(&pad->button, button_bitmasks);
// TODO: set analog A/B analog to full or w/e, prolly not needed
// set analog A/B analog to full or w/e, prolly not needed
if (pad->button & PAD_BUTTON_A) pad->analogA = 0xFF;
if (pad->button & PAD_BUTTON_B) pad->analogB = 0xFF;
// dpad
m_dpad->GetState(&pad->button, dpad_bitmasks);

View File

@ -19,7 +19,7 @@
#include "ChunkFile.h"
#include "../ConfigManager.h"
#include "../CoreTiming.h"
#include "../OnFrame.h"
#include "../Movie.h"
#include "SystemTimers.h"
#include "ProcessorInterface.h"
@ -246,9 +246,9 @@ void Init()
g_Channel[i].m_InHi.Hex = 0;
g_Channel[i].m_InLo.Hex = 0;
if (Frame::IsUsingPad(i))
if (Movie::IsUsingPad(i))
AddDevice(SI_GC_CONTROLLER, i);
else if (Frame::IsRecordingInput() || Frame::IsPlayingInput())
else if (Movie::IsRecordingInput() || Movie::IsPlayingInput())
AddDevice(SI_NONE, i);
else
AddDevice(SConfig::GetInstance().m_SIDevice[i], i);
@ -622,7 +622,7 @@ void RunSIBuffer()
int GetTicksToNextSIPoll()
{
// Poll for input at regular intervals (once per frame) when playing or recording a movie
if (Frame::IsPlayingInput() || Frame::IsRecordingInput())
if (Movie::IsPlayingInput() || Movie::IsRecordingInput())
{
return SystemTimers::GetTicksPerSecond() / VideoInterface::TargetRefreshRate;
}

View File

@ -27,7 +27,7 @@
#include "GCPad.h"
#include "../OnFrame.h"
#include "../Movie.h"
#include "../CoreTiming.h"
#include "SystemTimers.h"
@ -128,6 +128,7 @@ bool CSIDevice_GCController::GetData(u32& _Hi, u32& _Low)
memset(&PadStatus, 0, sizeof(PadStatus));
Pad::GetStatus(ISIDevice::m_iDeviceNumber, &PadStatus);
Movie::CallInputManip(&PadStatus, ISIDevice::m_iDeviceNumber);
u32 netValues[2];
if (NetPlay_GetInput(ISIDevice::m_iDeviceNumber, PadStatus, netValues))
@ -137,22 +138,19 @@ bool CSIDevice_GCController::GetData(u32& _Hi, u32& _Low)
return true;
}
Frame::SetPolledDevice();
Movie::SetPolledDevice();
if(Frame::IsPlayingInput())
if(Movie::IsPlayingInput())
{
Frame::PlayController(&PadStatus, ISIDevice::m_iDeviceNumber);
Movie::PlayController(&PadStatus, ISIDevice::m_iDeviceNumber);
if(!Core::g_CoreStartupParameter.bWii)
Frame::InputUpdate();
Movie::InputUpdate();
}
else
else if(Movie::IsRecordingInput())
{
if(Frame::IsRecordingInput())
{
Frame::RecordInput(&PadStatus, ISIDevice::m_iDeviceNumber);
if(!Core::g_CoreStartupParameter.bWii)
Frame::InputUpdate();
}
Movie::RecordInput(&PadStatus, ISIDevice::m_iDeviceNumber);
if(!Core::g_CoreStartupParameter.bWii)
Movie::InputUpdate();
}
// Thankfully changing mode does not change the high bits ;)

View File

@ -4,7 +4,7 @@
#include "Wiimote.h"
#include "WiimoteReal/WiimoteReal.h"
#include "WiimoteEmu/WiimoteEmu.h"
#include "OnFrame.h"
#include "Movie.h"
#include "ControllerInterface/ControllerInterface.h"
@ -48,8 +48,8 @@ void Initialize(void* const hwnd)
WiimoteReal::Initialize();
if (Frame::IsPlayingInput()) // reload Wiimotes with our settings
Frame::ChangeWiiPads();
if (Movie::IsPlayingInput()) // reload Wiimotes with our settings
Movie::ChangeWiiPads();
}
// __________________________________________________________________________________________________

View File

@ -37,7 +37,7 @@ inline double round(double x) { return (x-floor(x))>0.5 ? ceil(x) : floor(x); }
#include "MatrixMath.h"
#include "../../OnFrame.h"
#include "../../Movie.h"
namespace WiimoteEmu
{
@ -635,9 +635,9 @@ void Wiimote::Update()
// figure out what data we need
s8 rptf_size = MAX_PAYLOAD;
Frame::SetPolledDevice();
Movie::SetPolledDevice();
if (!Frame::IsPlayingInput() || !Frame::PlayWiimote(m_index, data, rptf_size))
if (!Movie::IsPlayingInput() || !Movie::PlayWiimote(m_index, data, rptf_size))
{
const ReportFeatures& rptf = reporting_mode_features[m_reporting_mode - WM_REPORT_CORE];
rptf_size = rptf.size;
@ -742,9 +742,9 @@ void Wiimote::Update()
}
}
}
if (Frame::IsRecordingInput())
if (Movie::IsRecordingInput())
{
Frame::RecordWiimote(m_index, data, rptf_size);
Movie::RecordWiimote(m_index, data, rptf_size);
}
}

View File

@ -15,7 +15,7 @@
// Official SVN repository and contact information can be found at
// http://code.google.com/p/dolphin-emu/
#include "OnFrame.h"
#include "Movie.h"
#include "Core.h"
#include "Thread.h"
@ -41,7 +41,7 @@
std::mutex cs_frameSkip;
namespace Frame {
namespace Movie {
bool g_bFrameStep = false;
bool g_bFrameStop = false;
@ -65,6 +65,8 @@ std::string tmpStateFilename = "dtm.sav";
std::string g_InputDisplay[4];
ManipFunction mfunc = NULL;
std::string GetInputDisplay()
{
std::string inputDisplay = "";
@ -451,13 +453,19 @@ void PlayController(SPADStatus *PadStatus, int controllerID)
if (!IsPlayingInput() || !IsUsingPad(controllerID) || tmpInput == NULL)
return;
memset(PadStatus, 0, sizeof(SPADStatus));
if (inputOffset + 8 > tmpLength)
{
EndPlayInput(!g_bReadOnly);
return;
}
// dtm files don't save the mic button or error bit. not sure if they're actually
// used, but better safe than sorry
bool m = PadStatus->MicButton;
signed char e = PadStatus->err;
memset(PadStatus, 0, sizeof(SPADStatus));
PadStatus->MicButton = m;
PadStatus->err = e;
memcpy(&g_padState, &(tmpInput[inputOffset]), 8);
inputOffset += 8;
@ -634,4 +642,15 @@ void SaveRecording(const char *filename)
else
Core::DisplayMessage(StringFromFormat("Failed to save %s", filename).c_str(), 2000);
}
void SetInputManip(ManipFunction func)
{
mfunc = func;
}
void CallInputManip(SPADStatus *PadStatus, int controllerID)
{
if (mfunc)
(*mfunc)(PadStatus, controllerID);
}
};

View File

@ -15,8 +15,8 @@
// Official SVN repository and contact information can be found at
// http://code.google.com/p/dolphin-emu/
#ifndef __FRAME_H
#define __FRAME_H
#ifndef __MOVIE_H
#define __MOVIE_H
#include "Common.h"
#include "FileUtil.h"
@ -24,9 +24,9 @@
#include <string>
// Per-(video )Frame actions
// Per-(video )Movie actions
namespace Frame {
namespace Movie {
// Enumerations and structs
enum PlayMode {
@ -125,6 +125,12 @@ void EndPlayInput(bool cont);
void SaveRecording(const char *filename);
std::string GetInputDisplay();
// Done this way to avoid mixing of core and gui code
typedef void(*ManipFunction)(SPADStatus *, int);
void SetInputManip(ManipFunction);
void CallInputManip(SPADStatus *PadStatus, int controllerID);
};
#endif // __FRAME_H

View File

@ -22,7 +22,7 @@
#include "StringUtil.h"
#include "Thread.h"
#include "CoreTiming.h"
#include "OnFrame.h"
#include "Movie.h"
#include "HW/Wiimote.h"
#include "HW/DSP.h"
#include "HW/HW.h"
@ -235,9 +235,9 @@ void SaveFileStateCallback(u64 userdata, int cyclesLate)
p.SetMode(PointerWrap::MODE_WRITE);
DoState(p);
if ((Frame::IsRecordingInput() || Frame::IsPlayingInput()) && !Frame::IsRecordingInputFromSaveState())
Frame::SaveRecording((g_current_filename + ".dtm").c_str());
else if (!Frame::IsRecordingInput() && !Frame::IsPlayingInput())
if ((Movie::IsRecordingInput() || Movie::IsPlayingInput()) && !Movie::IsRecordingInputFromSaveState())
Movie::SaveRecording((g_current_filename + ".dtm").c_str());
else if (!Movie::IsRecordingInput() && !Movie::IsPlayingInput())
File::Delete(g_current_filename + ".dtm");
Core::DisplayMessage("Saving State...", 1000);
@ -345,9 +345,9 @@ void LoadFileStateCallback(u64 userdata, int cyclesLate)
Core::DisplayMessage("Unable to Load : Can't load state from other revisions !", 4000);
if (File::Exists(g_current_filename + ".dtm"))
Frame::LoadInput((g_current_filename + ".dtm").c_str());
else if (!Frame::IsRecordingInputFromSaveState())
Frame::EndPlayInput(false);
Movie::LoadInput((g_current_filename + ".dtm").c_str());
else if (!Movie::IsRecordingInputFromSaveState())
Movie::EndPlayInput(false);
}
g_op_in_progress = false;