diff --git a/Source/Core/Core/Src/CoreRerecording.cpp b/Source/Core/Core/Src/CoreRerecording.cpp
index 75894d8569..5f31837f77 100644
--- a/Source/Core/Core/Src/CoreRerecording.cpp
+++ b/Source/Core/Core/Src/CoreRerecording.cpp
@@ -112,8 +112,11 @@ void Pause()
// Start the timer when a game is booted
void RerecordingStart()
{
- g_FrameCounter == 0;
+ g_FrameCounter = 0;
ReRecTimer.Start();
+
+ // Logging
+ Console::Print("RerecordingStart: %i\n", g_FrameCounter);
}
// Reset the frame counter
diff --git a/Source/Plugins/Plugin_PadSimple/Src/PadSimple.cpp b/Source/Plugins/Plugin_PadSimple/Src/PadSimple.cpp
index d70b0a550b..14b835269e 100644
--- a/Source/Plugins/Plugin_PadSimple/Src/PadSimple.cpp
+++ b/Source/Plugins/Plugin_PadSimple/Src/PadSimple.cpp
@@ -709,7 +709,7 @@ void Shutdown()
//Console::Print("ShutDown()\n");
// -------------------------------------------
- // Play back input instead of accepting any user input
+ // Save the recording and reset the counter
// ----------------------
#ifdef RERECORDING
// Save recording
diff --git a/Source/Plugins/Plugin_nJoy_SDL/Plugin_nJoy_SDL.vcproj b/Source/Plugins/Plugin_nJoy_SDL/Plugin_nJoy_SDL.vcproj
index 94adefdb65..c60bd2b195 100644
--- a/Source/Plugins/Plugin_nJoy_SDL/Plugin_nJoy_SDL.vcproj
+++ b/Source/Plugins/Plugin_nJoy_SDL/Plugin_nJoy_SDL.vcproj
@@ -518,6 +518,10 @@
RelativePath=".\Src\nJoy.h"
>
+
+
diff --git a/Source/Plugins/Plugin_nJoy_SDL/Src/Config.cpp b/Source/Plugins/Plugin_nJoy_SDL/Src/Config.cpp
index beb189736f..a485f92fea 100644
--- a/Source/Plugins/Plugin_nJoy_SDL/Src/Config.cpp
+++ b/Source/Plugins/Plugin_nJoy_SDL/Src/Config.cpp
@@ -111,6 +111,10 @@ void Config::Save(int Slot)
file.Set("General", "SaveByID", g_Config.bSaveByID);
file.Set("General", "CheckForFocus", g_Config.bCheckFocus);
file.Set("General", "NoTriggerFilter", g_Config.bNoTriggerFilter);
+#ifdef RERECORDING
+ file.Set("General", "Recording", g_Config.bRecording);
+ file.Set("General", "Playback", g_Config.bPlayback);
+#endif
// ========================
for (int i = 0; i < 4; i++)
@@ -199,6 +203,10 @@ void Config::Load(bool ChangePad, bool ChangeSaveByID)
file.Get("General", "ShowAdvanced", &g_Config.bShowAdvanced, false);
file.Get("General", "CheckForFocus", &g_Config.bCheckFocus, false);
file.Get("General", "NoTriggerFilter", &g_Config.bNoTriggerFilter, false);
+#ifdef RERECORDING
+ file.Get("General", "Recording", &g_Config.bRecording, false);
+ file.Get("General", "Playback", &g_Config.bPlayback, false);
+#endif
if(!ChangeSaveByID)
{
diff --git a/Source/Plugins/Plugin_nJoy_SDL/Src/Config.h b/Source/Plugins/Plugin_nJoy_SDL/Src/Config.h
index 6dec72a99b..a59c3679c2 100644
--- a/Source/Plugins/Plugin_nJoy_SDL/Src/Config.h
+++ b/Source/Plugins/Plugin_nJoy_SDL/Src/Config.h
@@ -30,6 +30,10 @@ struct Config
bool bSaveByID;
bool bCheckFocus;
bool bNoTriggerFilter;
+#ifdef RERECORDING
+ bool bRecording;
+ bool bPlayback;
+#endif
};
extern Config g_Config;
diff --git a/Source/Plugins/Plugin_nJoy_SDL/Src/GUI/ConfigAdvanced.cpp b/Source/Plugins/Plugin_nJoy_SDL/Src/GUI/ConfigAdvanced.cpp
index 93933869c5..fbd3c4ae8c 100644
--- a/Source/Plugins/Plugin_nJoy_SDL/Src/GUI/ConfigAdvanced.cpp
+++ b/Source/Plugins/Plugin_nJoy_SDL/Src/GUI/ConfigAdvanced.cpp
@@ -299,6 +299,46 @@ void ConfigBox::CreateAdvancedControls(int i)
m_bmpDotOut[i] = new wxStaticBitmap(m_pOutStatus[i], ID_STATUSDOTBMP1 + i, CreateBitmapDot(),
wxPoint(BoxW / 2, BoxH / 2), wxDefaultSize);
+
+
+ /////////////////////////////////////////////////////////////////////////////////////
+ // Rerecording
+ // ŻŻŻŻŻŻŻŻŻ
+ #ifdef RERECORDING
+ // Create controls
+ m_SizeRecording[i] = new wxStaticBoxSizer(wxVERTICAL, m_Controller[i], wxT("Input Recording"));
+ m_CheckRecording[i] = new wxCheckBox(m_Controller[i], ID_RECORDING, wxT("Record input"));
+ m_CheckPlayback[i] = new wxCheckBox(m_Controller[i], ID_PLAYBACK, wxT("Play back input"));
+ m_BtnSaveRecording[i] = new wxButton(m_Controller[i], ID_SAVE_RECORDING, wxT("Save recording"), wxDefaultPosition, wxDefaultSize);
+
+ // Tool tips
+ m_CheckRecording[i]->SetToolTip(wxT("Your recording will be saved to pad-record.bin in the Dolphin dir when you stop the game"));
+ m_CheckPlayback[i]->SetToolTip(wxT("Play back the pad-record.bin file from the Dolphin dir"));
+ m_BtnSaveRecording[i]->SetToolTip(wxT(
+ "This will save the current recording to pad-record.bin. Your recording will\n"
+ "also be automatically saved every 60 * 10 frames. And when you shut down the\n"
+ "game."));
+
+ // Sizers
+ m_SizeRecording[i]->Add(m_CheckRecording[i], 0, wxEXPAND | wxALL, 1);
+ m_SizeRecording[i]->Add(m_CheckPlayback[i], 0, wxEXPAND | wxALL, 1);
+ m_SizeRecording[i]->Add(m_BtnSaveRecording[i], 0, wxEXPAND | wxALL, 1);
+
+ // Only enable these options for pad 0
+ m_CheckRecording[i]->Enable(false); m_CheckRecording[0]->Enable(true);
+ m_CheckPlayback[i]->Enable(false); m_CheckPlayback[0]->Enable(true);
+ m_BtnSaveRecording[i]->Enable(false); m_BtnSaveRecording[0]->Enable(true);
+ // Don't allow saving when we are not recording
+ m_BtnSaveRecording[i]->Enable(g_EmulatorRunning && g_Config.bRecording);
+ //sDevice[i]->Add(m_SizeRecording[i], 0, wxEXPAND | wxALL, 1);
+
+ // Set values
+ //m_CheckRecording[0]->SetValue(g_Config.bRecording);
+ //m_CheckPlayback[0]->SetValue(g_Config.bPlayback);
+
+ //Console::Print("m_CheckRecording: %i\n", g_Config.bRecording, g_Config.bPlayback);
+ #endif
+ //////////////////////////////////////
}
diff --git a/Source/Plugins/Plugin_nJoy_SDL/Src/GUI/ConfigBox.cpp b/Source/Plugins/Plugin_nJoy_SDL/Src/GUI/ConfigBox.cpp
index 7b150e9e00..2e10179e18 100644
--- a/Source/Plugins/Plugin_nJoy_SDL/Src/GUI/ConfigBox.cpp
+++ b/Source/Plugins/Plugin_nJoy_SDL/Src/GUI/ConfigBox.cpp
@@ -84,6 +84,11 @@ BEGIN_EVENT_TABLE(ConfigBox,wxDialog)
EVT_COMBOBOX(IDCB_MAINSTICK_DIAGONAL, ConfigBox::ChangeSettings)
EVT_CHECKBOX(IDCB_MAINSTICK_S_TO_C, ConfigBox::ChangeSettings)
EVT_CHECKBOX(IDCB_FILTER_SETTINGS, ConfigBox::ChangeSettings)
+#ifdef RERECORDING
+ EVT_CHECKBOX(ID_RECORDING, ConfigBox::ChangeSettings)
+ EVT_CHECKBOX(ID_PLAYBACK, ConfigBox::ChangeSettings)
+ EVT_BUTTON(ID_SAVE_RECORDING, ConfigBox::GetButtons)
+#endif
EVT_BUTTON(IDB_SHOULDER_L, ConfigBox::GetButtons)
EVT_BUTTON(IDB_SHOULDER_R, ConfigBox::GetButtons)
@@ -448,6 +453,24 @@ void ConfigBox::ChangeSettings( wxCommandEvent& event )
m_AdvancedMapFilter[i]->SetValue(g_Config.bNoTriggerFilter);
}
break;
+#ifdef RERECORDING
+ case ID_RECORDING:
+ g_Config.bRecording = m_CheckRecording[notebookpage]->IsChecked();
+ if(g_Config.bRecording) g_Config.bPlayback = !g_Config.bRecording;
+ for(int i = 0; i < 4; i++) m_CheckRecording[i]->SetValue(g_Config.bRecording);
+ for(int i = 0; i < 4; i++) m_CheckPlayback[i]->SetValue(g_Config.bPlayback);
+ break;
+ case ID_PLAYBACK:
+ g_Config.bPlayback = m_CheckPlayback[notebookpage]->IsChecked();
+ if(g_Config.bPlayback) g_Config.bRecording = !g_Config.bPlayback;
+ for(int i = 0; i < 4; i++) m_CheckPlayback[i]->SetValue(g_Config.bPlayback);
+ for(int i = 0; i < 4; i++) m_CheckPlayback[i]->SetValue(g_Config.bRecording);
+ break;
+ case ID_SAVE_RECORDING:
+ // Double check again that we are still running a game
+ if (g_EmulatorRunning) Recording::Save();
+ break;
+#endif
case IDC_CONTROLTYPE:
if(!g_Config.bSaveByID)
@@ -532,8 +555,12 @@ void ConfigBox::UpdateGUI(int _notebookpage)
m_CBShowAdvanced[_notebookpage]->SetValue(g_Config.bShowAdvanced);
m_CBCheckFocus[_notebookpage]->SetValue(g_Config.bCheckFocus);
m_AdvancedMapFilter[_notebookpage]->SetValue(g_Config.bNoTriggerFilter);
+#ifdef RERECORDING
+ m_CheckRecording[_notebookpage]->SetValue(g_Config.bRecording);
+ m_CheckPlayback[_notebookpage]->SetValue(g_Config.bPlayback);
+#endif
- LogMsg("Update: %i\n", g_Config.bSaveByID);
+ //LogMsg("Update: %i\n", g_Config.bSaveByID);
// Disabled pages
bool Enabled = PadMapping[_notebookpage].enabled == 1 ? true : false;
@@ -967,7 +994,10 @@ void ConfigBox::CreateGUIControls()
m_sMainRight[i]->Add(m_gStatusIn[i], 0, wxEXPAND | (wxLEFT), 2);
m_sMainRight[i]->Add(m_gStatusInSettings[i], 0, wxEXPAND | (wxLEFT | wxTOP), 2);
m_sMainRight[i]->Add(m_gStatusTriggers[i], 0, wxEXPAND | (wxLEFT | wxTOP), 2);
- m_sMainRight[i]->Add(m_gStatusAdvancedSettings[i], 0, wxEXPAND | (wxLEFT | wxTOP), 2);
+ m_sMainRight[i]->Add(m_gStatusAdvancedSettings[i], 0, wxEXPAND | (wxLEFT | wxTOP), 2);
+#ifdef RERECORDING
+ m_sMainRight[i]->Add(m_SizeRecording[i], 0, wxEXPAND | (wxLEFT | wxTOP), 2);
+#endif
// --------------------------------------------------------------------
// Populate main sizer
diff --git a/Source/Plugins/Plugin_nJoy_SDL/Src/GUI/ConfigBox.h b/Source/Plugins/Plugin_nJoy_SDL/Src/GUI/ConfigBox.h
index e47ba87b24..f11fe8f3c3 100644
--- a/Source/Plugins/Plugin_nJoy_SDL/Src/GUI/ConfigBox.h
+++ b/Source/Plugins/Plugin_nJoy_SDL/Src/GUI/ConfigBox.h
@@ -190,6 +190,11 @@ class ConfigBox : public wxDialog
*m_bmpSquare[4], *m_bmpDot[4], *m_bmpSquareOut[4], *m_bmpDotOut[4];
int notebookpage; bool ControlsCreated;
+#ifdef RERECORDING
+ wxStaticBoxSizer *m_SizeRecording[4];
+ wxCheckBox *m_CheckRecording[4], *m_CheckPlayback[4];
+ wxButton *m_BtnSaveRecording[4];
+#endif
private:
enum
@@ -221,6 +226,9 @@ class ConfigBox : public wxDialog
// Advaced settings
IDCB_MAINSTICK_DIAGONAL, IDCB_MAINSTICK_S_TO_C, IDT_MAINSTICK_DIAGONAL, IDT_TRIGGERS, IDCB_CHECKFOCUS, IDCB_FILTER_SETTINGS,
+#ifdef RERECORDING
+ ID_RECORDING, ID_PLAYBACK, ID_SAVE_RECORDING,
+#endif
// Timers
IDTM_CONSTANT, IDTM_BUTTON,
diff --git a/Source/Plugins/Plugin_nJoy_SDL/Src/GUI/ConfigJoypad.cpp b/Source/Plugins/Plugin_nJoy_SDL/Src/GUI/ConfigJoypad.cpp
index f9e8ad23f1..1a129bc083 100644
--- a/Source/Plugins/Plugin_nJoy_SDL/Src/GUI/ConfigJoypad.cpp
+++ b/Source/Plugins/Plugin_nJoy_SDL/Src/GUI/ConfigJoypad.cpp
@@ -80,7 +80,10 @@ void ConfigBox::UpdateGUIButtonMapping(int controller)
m_CoBDiagonal[controller]->SetValue(wxString::FromAscii(PadMapping[controller].SDiagonal.c_str()));
m_CBS_to_C[controller]->SetValue(PadMapping[controller].bSquareToCircle);
m_AdvancedMapFilter[controller]->SetValue(g_Config.bNoTriggerFilter);
-
+#ifdef RERECORDING
+ m_CheckRecording[controller]->SetValue(g_Config.bRecording);
+ m_CheckPlayback[controller]->SetValue(g_Config.bPlayback);
+#endif
//LogMsg("m_TriggerType[%i] = %i\n", controller, PadMapping[controller].triggertype);
// Update D-Pad
diff --git a/Source/Plugins/Plugin_nJoy_SDL/Src/ReRecording.cpp b/Source/Plugins/Plugin_nJoy_SDL/Src/ReRecording.cpp
new file mode 100644
index 0000000000..e434bee322
--- /dev/null
+++ b/Source/Plugins/Plugin_nJoy_SDL/Src/ReRecording.cpp
@@ -0,0 +1,195 @@
+//////////////////////////////////////////////////////////////////////////////////////////
+// Project description
+// ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ
+// Name: nJoy
+// Description: A Dolphin Compatible Input Plugin
+//
+// Author: Falcon4ever (nJoy@falcon4ever.com)
+// Site: www.multigesture.net
+// Copyright (C) 2003-2008 Dolphin Project.
+//
+//////////////////////////////////////////////////////////////////////////////////////////
+//
+// Licensetype: GNU General Public License (GPL)
+//
+// 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/
+//
+//////////////////////////////////////////////////////////////////////////////////////////
+
+
+//////////////////////////////////////////////////////////////////////////////////////////
+// File description
+/* ŻŻŻŻŻŻŻŻŻ
+
+Rerecording options
+
+////////////////////////*/
+
+
+//////////////////////////////////////////////////////////////////////////////////////////
+// Include
+// ŻŻŻŻŻŻŻŻŻ
+#include "nJoy.h"
+#include "FileUtil.h"
+#include "ChunkFile.h"
+/////////////////////////
+
+
+#ifdef RERECORDING
+
+
+namespace Recording
+{
+
+
+//////////////////////////////////////////////////////////////////////////////////////////
+// Definitions
+// ŻŻŻŻŻŻŻŻŻŻŻŻŻ
+// Pre defined maxium storage limit
+#define RECORD_SIZE (1024 * 128)
+SPADStatus RecordBuffer[RECORD_SIZE];
+int count = 0;
+////////////////////////////////
+
+
+
+//////////////////////////////////////////////////////////////////////////////////////////
+// Recording functions
+// ŻŻŻŻŻŻŻŻŻŻŻŻŻ
+void RecordInput(const SPADStatus& _rPADStatus)
+{
+ if (count >= RECORD_SIZE) return;
+ RecordBuffer[count++] = _rPADStatus;
+
+ // Logging
+ //u8 TmpData[sizeof(SPADStatus)];
+ //memcpy(TmpData, &RecordBuffer[count - 1], sizeof(SPADStatus));
+ //Console::Print("RecordInput(%i): %s\n", count, ArrayToString(TmpData, sizeof(SPADStatus), 0, 30).c_str());
+
+ // Auto save every ten seconds
+ if (count % (60 * 10) == 0) Save();
+}
+
+const SPADStatus& Play()
+{
+ // Logging
+ //Console::Print("PlayRecord(%i)\n", count);
+ if (count >= RECORD_SIZE)
+ {
+ // Todo: Make the recording size unlimited?
+ //PanicAlert("The recording reached its end");
+ return(RecordBuffer[0]);
+ }
+ return(RecordBuffer[count++]);
+}
+
+void Load()
+{
+ FILE* pStream = fopen("pad-record.bin", "rb");
+
+ if (pStream != NULL)
+ {
+ fread(RecordBuffer, 1, RECORD_SIZE * sizeof(SPADStatus), pStream);
+ fclose(pStream);
+ }
+ else
+ {
+ PanicAlert("SimplePad: Could not open pad-record.bin");
+ }
+
+ //Console::Print("LoadRecord()");
+}
+
+void Save()
+{
+ // Open the file in a way that clears all old data
+ FILE* pStream = fopen("pad-record.bin", "wb");
+
+ if (pStream != NULL)
+ {
+ fwrite(RecordBuffer, 1, RECORD_SIZE * sizeof(SPADStatus), pStream);
+ fclose(pStream);
+ }
+ else
+ {
+ PanicAlert("NJoy: Could not save pad-record.bin");
+ }
+ //PanicAlert("SaveRecord()");
+ //Console::Print("SaveRecord()");
+}
+////////////////////////////////
+
+
+
+void Initialize()
+{
+ // -------------------------------------------
+ // Rerecording
+ // ----------------------
+ #ifdef RERECORDING
+ /* Check if we are starting the pad to record the input, and an old file exists. In that case ask
+ if we really want to start the recording and eventually overwrite the file */
+ if (g_Config.bRecording && File::Exists("pad-record.bin"))
+ {
+ if (!AskYesNo("An old version of '%s' aleady exists in your Dolphin directory. You can"
+ " now make a copy of it before you start a new recording and overwrite the file."
+ " Select Yes to continue and overwrite the file. Select No to turn off the input"
+ " recording and continue without recording anything.",
+ "pad-record.bin"))
+ {
+ // Turn off recording and continue
+ g_Config.bRecording = false;
+ }
+ }
+
+ // Load recorded input if we are to play it back, otherwise begin with a blank recording
+ if (g_Config.bPlayback) Recording::Load();
+ #endif
+ // ----------------------
+}
+
+
+void ShutDown()
+{
+ // Save recording
+ if (g_Config.bRecording) Recording::Save();
+ // Reset the counter
+ count = 0;
+}
+
+void DoState(unsigned char **ptr, int mode)
+{
+ // Load or save the counter
+ PointerWrap p(ptr, mode);
+ p.Do(count);
+
+ //Console::Print("count: %i\n", count);
+
+ // Update the frame counter for the sake of the status bar
+ if (mode == PointerWrap::MODE_READ)
+ {
+ #ifdef _WIN32
+ // This only works when rendering to the main window, I think
+ PostMessage(GetParent(g_PADInitialize->hWnd), WM_USER, INPUT_FRAME_COUNTER, count);
+ #endif
+ }
+}
+
+
+} // Recording
+
+
+#endif // RERECORDING
\ No newline at end of file
diff --git a/Source/Plugins/Plugin_nJoy_SDL/Src/nJoy.cpp b/Source/Plugins/Plugin_nJoy_SDL/Src/nJoy.cpp
index eb813e59ad..2551a28df0 100644
--- a/Source/Plugins/Plugin_nJoy_SDL/Src/nJoy.cpp
+++ b/Source/Plugins/Plugin_nJoy_SDL/Src/nJoy.cpp
@@ -265,31 +265,9 @@ void Initialize(void *init)
if(ReloadDLL()) g_PADInitialize->padNumber = -1;
}
#endif
-}
-
-bool Search_Devices(std::vector &_joyinfo, int &_NumPads, int &_NumGoodPads)
-{
- bool Success = InputCommon::SearchDevices(_joyinfo, _NumPads, _NumGoodPads);
-
- // Warn the user if no gamepads are detected
- if (_NumGoodPads == 0 && g_EmulatorRunning)
- {
- PanicAlert("nJoy: No Gamepad Detected");
- return false;
- }
-
- // Load PadMapping[] etc
- g_Config.Load();
-
- // Update the PadState[].joy handle
- for (int i = 0; i < 4; i++)
- {
- if (PadMapping[i].enabled && joyinfo.size() > PadMapping[i].ID)
- if(joyinfo.at(PadMapping[i].ID).Good)
- PadState[i].joy = SDL_JoystickOpen(PadMapping[i].ID);
- }
-
- return Success;
+ #ifdef RERECORDING
+ Recording::Initialize();
+ #endif
}
// Shutdown PAD (stop emulation)
@@ -301,6 +279,14 @@ void Shutdown()
{
Console::Print("Shutdown: %i\n", SDL_WasInit(0));
+ // -------------------------------------------
+ // Play back input instead of accepting any user input
+ // ----------------------
+ #ifdef RERECORDING
+ Recording::ShutDown();
+ #endif
+ // ----------------------
+
// Always change this variable
g_EmulatorRunning = false;
@@ -378,7 +364,12 @@ void PAD_Input(u16 _Key, u8 _UpDown)
// Save state
// ŻŻŻŻŻŻŻŻŻŻŻŻŻŻ
-void DoState(unsigned char **ptr, int mode) {}
+void DoState(unsigned char **ptr, int mode)
+{
+#ifdef RERECORDING
+ Recording::DoState(ptr, mode);
+#endif
+}
// Set PAD attached pads
@@ -412,6 +403,18 @@ void PAD_GetStatus(u8 _numPAD, SPADStatus* _pPADStatus)
disconnected */
if (!PadMapping[_numPAD].enabled || !PadState[_numPAD].joy) return;
+ // -------------------------------------------
+ // Play back input instead of accepting any user input
+ // ----------------------
+ #ifdef RERECORDING
+ if (g_Config.bPlayback)
+ {
+ *_pPADStatus = Recording::Play();
+ return;
+ }
+ #endif
+ // ----------------------
+
// Clear pad status
memset(_pPADStatus, 0, sizeof(SPADStatus));
@@ -544,6 +547,15 @@ void PAD_GetStatus(u8 _numPAD, SPADStatus* _pPADStatus)
// Use rumble
Pad_Use_Rumble(_numPAD, _pPADStatus);
+ // -------------------------------------------
+ // Rerecording
+ // ----------------------
+ #ifdef RERECORDING
+ // Record input
+ if (g_Config.bRecording) Recording::RecordInput(*_pPADStatus);
+ #endif
+ // ----------------------
+
// Debugging
/*
// Show the status of all connected pads
@@ -575,6 +587,36 @@ void PAD_GetStatus(u8 _numPAD, SPADStatus* _pPADStatus)
// Supporting functions
//******************************************************************************
+
+//////////////////////////////////////////////////////////////////////////////////////////
+// Search for SDL devices
+// ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ
+bool Search_Devices(std::vector &_joyinfo, int &_NumPads, int &_NumGoodPads)
+{
+ bool Success = InputCommon::SearchDevices(_joyinfo, _NumPads, _NumGoodPads);
+
+ // Warn the user if no gamepads are detected
+ if (_NumGoodPads == 0 && g_EmulatorRunning)
+ {
+ PanicAlert("nJoy: No Gamepad Detected");
+ return false;
+ }
+
+ // Load PadMapping[] etc
+ g_Config.Load();
+
+ // Update the PadState[].joy handle
+ for (int i = 0; i < 4; i++)
+ {
+ if (PadMapping[i].enabled && joyinfo.size() > PadMapping[i].ID)
+ if(joyinfo.at(PadMapping[i].ID).Good)
+ PadState[i].joy = SDL_JoystickOpen(PadMapping[i].ID);
+ }
+
+ return Success;
+}
+
+
//////////////////////////////////////////////////////////////////////////////////////////
/* Check if any of the pads failed to open. In Windows there is a strange "IDirectInputDevice2::
SetDataFormat() DirectX error -2147024809" after exactly four SDL_Init() and SDL_Quit() */
diff --git a/Source/Plugins/Plugin_nJoy_SDL/Src/nJoy.h b/Source/Plugins/Plugin_nJoy_SDL/Src/nJoy.h
index ed4d6e3387..44f5e383da 100644
--- a/Source/Plugins/Plugin_nJoy_SDL/Src/nJoy.h
+++ b/Source/Plugins/Plugin_nJoy_SDL/Src/nJoy.h
@@ -54,6 +54,7 @@
#include "../../../Core/InputCommon/Src/XInput.h"
#include "Common.h" // Common
+#include "Setup.h"
#include "pluginspecs_pad.h"
#include "IniFile.h"
#include "ConsoleWindow.h"
@@ -122,6 +123,7 @@ extern std::vector Keys;
// Variables
// ŻŻŻŻŻŻŻŻŻ
#ifndef _EXCLUDE_MAIN_
+ extern SPADInitialize *g_PADInitialize;
extern FILE *pFile;
extern std::vector joyinfo;
extern InputCommon::CONTROLLER_STATE PadState[4];
@@ -131,6 +133,7 @@ extern std::vector Keys;
#endif
extern int NumPads, NumGoodPads, LastPad; // Number of goods pads
#endif
+////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////
@@ -146,6 +149,25 @@ void Pad_Use_Rumble(u8 _numPAD, SPADStatus* _pPADStatus); // Rumble
//void SaveConfig();
//void LoadConfig();
+////////////////////////////////
+
+
+//////////////////////////////////////////////////////////////////////////////////////////
+// ReRecording
+// ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ
+#ifdef RERECORDING
+namespace Recording
+{
+ void Initialize();
+ void DoState(unsigned char **ptr, int mode);
+ void ShutDown();
+ void Save();
+ void Load();
+ const SPADStatus& Play();
+ void RecordInput(const SPADStatus& _rPADStatus);
+}
+#endif
+////////////////////////////////
#endif __NJOY_h__
\ No newline at end of file