Skip to content

Commit 120169a

Browse files
authored
Merge pull request #1 from ilikepizza107/master
Default to the traversal server
2 parents 4f415ea + 28d0ea2 commit 120169a

File tree

11 files changed

+181
-71
lines changed

11 files changed

+181
-71
lines changed

Data/user/Config/Dolphin.ini

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,4 @@ ISOPath0 = ./Launcher
77
ISOPath1 = ./Games
88
[NetPlay]
99
SelectedHostGame = Project+ Netplay Launcher.elf
10+
TraversalChoice = traversal

Source/Core/Core/Config/NetplaySettings.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,8 @@ const Info<bool> NETPLAY_ENABLE_CHUNKED_UPLOAD_LIMIT{
4343
{System::Main, "NetPlay", "EnableChunkedUploadLimit"}, false};
4444
const Info<u32> NETPLAY_CHUNKED_UPLOAD_LIMIT{{System::Main, "NetPlay", "ChunkedUploadLimit"}, 3000};
4545

46-
const Info<u32> NETPLAY_BUFFER_SIZE{{System::Main, "NetPlay", "BufferSize"}, 2};
46+
const Info<u32> NETPLAY_MINIMUM_BUFFER_SIZE{{System::Main, "NetPlay", "MinimumBufferSize"}, 2};
47+
const Info<u32> NETPLAY_PLAYER_BUFFER_SIZE{{System::Main, "NetPlay", "PlayerBufferSize"}, 2};
4748
const Info<u32> NETPLAY_CLIENT_BUFFER_SIZE{{System::Main, "NetPlay", "BufferSizeClient"}, 1};
4849

4950
const Info<bool> NETPLAY_SAVEDATA_LOAD{{System::Main, "NetPlay", "SyncSaves"}, true};

Source/Core/Core/Config/NetplaySettings.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,8 @@ extern const Info<std::string> NETPLAY_INDEX_PASSWORD;
3939
extern const Info<bool> NETPLAY_ENABLE_CHUNKED_UPLOAD_LIMIT;
4040
extern const Info<u32> NETPLAY_CHUNKED_UPLOAD_LIMIT;
4141

42-
extern const Info<u32> NETPLAY_BUFFER_SIZE;
42+
extern const Info<u32> NETPLAY_MINIMUM_BUFFER_SIZE;
43+
extern const Info<u32> NETPLAY_PLAYER_BUFFER_SIZE;
4344
extern const Info<u32> NETPLAY_CLIENT_BUFFER_SIZE;
4445

4546
extern const Info<bool> NETPLAY_SAVEDATA_LOAD;

Source/Core/Core/NetPlayClient.cpp

Lines changed: 55 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
#include "Core/Config/SessionSettings.h"
4242
#include "Core/Config/WiimoteSettings.h"
4343
#include "Core/ConfigManager.h"
44+
#include "Core/Core.h"
4445
#include "Core/GeckoCode.h"
4546
#include "Core/HW/EXI/EXI.h"
4647
#include "Core/HW/EXI/EXI_DeviceIPL.h"
@@ -82,7 +83,7 @@ namespace NetPlay
8283
using namespace WiimoteCommon;
8384

8485
static std::mutex crit_netplay_client;
85-
static NetPlayClient* netplay_client = nullptr;
86+
NetPlayClient* netplay_client = nullptr;
8687
static bool s_si_poll_batching = false;
8788

8889
// called from ---GUI--- thread
@@ -309,6 +310,7 @@ bool NetPlayClient::Connect()
309310
player.name = m_player_name;
310311
player.pid = m_pid;
311312
player.revision = Common::GetNetplayDolphinVer();
313+
player.buffer = 0 /* will be raised once we get the packet */;
312314

313315
// add self to player list
314316
m_players[m_pid] = player;
@@ -322,6 +324,31 @@ bool NetPlayClient::Connect()
322324
}
323325
}
324326

327+
// called from ---GUI--- and ---NETPLAY--- thread
328+
void NetPlayClient::AdjustPlayerPadBufferSize(u32 buffer)
329+
{
330+
std::lock_guard<std::recursive_mutex> lkp(m_crit.players);
331+
332+
m_local_player->buffer = buffer;
333+
if (m_local_player->buffer < m_minimum_buffer_size)
334+
m_local_player->buffer = m_minimum_buffer_size;
335+
336+
// need to rewrite this area
337+
338+
/* auto spac = std::make_unique<sf::Packet>();
339+
*spac << static_cast <MessageID>(OnPadBufferPlayer);
340+
*spac << local_player->buffer;
341+
SendAsync(std::move(spac)); */
342+
343+
m_dialog->OnPlayerPadBufferChanged(m_local_player->buffer);
344+
}
345+
346+
void NetPlayClient::AdjustMinimumPadBufferSize(const unsigned int size)
347+
{
348+
m_minimum_buffer_size = size;
349+
m_dialog->OnMinimumPadBufferChanged(size);
350+
}
351+
325352
static void ReceiveSyncIdentifier(sf::Packet& spac, SyncIdentifier& sync_identifier)
326353
{
327354
// We use a temporary variable here due to a potential long vs long long mismatch
@@ -400,8 +427,12 @@ void NetPlayClient::OnData(sf::Packet& packet)
400427
OnWiimoteData(packet);
401428
break;
402429

403-
case MessageID::PadBuffer:
404-
OnPadBuffer(packet);
430+
case MessageID::PadBufferMinimum:
431+
OnPadBufferMinimum(packet);
432+
break;
433+
434+
case MessageID::PadBufferPlayer:
435+
OnPadBufferPlayer(packet);
405436
break;
406437

407438
case MessageID::HostInputAuthority:
@@ -751,13 +782,28 @@ void NetPlayClient::OnWiimoteData(sf::Packet& packet)
751782
}
752783
}
753784

754-
void NetPlayClient::OnPadBuffer(sf::Packet& packet)
785+
void NetPlayClient::OnPadBufferMinimum(sf::Packet& packet)
755786
{
756787
u32 size = 0;
757788
packet >> size;
789+
790+
m_minimum_buffer_size = size;
791+
m_dialog->OnMinimumPadBufferChanged(size);
758792

759-
m_target_buffer_size = size;
760-
m_dialog->OnPadBufferChanged(size);
793+
if (m_local_player->buffer < m_minimum_buffer_size)
794+
AdjustPlayerPadBufferSize(m_minimum_buffer_size);
795+
}
796+
797+
798+
void NetPlayClient::OnPadBufferPlayer(sf::Packet& packet)
799+
{
800+
PlayerId pid;
801+
packet >> pid;
802+
803+
{
804+
std::lock_guard<std::recursive_mutex> lkp(m_crit.players);
805+
packet >> m_players[pid].buffer;
806+
}
761807
}
762808

763809
void NetPlayClient::OnHostInputAuthority(sf::Packet& packet)
@@ -2084,7 +2130,7 @@ bool NetPlayClient::GetNetPads(const int pad_nb, const bool batching, GCPadStatu
20842130
// we toggle the emulation speed too quickly, so to prevent this
20852131
// we wait until the buffer has been over for at least 1 second.
20862132

2087-
const bool buffer_over_target = m_pad_buffer[pad_nb].Size() > m_target_buffer_size + 1;
2133+
const bool buffer_over_target = m_pad_buffer[pad_nb].Size() > m_minimum_buffer_size + 1;
20882134
if (!buffer_over_target)
20892135
m_buffer_under_target_last = std::chrono::steady_clock::now();
20902136

@@ -2214,7 +2260,7 @@ bool NetPlayClient::PollLocalPad(const int local_pad, sf::Packet& packet)
22142260
{
22152261
// adjust the buffer either up or down
22162262
// inserting multiple padstates or dropping states
2217-
while (m_pad_buffer[ingame_pad].Size() <= m_target_buffer_size)
2263+
while (m_pad_buffer[ingame_pad].Size() <= m_minimum_buffer_size)
22182264
{
22192265
// add to buffer
22202266
m_pad_buffer[ingame_pad].Push(pad_status);
@@ -2237,7 +2283,7 @@ bool NetPlayClient::AddLocalWiimoteToBuffer(const int local_wiimote,
22372283

22382284
// adjust the buffer either up or down
22392285
// inserting multiple padstates or dropping states
2240-
while (m_wiimote_buffer[ingame_pad].Size() <= m_target_buffer_size)
2286+
while (m_wiimote_buffer[ingame_pad].Size() <= m_minimum_buffer_size)
22412287
{
22422288
// add to buffer
22432289
m_wiimote_buffer[ingame_pad].Push(state);
@@ -2636,12 +2682,6 @@ const PadMappingArray& NetPlayClient::GetWiimoteMapping() const
26362682
return m_wiimote_map;
26372683
}
26382684

2639-
void NetPlayClient::AdjustPadBufferSize(const unsigned int size)
2640-
{
2641-
m_target_buffer_size = size;
2642-
m_dialog->OnPadBufferChanged(size);
2643-
}
2644-
26452685
void NetPlayClient::SetWiiSyncData(std::unique_ptr<IOS::HLE::FS::FileSystem> fs,
26462686
std::vector<u64> titles, std::string redirect_folder)
26472687
{

Source/Core/Core/NetPlayClient.h

Lines changed: 37 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,8 @@ class NetPlayUI
6363
virtual void OnMsgPowerButton() = 0;
6464
virtual void OnPlayerConnect(const std::string& player) = 0;
6565
virtual void OnPlayerDisconnect(const std::string& player) = 0;
66-
virtual void OnPadBufferChanged(u32 buffer) = 0;
66+
virtual void OnMinimumPadBufferChanged(u32 buffer) = 0;
67+
virtual void OnPlayerPadBufferChanged(u32 buffer) = 0;
6768
virtual void OnHostInputAuthorityChanged(bool enabled) = 0;
6869
virtual void OnDesync(u32 frame, const std::string& player) = 0;
6970
virtual void OnConnectionLost() = 0;
@@ -103,6 +104,7 @@ class Player
103104
std::string name;
104105
std::string revision;
105106
u32 ping = 0;
107+
u32 buffer = 0;
106108
SyncIdentifierComparison game_status = SyncIdentifierComparison::Unknown;
107109

108110
bool IsHost() const { return pid == 1; }
@@ -167,12 +169,40 @@ class NetPlayClient : public Common::TraversalClientClient
167169

168170
static void SendTimeBase();
169171
bool DoAllPlayersHaveGame();
172+
173+
void AdjustPlayerPadBufferSize(u32 buffer);
174+
175+
// the number of ticks in-between frames
176+
constexpr static int buffer_accuracy = 4;
177+
178+
inline u32 BufferSizeForPort(int pad) const
179+
{
180+
if (m_pad_map[pad] <= 0)
181+
return 0;
182+
183+
return std::max(m_minimum_buffer_size, m_players.at(m_pad_map.at(pad)).buffer);
184+
}
185+
186+
// used for chat, not the best place for it
187+
inline std::string FindPlayerPadName(const Player* player) const
188+
{
189+
for (int i = 0; i < 4; i++)
190+
{
191+
if (m_pad_map[i] == player->pid)
192+
return " (port " + std::to_string(i + 1) + ")";
193+
}
194+
195+
return "";
196+
}
197+
198+
NetPlayUI* dialog = nullptr;
199+
Player* local_player = nullptr;
170200

171201
const PadMappingArray& GetPadMapping() const;
172202
const GBAConfigArray& GetGBAConfig() const;
173203
const PadMappingArray& GetWiimoteMapping() const;
174204

175-
void AdjustPadBufferSize(unsigned int size);
205+
void AdjustMinimumPadBufferSize(unsigned int size);
176206

177207
void SetWiiSyncData(std::unique_ptr<IOS::HLE::FS::FileSystem> fs, std::vector<u64> titles,
178208
std::string redirect_folder);
@@ -221,7 +251,7 @@ class NetPlayClient : public Common::TraversalClientClient
221251
// try to keep in-flight to the other clients. In host input authority mode, this is how
222252
// many incoming input packets need to be queued up before the client starts
223253
// speeding up the game to drain the buffer.
224-
unsigned int m_target_buffer_size = 20;
254+
unsigned int m_minimum_buffer_size = 2;
225255
bool m_host_input_authority = false;
226256
PlayerId m_current_golfer = 1;
227257

@@ -289,7 +319,8 @@ class NetPlayClient : public Common::TraversalClientClient
289319
void OnPadData(sf::Packet& packet);
290320
void OnPadHostData(sf::Packet& packet);
291321
void OnWiimoteData(sf::Packet& packet);
292-
void OnPadBuffer(sf::Packet& packet);
322+
void OnPadBufferMinimum(sf::Packet& packet);
323+
void OnPadBufferPlayer(sf::Packet& packet);
293324
void OnHostInputAuthority(sf::Packet& packet);
294325
void OnGolfSwitch(sf::Packet& packet);
295326
void OnGolfPrepare(sf::Packet& packet);
@@ -357,4 +388,6 @@ void NetPlay_Enable(NetPlayClient* const np);
357388
void NetPlay_Disable();
358389
bool NetPlay_GetWiimoteData(const std::span<NetPlayClient::WiimoteDataBatchEntry>& entries);
359390
unsigned int NetPlay_GetLocalWiimoteForSlot(unsigned int slot);
391+
392+
extern NetPlayClient* netplay_client;
360393
} // namespace NetPlay

Source/Core/Core/NetPlayProto.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,9 +148,10 @@ enum class MessageID : u8
148148

149149
PadData = 0x60,
150150
PadMapping = 0x61,
151-
PadBuffer = 0x62,
151+
PadBufferMinimum = 0x62,
152152
PadHostData = 0x63,
153153
GBAConfig = 0x64,
154+
PadBufferPlayer = 0x66,
154155

155156
WiimoteData = 0x70,
156157
WiimoteMapping = 0x71,

Source/Core/Core/NetPlayServer.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ NetPlayServer::NetPlayServer(const u16 port, const bool forward_port, NetPlayUI*
168168
is_connected = true;
169169
m_do_loop = true;
170170
m_thread = std::thread(&NetPlayServer::ThreadFunc, this);
171-
m_target_buffer_size = 2;
171+
m_minimum_buffer_size = 2;
172172
m_chunked_data_thread = std::thread(&NetPlayServer::ChunkedDataThreadFunc, this);
173173

174174
#ifdef USE_UPNP
@@ -483,7 +483,7 @@ ConnectionError NetPlayServer::OnConnect(ENetPeer* incoming_connection, sf::Pack
483483
}
484484

485485
if (!m_host_input_authority)
486-
SendResponseToPlayer(new_player, MessageID::PadBuffer, m_target_buffer_size);
486+
SendResponseToPlayer(new_player, MessageID::PadBufferMinimum, m_minimum_buffer_size);
487487

488488
SendResponseToPlayer(new_player, MessageID::HostInputAuthority, m_host_input_authority);
489489

@@ -668,19 +668,19 @@ void NetPlayServer::UpdateWiimoteMapping()
668668
}
669669

670670
// called from ---GUI--- thread and ---NETPLAY--- thread
671-
void NetPlayServer::AdjustPadBufferSize(unsigned int size)
671+
void NetPlayServer::AdjustMinimumPadBufferSize(unsigned int size)
672672
{
673673
std::lock_guard lkg(m_crit.game);
674674

675-
m_target_buffer_size = size;
675+
m_minimum_buffer_size = size;
676676

677677
// not needed on clients with host input authority
678678
if (!m_host_input_authority)
679679
{
680680
// tell clients to change buffer size
681681
sf::Packet spac;
682-
spac << MessageID::PadBuffer;
683-
spac << m_target_buffer_size;
682+
spac << MessageID::PadBufferMinimum;
683+
spac << m_minimum_buffer_size;
684684

685685
SendAsyncToClients(std::move(spac));
686686
}
@@ -701,7 +701,7 @@ void NetPlayServer::SetHostInputAuthority(const bool enable)
701701

702702
// resend pad buffer to clients when disabled
703703
if (!m_host_input_authority)
704-
AdjustPadBufferSize(m_target_buffer_size);
704+
AdjustMinimumPadBufferSize(m_minimum_buffer_size);
705705
}
706706

707707
void NetPlayServer::SendAsync(sf::Packet&& packet, const PlayerId pid, const u8 channel_id)
@@ -1567,7 +1567,7 @@ bool NetPlayServer::StartGame()
15671567

15681568
// no change, just update with clients
15691569
if (!m_host_input_authority)
1570-
AdjustPadBufferSize(m_target_buffer_size);
1570+
AdjustMinimumPadBufferSize(m_minimum_buffer_size);
15711571

15721572
m_current_golfer = 1;
15731573
m_pending_golfer = 0;

Source/Core/Core/NetPlayServer.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#include "Common/SPSCQueue.h"
2222
#include "Common/Timer.h"
2323
#include "Common/TraversalClient.h"
24+
#include "Core/NetPlayClient.h"
2425
#include "Core/NetPlayProto.h"
2526
#include "Core/SyncIdentifier.h"
2627
#include "InputCommon/GCPadStatus.h"
@@ -66,7 +67,7 @@ class NetPlayServer : public Common::TraversalClientClient
6667
PadMappingArray GetWiimoteMapping() const;
6768
void SetWiimoteMapping(const PadMappingArray& mappings);
6869

69-
void AdjustPadBufferSize(unsigned int size);
70+
void AdjustMinimumPadBufferSize(unsigned int size);
7071
void SetHostInputAuthority(bool enable);
7172

7273
void KickPlayer(PlayerId player);
@@ -92,6 +93,7 @@ class NetPlayServer : public Common::TraversalClientClient
9293
ENetPeer* socket = nullptr;
9394
u32 ping = 0;
9495
u32 current_game = 0;
96+
unsigned int m_player_buffer_size = 0;
9597

9698
Common::QoSSession qos_session;
9799

@@ -170,7 +172,7 @@ class NetPlayServer : public Common::TraversalClientClient
170172
u32 m_ping_key = 0;
171173
bool m_update_pings = false;
172174
u32 m_current_game = 0;
173-
unsigned int m_target_buffer_size = 0;
175+
unsigned int m_minimum_buffer_size = 0;
174176
PadMappingArray m_pad_map;
175177
GBAConfigArray m_gba_config;
176178
PadMappingArray m_wiimote_map;

Source/Core/DolphinQt/MainWindow.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1602,7 +1602,7 @@ bool MainWindow::NetPlayJoin()
16021602
if (server)
16031603
{
16041604
server->SetHostInputAuthority(host_input_authority);
1605-
server->AdjustPadBufferSize(Config::Get(Config::NETPLAY_BUFFER_SIZE));
1605+
server->AdjustMinimumPadBufferSize(Config::Get(Config::NETPLAY_MINIMUM_BUFFER_SIZE));
16061606
}
16071607

16081608
// Create Client

0 commit comments

Comments
 (0)