From 9e63cebc935b13192cb5fe567c7413ae9c5ed2b1 Mon Sep 17 00:00:00 2001 From: "Jasper St. Pierre" Date: Mon, 5 Aug 2013 04:56:30 -0400 Subject: [PATCH] NetPlay: Remove the base NetPlay class It's only used by the NetPlayClient. For now, keep around NetPlay.cpp, but we'll remove that soon. --- Source/Core/Core/Src/BootManager.cpp | 2 +- Source/Core/Core/Src/HW/SI.cpp | 4 +- Source/Core/Core/Src/NetPlay.cpp | 129 ++++++++----------------- Source/Core/Core/Src/NetPlay.h | 54 ++++------- Source/Core/Core/Src/NetPlayClient.cpp | 36 ++++++- 5 files changed, 95 insertions(+), 130 deletions(-) diff --git a/Source/Core/Core/Src/BootManager.cpp b/Source/Core/Core/Src/BootManager.cpp index c9a8568205..fff61f7c1e 100644 --- a/Source/Core/Core/Src/BootManager.cpp +++ b/Source/Core/Core/Src/BootManager.cpp @@ -138,7 +138,7 @@ bool BootCore(const std::string& _rFilename) } } - if (NetPlay::GetNetPlayPtr()) + if (NetPlay::IsNetPlayRunning()) { StartUp.bDSPHLE = g_NetPlaySettings.m_DSPHLE; StartUp.bEnableMemcardSaving = g_NetPlaySettings.m_WriteToMemcard; diff --git a/Source/Core/Core/Src/HW/SI.cpp b/Source/Core/Core/Src/HW/SI.cpp index 85c84f92dd..291215fe1c 100644 --- a/Source/Core/Core/Src/HW/SI.cpp +++ b/Source/Core/Core/Src/HW/SI.cpp @@ -262,7 +262,7 @@ void Init() if (Movie::IsRecordingInput() || Movie::IsPlayingInput()) AddDevice(Movie::IsUsingPad(i) ? (Movie::IsUsingBongo(i) ? SIDEVICE_GC_TARUKONGA : SIDEVICE_GC_CONTROLLER) : SIDEVICE_NONE, i); - else if (NetPlay::GetNetPlayPtr()) + else if (NetPlay::IsNetPlayRunning()) AddDevice((SIDevices) g_NetPlaySettings.m_Controllers[i], i); else AddDevice(SConfig::GetInstance().m_SIDevice[i], i); @@ -644,7 +644,7 @@ void RunSIBuffer() int GetTicksToNextSIPoll() { // Poll for input at regular intervals (once per frame) when playing or recording a movie - if (Movie::IsPlayingInput() || Movie::IsRecordingInput() || NetPlay::GetNetPlayPtr()) + if (Movie::IsPlayingInput() || Movie::IsRecordingInput() || NetPlay::IsNetPlayRunning()) { return SystemTimers::GetTicksPerSecond() / VideoInterface::TargetRefreshRate; } diff --git a/Source/Core/Core/Src/NetPlay.cpp b/Source/Core/Core/Src/NetPlay.cpp index d192a19506..ba0eca0b50 100644 --- a/Source/Core/Core/Src/NetPlay.cpp +++ b/Source/Core/Core/Src/NetPlay.cpp @@ -17,50 +17,19 @@ #include "Core.h" #include "ConfigManager.h" -std::mutex crit_netplay_ptr; -static NetPlay* netplay_ptr = NULL; +std::mutex crit_netplay_client; +static NetPlayClient * netplay_client = NULL; NetSettings g_NetPlaySettings; #define RPT_SIZE_HACK (1 << 16) -// called from ---GUI--- thread -NetPlay::NetPlay(NetPlayUI* dialog) - : m_dialog(dialog), m_is_running(false), m_do_loop(true) -{ - m_target_buffer_size = 20; - ClearBuffers(); -} - -void NetPlay_Enable(NetPlay* const np) -{ - std::lock_guard lk(crit_netplay_ptr); - netplay_ptr = np; -} - -void NetPlay_Disable() -{ - std::lock_guard lk(crit_netplay_ptr); - netplay_ptr = NULL; -} - -// called from ---GUI--- thread -NetPlay::~NetPlay() -{ - std::lock_guard lk(crit_netplay_ptr); - netplay_ptr = NULL; - - // not perfect - if (m_is_running) - StopGame(); -} - -NetPlay::Player::Player() +NetPlayClient::Player::Player() { memset(pad_map, -1, sizeof(pad_map)); } // called from ---GUI--- thread -std::string NetPlay::Player::ToString() const +std::string NetPlayClient::Player::ToString() const { std::ostringstream ss; ss << name << '[' << (char)(pid+'0') << "] : " << revision << " |"; @@ -89,7 +58,7 @@ NetPad::NetPad(const SPADStatus* const pad_status) } // called from ---NETPLAY--- thread -void NetPlay::ClearBuffers() +void NetPlayClient::ClearBuffers() { // clear pad buffers, Clear method isn't thread safe for (unsigned int i=0; i<4; ++i) @@ -105,7 +74,7 @@ void NetPlay::ClearBuffers() } // called from ---CPU--- thread -bool NetPlay::GetNetPads(const u8 pad_nb, const SPADStatus* const pad_status, NetPad* const netvalues) +bool NetPlayClient::GetNetPads(const u8 pad_nb, const SPADStatus* const pad_status, NetPad* const netvalues) { { std::lock_guard lkp(m_crit.players); @@ -161,7 +130,7 @@ bool NetPlay::GetNetPads(const u8 pad_nb, const SPADStatus* const pad_status, Ne } // called from ---CPU--- thread -void NetPlay::WiimoteInput(int _number, u16 _channelID, const void* _pData, u32 _Size) +void NetPlayClient::WiimoteInput(int _number, u16 _channelID, const void* _pData, u32 _Size) { //// in game mapping for this local wiimote unsigned int in_game_num = m_local_player->pad_map[_number]; // just using gc pad_map for now @@ -176,7 +145,7 @@ void NetPlay::WiimoteInput(int _number, u16 _channelID, const void* _pData, u32 } // called from ---CPU--- thread -void NetPlay::WiimoteUpdate(int _number) +void NetPlayClient::WiimoteUpdate(int _number) { { std::lock_guard lkp(m_crit.players); @@ -211,36 +180,8 @@ void NetPlay::WiimoteUpdate(int _number) Core::Callback_WiimoteInterruptChannel(_number, i->channel, &(*i)[0], (u32)i->size() + RPT_SIZE_HACK); } -// called from ---GUI--- thread -bool NetPlay::StartGame(const std::string &path) -{ - if (m_is_running) - { - PanicAlertT("Game is already running!"); - return false; - } - - m_dialog->AppendChat(" -- STARTING GAME -- "); - - m_is_running = true; - NetPlay_Enable(this); - - ClearBuffers(); - - // boot game - m_dialog->BootGame(path); - - // temporary - NetWiimote nw; - for (unsigned int i = 0; i<4; ++i) - for (unsigned int f = 0; f<2; ++f) - m_wiimote_buffer[i].Push(nw); - - return true; -} - // called from ---GUI--- thread and ---NETPLAY--- thread (client side) -bool NetPlay::StopGame() +bool NetPlayClient::StopGame() { std::lock_guard lkg(m_crit.game); @@ -262,7 +203,7 @@ bool NetPlay::StopGame() } // called from ---CPU--- thread -u8 NetPlay::GetPadNum(u8 numPAD) +u8 NetPlayClient::GetPadNum(u8 numPAD) { // TODO: i don't like that this loop is running everytime there is rumble unsigned int i = 0; @@ -279,10 +220,10 @@ u8 NetPlay::GetPadNum(u8 numPAD) // Actual Core function which is called on every frame bool CSIDevice_GCController::NetPlay_GetInput(u8 numPAD, SPADStatus PadStatus, u32 *PADStatus) { - std::lock_guard lk(crit_netplay_ptr); + std::lock_guard lk(crit_netplay_client); - if (netplay_ptr) - return netplay_ptr->GetNetPads(numPAD, &PadStatus, (NetPad*)PADStatus); + if (netplay_client) + return netplay_client->GetNetPads(numPAD, &PadStatus, (NetPad*)PADStatus); else return false; } @@ -301,9 +242,9 @@ bool CSIDevice_DanceMat::NetPlay_GetInput(u8 numPAD, SPADStatus PadStatus, u32 * // so all players' games get the same time u32 CEXIIPL::NetPlay_GetGCTime() { - std::lock_guard lk(crit_netplay_ptr); + std::lock_guard lk(crit_netplay_client); - if (netplay_ptr) + if (netplay_client) return 1272737767; // watev else return 0; @@ -313,10 +254,10 @@ u32 CEXIIPL::NetPlay_GetGCTime() // return the local pad num that should rumble given a ingame pad num u8 CSIDevice_GCController::NetPlay_GetPadNum(u8 numPAD) { - std::lock_guard lk(crit_netplay_ptr); + std::lock_guard lk(crit_netplay_client); - if (netplay_ptr) - return netplay_ptr->GetPadNum(numPAD); + if (netplay_client) + return netplay_client->GetPadNum(numPAD); else return numPAD; } @@ -336,20 +277,20 @@ u8 CSIDevice_DanceMat::NetPlay_GetPadNum(u8 numPAD) //void CWII_IPC_HLE_Device_usb_oh1_57e_305::NetPlay_WiimoteUpdate(int _number) void CWII_IPC_HLE_Device_usb_oh1_57e_305::NetPlay_WiimoteUpdate(int) { - //CritLocker crit(crit_netplay_ptr); + //CritLocker crit(crit_netplay_client); - //if (netplay_ptr) - // netplay_ptr->WiimoteUpdate(_number); + //if (netplay_client) + // netplay_client->WiimoteUpdate(_number); } // called from ---CPU--- thread // int CWII_IPC_HLE_WiiMote::NetPlay_GetWiimoteNum(int _number) { - //CritLocker crit(crit_netplay_ptr); + //CritLocker crit(crit_netplay_client); - //if (netplay_ptr) - // return netplay_ptr->GetPadNum(_number); // just using gcpad mapping for now + //if (netplay_client) + // return netplay_client->GetPadNum(_number); // just using gcpad mapping for now //else return _number; } @@ -359,9 +300,9 @@ int CWII_IPC_HLE_WiiMote::NetPlay_GetWiimoteNum(int _number) //bool CWII_IPC_HLE_WiiMote::NetPlay_WiimoteInput(int _number, u16 _channelID, const void* _pData, u32& _Size) bool CWII_IPC_HLE_WiiMote::NetPlay_WiimoteInput(int, u16, const void*, u32&) { - std::lock_guard lk(crit_netplay_ptr); + std::lock_guard lk(crit_netplay_client); - if (netplay_ptr) + if (netplay_client) //{ // if (_Size >= RPT_SIZE_HACK) // { @@ -370,7 +311,7 @@ bool CWII_IPC_HLE_WiiMote::NetPlay_WiimoteInput(int, u16, const void*, u32&) // } // else // { - // netplay_ptr->WiimoteInput(_number, _channelID, _pData, _Size); + // netplay_client->WiimoteInput(_number, _channelID, _pData, _Size); // // don't use this packet return true; // } @@ -379,7 +320,19 @@ bool CWII_IPC_HLE_WiiMote::NetPlay_WiimoteInput(int, u16, const void*, u32&) return false; } -NetPlay* NetPlay::GetNetPlayPtr() +bool NetPlay::IsNetPlayRunning() { - return netplay_ptr; + return netplay_client != NULL; +} + +void NetPlay_Enable(NetPlayClient* const np) +{ + std::lock_guard lk(crit_netplay_client); + netplay_client = np; +} + +void NetPlay_Disable() +{ + std::lock_guard lk(crit_netplay_client); + netplay_client = NULL; } diff --git a/Source/Core/Core/Src/NetPlay.h b/Source/Core/Core/Src/NetPlay.h index 68fb615850..18e98a2b9e 100644 --- a/Source/Core/Core/Src/NetPlay.h +++ b/Source/Core/Core/Src/NetPlay.h @@ -50,33 +50,32 @@ public: extern NetSettings g_NetPlaySettings; -class NetPlay +class NetPlayClient { public: - NetPlay(NetPlayUI* _dialog); - virtual ~NetPlay(); - //virtual void ThreadFunc() = 0; + void ThreadFunc(); + + NetPlayClient(const std::string& address, const u16 port, NetPlayUI* dialog, const std::string& name); + ~NetPlayClient(); + + void GetPlayerList(std::string& list, std::vector& pid_list); bool is_connected; - + + bool StartGame(const std::string &path); + bool StopGame(); + bool ChangeGame(const std::string& game); + void SendChatMessage(const std::string& msg); + // Send and receive pads values void WiimoteInput(int _number, u16 _channelID, const void* _pData, u32 _Size); void WiimoteUpdate(int _number); bool GetNetPads(const u8 pad_nb, const SPADStatus* const, NetPad* const netvalues); - virtual bool ChangeGame(const std::string& game) = 0; - virtual void GetPlayerList(std::string& list, std::vector& pid_list) = 0; - virtual void SendChatMessage(const std::string& msg) = 0; - - virtual bool StartGame(const std::string &path); - virtual bool StopGame(); u8 GetPadNum(u8 numPAD); - static NetPlay* GetNetPlayPtr(); protected: - //void GetBufferedPad(const u8 pad_nb, NetPad* const netvalues); void ClearBuffers(); - virtual void SendPadState(const PadMapping local_nb, const NetPad& np) = 0; struct { @@ -116,26 +115,6 @@ protected: Player* m_local_player; u32 m_current_game; -}; - -void NetPlay_Enable(NetPlay* const np); -void NetPlay_Disable(); - -class NetPlayClient : public NetPlay -{ -public: - void ThreadFunc(); - - NetPlayClient(const std::string& address, const u16 port, NetPlayUI* dialog, const std::string& name); - ~NetPlayClient(); - - void GetPlayerList(std::string& list, std::vector& pid_list); - - // Send and receive pads values - //bool GetNetPads(const u8 pad_nb, const SPADStatus* const, NetPad* const netvalues); - bool StartGame(const std::string &path); - bool ChangeGame(const std::string& game); - void SendChatMessage(const std::string& msg); private: void SendPadState(const PadMapping local_nb, const NetPad& np); @@ -145,4 +124,11 @@ private: std::map m_players; }; +namespace NetPlay { + bool IsNetPlayRunning(); +}; + +void NetPlay_Enable(NetPlayClient* const np); +void NetPlay_Disable(); + #endif diff --git a/Source/Core/Core/Src/NetPlayClient.cpp b/Source/Core/Core/Src/NetPlayClient.cpp index 7163be001a..ec3b811034 100644 --- a/Source/Core/Core/Src/NetPlayClient.cpp +++ b/Source/Core/Core/Src/NetPlayClient.cpp @@ -7,16 +7,23 @@ // called from ---GUI--- thread NetPlayClient::~NetPlayClient() { + // not perfect + if (m_is_running) + StopGame(); + if (is_connected) { m_do_loop = false; m_thread.join(); - } + } } // called from ---GUI--- thread -NetPlayClient::NetPlayClient(const std::string& address, const u16 port, NetPlayUI* dialog, const std::string& name) : NetPlay(dialog) +NetPlayClient::NetPlayClient(const std::string& address, const u16 port, NetPlayUI* dialog, const std::string& name) : m_dialog(dialog), m_is_running(false), m_do_loop(true) { + m_target_buffer_size = 20; + ClearBuffers(); + is_connected = false; // why is false successful? documentation says true is @@ -328,12 +335,31 @@ bool NetPlayClient::StartGame(const std::string &path) spac << m_current_game; spac << (char *)&g_NetPlaySettings; - if (false == NetPlay::StartGame(path)) - return false; - std::lock_guard lks(m_crit.send); m_socket.Send(spac); + if (m_is_running) + { + PanicAlertT("Game is already running!"); + return false; + } + + m_dialog->AppendChat(" -- STARTING GAME -- "); + + m_is_running = true; + NetPlay_Enable(this); + + ClearBuffers(); + + // boot game + m_dialog->BootGame(path); + + // temporary + NetWiimote nw; + for (unsigned int i = 0; i<4; ++i) + for (unsigned int f = 0; f<2; ++f) + m_wiimote_buffer[i].Push(nw); + return true; }