From b962c1f3920b92d504937e6a1f826c6750fa780c Mon Sep 17 00:00:00 2001 From: mimimi085181 Date: Fri, 8 Jul 2016 23:08:35 +0200 Subject: [PATCH 1/2] Fix running more than one session with Wiimotes A static var is not a good idea, when the value needs to be reset for every session. Also, the variable holds the data size, so it makes sense to set the data size, where the data is added. --- Source/Core/Core/NetPlayClient.cpp | 12 ++++++------ Source/Core/Core/NetPlayClient.h | 1 + 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/Source/Core/Core/NetPlayClient.cpp b/Source/Core/Core/NetPlayClient.cpp index 223b310648..5d8aee550a 100644 --- a/Source/Core/Core/NetPlayClient.cpp +++ b/Source/Core/Core/NetPlayClient.cpp @@ -722,6 +722,7 @@ bool NetPlayClient::StartGame(const std::string& path) // Needed to prevent locking up at boot if (when) the wiimotes connect out of order. NetWiimote nw; nw.resize(4, 0); + m_wiimote_current_data_size = {4, 4, 4, 4}; for (unsigned int w = 0; w < 4; ++w) { @@ -923,7 +924,6 @@ bool NetPlayClient::GetNetPads(const u8 pad_nb, GCPadStatus* pad_status) bool NetPlayClient::WiimoteUpdate(int _number, u8* data, const u8 size) { NetWiimote nw; - static u8 previousSize[4] = {4, 4, 4, 4}; { std::lock_guard lkp(m_crit.players); @@ -932,7 +932,7 @@ bool NetPlayClient::WiimoteUpdate(int _number, u8* data, const u8 size) // does this local Wiimote map in game? if (in_game_num < 4) { - if (previousSize[in_game_num] == size) + if (m_wiimote_current_data_size[in_game_num] == size) { nw.assign(data, data + size); do @@ -960,13 +960,13 @@ bool NetPlayClient::WiimoteUpdate(int _number, u8* data, const u8 size) m_wiimote_buffer[in_game_num].Push(nw); m_wiimote_buffer[in_game_num].Push(nw); m_wiimote_buffer[in_game_num].Push(nw); - previousSize[in_game_num] = size; + m_wiimote_current_data_size[in_game_num] = size; } } } // unlock players - while (previousSize[_number] == size && !m_wiimote_buffer[_number].Pop(nw)) + while (m_wiimote_current_data_size[_number] == size && !m_wiimote_buffer[_number].Pop(nw)) { // wait for receiving thread to push some data Common::SleepCurrentThread(1); @@ -975,7 +975,7 @@ bool NetPlayClient::WiimoteUpdate(int _number, u8* data, const u8 size) } // Use a blank input, since we may not have any valid input. - if (previousSize[_number] != size) + if (m_wiimote_current_data_size[_number] != size) { nw.resize(size, 0); m_wiimote_buffer[_number].Push(nw); @@ -1012,7 +1012,7 @@ bool NetPlayClient::WiimoteUpdate(int _number, u8* data, const u8 size) } } - previousSize[_number] = size; + m_wiimote_current_data_size[_number] = size; memcpy(data, nw.data(), size); return true; } diff --git a/Source/Core/Core/NetPlayClient.h b/Source/Core/Core/NetPlayClient.h index 33d94e9cfc..8853f9ca35 100644 --- a/Source/Core/Core/NetPlayClient.h +++ b/Source/Core/Core/NetPlayClient.h @@ -99,6 +99,7 @@ protected: std::array, 4> m_pad_buffer; std::array, 4> m_wiimote_buffer; + std::array m_wiimote_current_data_size; NetPlayUI* m_dialog = nullptr; From de7b2f984a924f6b8a8b7be46972a03dd30decbc Mon Sep 17 00:00:00 2001 From: mimimi085181 Date: Fri, 8 Jul 2016 23:15:38 +0200 Subject: [PATCH 2/2] Make tries a u32 Before this variable was an u8, which could theoretically result in desyncs with a large buffer(greater than 255*120/200=153) filled with blank inputs. If this could actually happen, i don't know. But this part of the code on its own looks like it could break. --- Source/Core/Core/NetPlayClient.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Core/Core/NetPlayClient.cpp b/Source/Core/Core/NetPlayClient.cpp index 5d8aee550a..e0639e9c1e 100644 --- a/Source/Core/Core/NetPlayClient.cpp +++ b/Source/Core/Core/NetPlayClient.cpp @@ -989,7 +989,7 @@ bool NetPlayClient::WiimoteUpdate(int _number, u8* data, const u8 size) // until we reach a good input if (nw.size() != size) { - u8 tries = 0; + u32 tries = 0; // Clear the buffer and wait for new input, since we probably just changed reporting mode. while (nw.size() != size) {