Cleaned up NetPlay a bit, fixed some UI text.
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@6425 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
parent
d0e8d8a509
commit
71f842e8c0
|
@ -133,22 +133,15 @@ bool CSIDevice_GCController::GetData(u32& _Hi, u32& _Low)
|
||||||
|
|
||||||
Pad::GetStatus(ISIDevice::m_iDeviceNumber, &PadStatus);
|
Pad::GetStatus(ISIDevice::m_iDeviceNumber, &PadStatus);
|
||||||
|
|
||||||
u32 netValues[2] = {0};
|
|
||||||
int NetPlay = 2;
|
|
||||||
#if defined(HAVE_WX) && HAVE_WX
|
#if defined(HAVE_WX) && HAVE_WX
|
||||||
NetPlay = NetPlay_GetInput(ISIDevice::m_iDeviceNumber, PadStatus, netValues);
|
u32 netValues[2];
|
||||||
#endif
|
if (NetPlay_GetInput(ISIDevice::m_iDeviceNumber, PadStatus, netValues))
|
||||||
|
|
||||||
if (NetPlay != 2)
|
|
||||||
{
|
{
|
||||||
if (NetPlay == 1)
|
_Hi = netValues[0]; // first 4 bytes
|
||||||
{
|
_Low = netValues[1]; // last 4 bytes
|
||||||
_Hi = netValues[0]; // first 4 bytes
|
|
||||||
_Low = netValues[1]; // last 4 bytes
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
Frame::SetPolledDevice();
|
Frame::SetPolledDevice();
|
||||||
|
|
||||||
|
|
|
@ -103,7 +103,7 @@ public:
|
||||||
virtual int RunBuffer(u8* _pBuffer, int _iLength);
|
virtual int RunBuffer(u8* _pBuffer, int _iLength);
|
||||||
|
|
||||||
// Send and Receive pad input from network
|
// Send and Receive pad input from network
|
||||||
static int NetPlay_GetInput(u8 numPAD, SPADStatus status, u32 *PADStatus);
|
static bool NetPlay_GetInput(u8 numPAD, SPADStatus status, u32 *PADStatus);
|
||||||
static u8 NetPlay_GetPadNum(u8 numPAD);
|
static u8 NetPlay_GetPadNum(u8 numPAD);
|
||||||
|
|
||||||
// Return true on new data
|
// Return true on new data
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
<?xml version="1.0" encoding="Windows-1252"?>
|
<?xml version="1.0" encoding="Windows-1252"?>
|
||||||
<VisualStudioProject
|
<VisualStudioProject
|
||||||
ProjectType="Visual C++"
|
ProjectType="Visual C++"
|
||||||
Version="9,00"
|
Version="9.00"
|
||||||
Name="Dolphin"
|
Name="Dolphin"
|
||||||
ProjectGUID="{A72606EF-C5C1-4954-90AD-F0F93A8D97D9}"
|
ProjectGUID="{A72606EF-C5C1-4954-90AD-F0F93A8D97D9}"
|
||||||
RootNamespace="DolphinWX"
|
RootNamespace="DolphinWX"
|
||||||
|
@ -943,10 +943,6 @@
|
||||||
<Filter
|
<Filter
|
||||||
Name="NetPlay"
|
Name="NetPlay"
|
||||||
>
|
>
|
||||||
<File
|
|
||||||
RelativePath=".\Src\LockingQueue.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
<File
|
||||||
RelativePath=".\Src\NetPlay.cpp"
|
RelativePath=".\Src\NetPlay.cpp"
|
||||||
>
|
>
|
||||||
|
|
|
@ -1,47 +0,0 @@
|
||||||
#ifndef _LOCKINGQUEUE_H_
|
|
||||||
#define _LOCKINGQUEUE_H_
|
|
||||||
|
|
||||||
#include "Thread.h"
|
|
||||||
#include <queue>
|
|
||||||
|
|
||||||
// i should make one of those single reader/ single writer queues
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
class LockingQueue
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
size_t Size()
|
|
||||||
{
|
|
||||||
m_crit.Enter();
|
|
||||||
const size_t s = m_queue.size();
|
|
||||||
m_crit.Leave();
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Push(const T& t)
|
|
||||||
{
|
|
||||||
m_crit.Enter();
|
|
||||||
m_queue.push(t);
|
|
||||||
m_crit.Leave();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Pop(T& t)
|
|
||||||
{
|
|
||||||
m_crit.Enter();
|
|
||||||
if (m_queue.size())
|
|
||||||
{
|
|
||||||
t = m_queue.front();
|
|
||||||
m_queue.pop();
|
|
||||||
m_crit.Leave();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
m_crit.Leave();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
std::queue<T> m_queue;
|
|
||||||
Common::CriticalSection m_crit;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -133,13 +133,15 @@ NetPad::NetPad(const SPADStatus* const pad_status)
|
||||||
// called from ---NETPLAY--- thread
|
// called from ---NETPLAY--- thread
|
||||||
void NetPlay::ClearBuffers()
|
void NetPlay::ClearBuffers()
|
||||||
{
|
{
|
||||||
// clear pad buffers, no clear method ?
|
// clear pad buffers, Clear method isn't thread safe
|
||||||
for (unsigned int i=0; i<4; ++i)
|
for (unsigned int i=0; i<4; ++i)
|
||||||
{
|
{
|
||||||
while (m_pad_buffer[i].size())
|
while (m_pad_buffer[i].Size())
|
||||||
m_pad_buffer[i].pop();
|
m_pad_buffer[i].Pop();
|
||||||
while (m_wiimote_buffer[i].size())
|
|
||||||
m_wiimote_buffer[i].pop();
|
while (m_wiimote_buffer[i].Size())
|
||||||
|
m_wiimote_buffer[i].Pop();
|
||||||
|
|
||||||
m_wiimote_input[i].clear();
|
m_wiimote_input[i].clear();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -157,17 +159,16 @@ bool NetPlay::GetNetPads(const u8 pad_nb, const SPADStatus* const pad_status, Ne
|
||||||
{
|
{
|
||||||
NetPad np(pad_status);
|
NetPad np(pad_status);
|
||||||
|
|
||||||
m_crit.buffer.Enter(); // lock buffer
|
|
||||||
// adjust the buffer either up or down
|
// adjust the buffer either up or down
|
||||||
while (m_pad_buffer[in_game_num].size() <= m_target_buffer_size)
|
// inserting multiple padstates or dropping states
|
||||||
|
while (m_pad_buffer[in_game_num].Size() <= m_target_buffer_size)
|
||||||
{
|
{
|
||||||
// add to buffer
|
// add to buffer
|
||||||
m_pad_buffer[in_game_num].push(np);
|
m_pad_buffer[in_game_num].Push(np);
|
||||||
|
|
||||||
// send
|
// send
|
||||||
SendPadState(pad_nb, np);
|
SendPadState(pad_nb, np);
|
||||||
}
|
}
|
||||||
m_crit.buffer.Leave();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
m_crit.players.Leave();
|
m_crit.players.Leave();
|
||||||
|
@ -176,23 +177,18 @@ bool NetPlay::GetNetPads(const u8 pad_nb, const SPADStatus* const pad_status, Ne
|
||||||
//bufftimer.Start();
|
//bufftimer.Start();
|
||||||
|
|
||||||
// get padstate from buffer and send to game
|
// get padstate from buffer and send to game
|
||||||
m_crit.buffer.Enter(); // lock buffer
|
while (!m_pad_buffer[pad_nb].Pop(*netvalues))
|
||||||
while (0 == m_pad_buffer[pad_nb].size())
|
|
||||||
{
|
{
|
||||||
m_crit.buffer.Leave();
|
|
||||||
// wait for receiving thread to push some data
|
// wait for receiving thread to push some data
|
||||||
Common::SleepCurrentThread(1);
|
Common::SleepCurrentThread(1);
|
||||||
|
|
||||||
if (false == m_is_running)
|
if (false == m_is_running)
|
||||||
return false;
|
return false;
|
||||||
m_crit.buffer.Enter();
|
|
||||||
|
|
||||||
// TODO: check the time of bufftimer here,
|
// TODO: check the time of bufftimer here,
|
||||||
// if it gets pretty high, ask the user if they want to disconnect
|
// if it gets pretty high, ask the user if they want to disconnect
|
||||||
|
|
||||||
}
|
}
|
||||||
*netvalues = m_pad_buffer[pad_nb].front();
|
|
||||||
m_pad_buffer[pad_nb].pop();
|
|
||||||
m_crit.buffer.Leave();
|
|
||||||
|
|
||||||
//u64 hangtime = bufftimer.GetTimeElapsed();
|
//u64 hangtime = bufftimer.GetTimeElapsed();
|
||||||
//if (hangtime > 10)
|
//if (hangtime > 10)
|
||||||
|
@ -213,14 +209,10 @@ void NetPlay::WiimoteInput(int _number, u16 _channelID, const void* _pData, u32
|
||||||
|
|
||||||
// does this local pad map in game?
|
// does this local pad map in game?
|
||||||
if (in_game_num < 4)
|
if (in_game_num < 4)
|
||||||
{
|
{
|
||||||
m_crit.buffer.Enter();
|
|
||||||
|
|
||||||
m_wiimote_input[_number].resize(m_wiimote_input[_number].size() + 1);
|
m_wiimote_input[_number].resize(m_wiimote_input[_number].size() + 1);
|
||||||
m_wiimote_input[_number].back().assign((char*)_pData, (char*)_pData + _Size);
|
m_wiimote_input[_number].back().assign((char*)_pData, (char*)_pData + _Size);
|
||||||
m_wiimote_input[_number].back().channel = _channelID;
|
m_wiimote_input[_number].back().channel = _channelID;
|
||||||
|
|
||||||
m_crit.buffer.Leave();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
m_crit.players.Leave();
|
m_crit.players.Leave();
|
||||||
|
@ -237,41 +229,33 @@ void NetPlay::WiimoteUpdate(int _number)
|
||||||
// does this local pad map in game?
|
// does this local pad map in game?
|
||||||
if (in_game_num < 4)
|
if (in_game_num < 4)
|
||||||
{
|
{
|
||||||
m_crit.buffer.Enter();
|
m_wiimote_buffer[in_game_num].Push(m_wiimote_input[_number]);
|
||||||
m_wiimote_buffer[in_game_num].push(m_wiimote_input[_number]);
|
|
||||||
|
|
||||||
// TODO: send it
|
// TODO: send it
|
||||||
|
|
||||||
m_wiimote_input[_number].clear();
|
m_wiimote_input[_number].clear();
|
||||||
m_crit.buffer.Leave();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
m_crit.players.Leave();
|
m_crit.players.Leave();
|
||||||
|
|
||||||
m_crit.buffer.Enter();
|
if (0 == m_wiimote_buffer[_number].Size())
|
||||||
|
|
||||||
if (0 == m_wiimote_buffer[_number].size())
|
|
||||||
{
|
{
|
||||||
//PanicAlert("PANIC");
|
//PanicAlert("PANIC");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
NetWiimote& nw = m_wiimote_buffer[_number].front();
|
NetWiimote nw;
|
||||||
|
m_wiimote_buffer[_number].Pop(nw);
|
||||||
|
|
||||||
NetWiimote::const_iterator
|
NetWiimote::const_iterator
|
||||||
i = nw.begin(), e = nw.end();
|
i = nw.begin(), e = nw.end();
|
||||||
for ( ; i!=e; ++i)
|
for ( ; i!=e; ++i)
|
||||||
Core::Callback_WiimoteInterruptChannel(_number, i->channel, &(*i)[0], (u32)i->size() + RPT_SIZE_HACK);
|
Core::Callback_WiimoteInterruptChannel(_number, i->channel, &(*i)[0], (u32)i->size() + RPT_SIZE_HACK);
|
||||||
|
|
||||||
m_wiimote_buffer[_number].pop();
|
|
||||||
m_crit.buffer.Leave();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// called from ---GUI--- thread
|
// called from ---GUI--- thread
|
||||||
bool NetPlay::StartGame(const std::string &path)
|
bool NetPlay::StartGame(const std::string &path)
|
||||||
{
|
{
|
||||||
CritLocker game_lock(m_crit.game); // lock game state
|
|
||||||
|
|
||||||
if (m_is_running)
|
if (m_is_running)
|
||||||
{
|
{
|
||||||
PanicAlert("Game is already running!");
|
PanicAlert("Game is already running!");
|
||||||
|
@ -283,17 +267,16 @@ bool NetPlay::StartGame(const std::string &path)
|
||||||
m_is_running = true;
|
m_is_running = true;
|
||||||
NetPlay_Enable(this);
|
NetPlay_Enable(this);
|
||||||
|
|
||||||
|
ClearBuffers();
|
||||||
|
|
||||||
// boot game
|
// boot game
|
||||||
::main_frame->BootGame(path);
|
::main_frame->BootGame(path);
|
||||||
//BootManager::BootCore(path);
|
|
||||||
|
|
||||||
// TODO: i dont know if i like this here
|
|
||||||
ClearBuffers();
|
|
||||||
// temporary
|
// temporary
|
||||||
NetWiimote nw;
|
NetWiimote nw;
|
||||||
for (unsigned int i = 0; i<4; ++i)
|
for (unsigned int i = 0; i<4; ++i)
|
||||||
for (unsigned int f = 0; f<2; ++f)
|
for (unsigned int f = 0; f<2; ++f)
|
||||||
m_wiimote_buffer[i].push(nw);
|
m_wiimote_buffer[i].Push(nw);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -336,14 +319,14 @@ u8 NetPlay::GetPadNum(u8 numPAD)
|
||||||
|
|
||||||
// called from ---CPU--- thread
|
// called from ---CPU--- thread
|
||||||
// Actual Core function which is called on every frame
|
// Actual Core function which is called on every frame
|
||||||
int CSIDevice_GCController::NetPlay_GetInput(u8 numPAD, SPADStatus PadStatus, u32 *PADStatus)
|
bool CSIDevice_GCController::NetPlay_GetInput(u8 numPAD, SPADStatus PadStatus, u32 *PADStatus)
|
||||||
{
|
{
|
||||||
CritLocker crit(::crit_netplay_ptr);
|
CritLocker crit(::crit_netplay_ptr);
|
||||||
|
|
||||||
if (::netplay_ptr)
|
if (::netplay_ptr)
|
||||||
return netplay_ptr->GetNetPads(numPAD, &PadStatus, (NetPad*)PADStatus) ? 1 : 0;
|
return netplay_ptr->GetNetPads(numPAD, &PadStatus, (NetPad*)PADStatus);
|
||||||
else
|
else
|
||||||
return 2;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// called from ---CPU--- thread
|
// called from ---CPU--- thread
|
||||||
|
|
|
@ -7,18 +7,17 @@
|
||||||
#include "Thread.h"
|
#include "Thread.h"
|
||||||
#include "Timer.h"
|
#include "Timer.h"
|
||||||
|
|
||||||
// hax, i hope something like this isn't needed on non-windows
|
|
||||||
#define _WINSOCK2API_
|
#define _WINSOCK2API_
|
||||||
#include <SFML/Network.hpp>
|
#include <SFML/Network.hpp>
|
||||||
|
|
||||||
#include "GCPadStatus.h"
|
#include "GCPadStatus.h"
|
||||||
|
|
||||||
//#include <wx/wx.h>
|
|
||||||
|
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <queue>
|
#include <queue>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
|
||||||
|
#include "FifoQueue.h"
|
||||||
|
|
||||||
class NetPlayDiag;
|
class NetPlayDiag;
|
||||||
|
|
||||||
class NetPad
|
class NetPad
|
||||||
|
@ -38,32 +37,34 @@ struct Rpt : public std::vector<u8>
|
||||||
|
|
||||||
typedef std::vector<Rpt> NetWiimote;
|
typedef std::vector<Rpt> NetWiimote;
|
||||||
|
|
||||||
#define NETPLAY_VERSION "Dolphin NetPlay 2.2"
|
#define NETPLAY_VERSION "Dolphin NetPlay r6423"
|
||||||
|
|
||||||
// messages
|
// messages
|
||||||
#define NP_MSG_PLAYER_JOIN 0x10
|
enum
|
||||||
#define NP_MSG_PLAYER_LEAVE 0x11
|
{
|
||||||
|
NP_MSG_PLAYER_JOIN = 0x10,
|
||||||
|
NP_MSG_PLAYER_LEAVE = 0x11,
|
||||||
|
|
||||||
#define NP_MSG_CHAT_MESSAGE 0x30
|
NP_MSG_CHAT_MESSAGE = 0x30,
|
||||||
|
|
||||||
#define NP_MSG_PAD_DATA 0x60
|
NP_MSG_PAD_DATA = 0x60,
|
||||||
#define NP_MSG_PAD_MAPPING 0x61
|
NP_MSG_PAD_MAPPING = 0x61,
|
||||||
#define NP_MSG_PAD_BUFFER 0x62
|
NP_MSG_PAD_BUFFER = 0x62,
|
||||||
|
|
||||||
#define NP_MSG_WIIMOTE_DATA 0x70
|
NP_MSG_WIIMOTE_DATA = 0x70,
|
||||||
#define NP_MSG_WIIMOTE_MAPPING 0x71 // just using pad mapping for now
|
NP_MSG_WIIMOTE_MAPPING = 0x71, // just using pad mapping for now
|
||||||
|
|
||||||
#define NP_MSG_START_GAME 0xA0
|
NP_MSG_START_GAME = 0xA0,
|
||||||
#define NP_MSG_CHANGE_GAME 0xA1
|
NP_MSG_CHANGE_GAME = 0xA1,
|
||||||
#define NP_MSG_STOP_GAME 0xA2
|
NP_MSG_STOP_GAME = 0xA2,
|
||||||
#define NP_MSG_DISABLE_GAME 0xA3
|
NP_MSG_DISABLE_GAME = 0xA3,
|
||||||
|
|
||||||
#define NP_MSG_READY 0xD0
|
NP_MSG_READY = 0xD0,
|
||||||
#define NP_MSG_NOT_READY 0xD1
|
NP_MSG_NOT_READY = 0xD1,
|
||||||
|
|
||||||
#define NP_MSG_PING 0xE0
|
NP_MSG_PING = 0xE0,
|
||||||
#define NP_MSG_PONG 0xE1
|
NP_MSG_PONG = 0xE1,
|
||||||
// end messages
|
};
|
||||||
|
|
||||||
typedef u8 MessageId;
|
typedef u8 MessageId;
|
||||||
typedef u8 PlayerId;
|
typedef u8 PlayerId;
|
||||||
|
@ -128,7 +129,7 @@ protected:
|
||||||
{
|
{
|
||||||
Common::CriticalSection game;
|
Common::CriticalSection game;
|
||||||
// lock order
|
// lock order
|
||||||
Common::CriticalSection players, buffer, send;
|
Common::CriticalSection players, send;
|
||||||
} m_crit;
|
} m_crit;
|
||||||
|
|
||||||
class Player
|
class Player
|
||||||
|
@ -143,8 +144,8 @@ protected:
|
||||||
std::string revision;
|
std::string revision;
|
||||||
};
|
};
|
||||||
|
|
||||||
std::queue<NetPad> m_pad_buffer[4];
|
Common::FifoQueue<NetPad> m_pad_buffer[4];
|
||||||
std::queue<NetWiimote> m_wiimote_buffer[4];
|
Common::FifoQueue<NetWiimote> m_wiimote_buffer[4];
|
||||||
|
|
||||||
NetWiimote m_wiimote_input[4];
|
NetWiimote m_wiimote_input[4];
|
||||||
|
|
||||||
|
@ -161,7 +162,7 @@ protected:
|
||||||
|
|
||||||
Player* m_local_player;
|
Player* m_local_player;
|
||||||
|
|
||||||
u32 m_on_game;
|
u32 m_current_game;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
@ -198,11 +199,11 @@ private:
|
||||||
class Client : public Player
|
class Client : public Player
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Client() : ping(0), on_game(0) {}
|
Client() : ping(0), current_game(0) {}
|
||||||
|
|
||||||
sf::SocketTCP socket;
|
sf::SocketTCP socket;
|
||||||
u64 ping;
|
u64 ping;
|
||||||
u32 on_game;
|
u32 current_game;
|
||||||
};
|
};
|
||||||
|
|
||||||
void SendPadState(const PadMapping local_nb, const NetPad& np);
|
void SendPadState(const PadMapping local_nb, const NetPad& np);
|
||||||
|
|
|
@ -159,9 +159,7 @@ unsigned int NetPlayClient::OnData(sf::Packet& packet)
|
||||||
|
|
||||||
// trusting server for good map value (>=0 && <4)
|
// trusting server for good map value (>=0 && <4)
|
||||||
// add to pad buffer
|
// add to pad buffer
|
||||||
m_crit.buffer.Enter(); // lock buffer
|
m_pad_buffer[(unsigned)map].Push(np);
|
||||||
m_pad_buffer[(unsigned)map].push(np);
|
|
||||||
m_crit.buffer.Leave();
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -170,9 +168,7 @@ unsigned int NetPlayClient::OnData(sf::Packet& packet)
|
||||||
u32 size = 0;
|
u32 size = 0;
|
||||||
packet >> size;
|
packet >> size;
|
||||||
|
|
||||||
m_crit.buffer.Enter(); // lock buffer
|
|
||||||
m_target_buffer_size = size;
|
m_target_buffer_size = size;
|
||||||
m_crit.buffer.Leave();
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -193,9 +189,9 @@ unsigned int NetPlayClient::OnData(sf::Packet& packet)
|
||||||
|
|
||||||
case NP_MSG_START_GAME :
|
case NP_MSG_START_GAME :
|
||||||
{
|
{
|
||||||
m_crit.buffer.Enter(); // lock buffer
|
m_crit.game.Enter(); // lock buffer
|
||||||
packet >> m_on_game;
|
packet >> m_current_game;
|
||||||
m_crit.buffer.Leave();
|
m_crit.game.Leave();
|
||||||
|
|
||||||
wxCommandEvent evt(wxEVT_THREAD, NP_GUI_EVT_START_GAME);
|
wxCommandEvent evt(wxEVT_THREAD, NP_GUI_EVT_START_GAME);
|
||||||
m_dialog->GetEventHandler()->AddPendingEvent(evt);
|
m_dialog->GetEventHandler()->AddPendingEvent(evt);
|
||||||
|
@ -299,7 +295,6 @@ void NetPlayClient::SendChatMessage(const std::string& msg)
|
||||||
spac << (MessageId)NP_MSG_CHAT_MESSAGE;
|
spac << (MessageId)NP_MSG_CHAT_MESSAGE;
|
||||||
spac << msg;
|
spac << msg;
|
||||||
|
|
||||||
CritLocker player_lock(m_crit.players); // lock players
|
|
||||||
CritLocker send_lock(m_crit.send); // lock send
|
CritLocker send_lock(m_crit.send); // lock send
|
||||||
m_socket.Send(spac);
|
m_socket.Send(spac);
|
||||||
}
|
}
|
||||||
|
@ -320,7 +315,7 @@ void NetPlayClient::SendPadState(const PadMapping local_nb, const NetPad& np)
|
||||||
// called from ---GUI--- thread
|
// called from ---GUI--- thread
|
||||||
bool NetPlayClient::StartGame(const std::string &path)
|
bool NetPlayClient::StartGame(const std::string &path)
|
||||||
{
|
{
|
||||||
m_crit.buffer.Enter(); // lock buffer
|
CritLocker game_lock(m_crit.game); // lock game state
|
||||||
|
|
||||||
if (false == NetPlay::StartGame(path))
|
if (false == NetPlay::StartGame(path))
|
||||||
return false;
|
return false;
|
||||||
|
@ -328,9 +323,7 @@ bool NetPlayClient::StartGame(const std::string &path)
|
||||||
// tell server i started the game
|
// tell server i started the game
|
||||||
sf::Packet spac;
|
sf::Packet spac;
|
||||||
spac << (MessageId)NP_MSG_START_GAME;
|
spac << (MessageId)NP_MSG_START_GAME;
|
||||||
spac << m_on_game;
|
spac << m_current_game;
|
||||||
|
|
||||||
m_crit.buffer.Leave();
|
|
||||||
|
|
||||||
CritLocker send_lock(m_crit.send); // lock send
|
CritLocker send_lock(m_crit.send); // lock send
|
||||||
m_socket.Send(spac);
|
m_socket.Send(spac);
|
||||||
|
@ -339,10 +332,7 @@ bool NetPlayClient::StartGame(const std::string &path)
|
||||||
}
|
}
|
||||||
|
|
||||||
// called from ---GUI--- thread
|
// called from ---GUI--- thread
|
||||||
bool NetPlayClient::ChangeGame(const std::string &game)
|
bool NetPlayClient::ChangeGame(const std::string&)
|
||||||
{
|
{
|
||||||
// warning removal
|
|
||||||
game.size();
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -257,7 +257,7 @@ unsigned int NetPlayServer::OnDisconnect(sf::SocketTCP& socket)
|
||||||
{
|
{
|
||||||
if (m_is_running)
|
if (m_is_running)
|
||||||
{
|
{
|
||||||
PanicAlert("Client disconnect while game is running!! NetPlay is disabled. You manually stop the game.");
|
PanicAlert("Client disconnect while game is running!! NetPlay is disabled. You must manually stop the game.");
|
||||||
CritLocker game_lock(m_crit.game); // lock game state
|
CritLocker game_lock(m_crit.game); // lock game state
|
||||||
m_is_running = false;
|
m_is_running = false;
|
||||||
NetPlay_Disable();
|
NetPlay_Disable();
|
||||||
|
@ -397,9 +397,7 @@ void NetPlayServer::AdjustPadBufferSize(unsigned int size)
|
||||||
{
|
{
|
||||||
CritLocker game_lock(m_crit.game); // lock game state
|
CritLocker game_lock(m_crit.game); // lock game state
|
||||||
|
|
||||||
m_crit.buffer.Enter(); // lock buffer
|
|
||||||
m_target_buffer_size = size;
|
m_target_buffer_size = size;
|
||||||
m_crit.buffer.Leave();
|
|
||||||
|
|
||||||
// tell clients to change buffer size
|
// tell clients to change buffer size
|
||||||
sf::Packet spac;
|
sf::Packet spac;
|
||||||
|
@ -448,10 +446,8 @@ unsigned int NetPlayServer::OnData(sf::Packet& packet, sf::SocketTCP& socket)
|
||||||
|
|
||||||
case NP_MSG_PAD_DATA :
|
case NP_MSG_PAD_DATA :
|
||||||
{
|
{
|
||||||
m_crit.buffer.Enter(); // lock buffer
|
|
||||||
|
|
||||||
// if this is pad data from the last game still being received, ignore it
|
// if this is pad data from the last game still being received, ignore it
|
||||||
if (player.on_game != m_on_game)
|
if (player.current_game != m_current_game)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
PadMapping map = 0;
|
PadMapping map = 0;
|
||||||
|
@ -470,8 +466,7 @@ unsigned int NetPlayServer::OnData(sf::Packet& packet, sf::SocketTCP& socket)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
// add to pad buffer
|
// add to pad buffer
|
||||||
m_pad_buffer[(unsigned)map].push(np);
|
m_pad_buffer[(unsigned)map].Push(np);
|
||||||
m_crit.buffer.Leave();
|
|
||||||
|
|
||||||
// relay to clients
|
// relay to clients
|
||||||
sf::Packet spac;
|
sf::Packet spac;
|
||||||
|
@ -501,7 +496,7 @@ unsigned int NetPlayServer::OnData(sf::Packet& packet, sf::SocketTCP& socket)
|
||||||
|
|
||||||
case NP_MSG_START_GAME :
|
case NP_MSG_START_GAME :
|
||||||
{
|
{
|
||||||
packet >> player.on_game;
|
packet >> player.current_game;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -542,6 +537,7 @@ void NetPlayServer::SendChatMessage(const std::string& msg)
|
||||||
spac << (PlayerId)0; // server id always 0
|
spac << (PlayerId)0; // server id always 0
|
||||||
spac << msg;
|
spac << msg;
|
||||||
|
|
||||||
|
CritLocker player_lock(m_crit.players); // lock players
|
||||||
CritLocker send_lock(m_crit.send); // lock send
|
CritLocker send_lock(m_crit.send); // lock send
|
||||||
SendToClients(spac);
|
SendToClients(spac);
|
||||||
}
|
}
|
||||||
|
@ -581,14 +577,13 @@ void NetPlayServer::SendPadState(const PadMapping local_nb, const NetPad& np)
|
||||||
// called from ---GUI--- thread
|
// called from ---GUI--- thread
|
||||||
bool NetPlayServer::StartGame(const std::string &path)
|
bool NetPlayServer::StartGame(const std::string &path)
|
||||||
{
|
{
|
||||||
m_crit.buffer.Enter(); // lock buffer
|
CritLocker game_lock(m_crit.game); // lock game state
|
||||||
|
|
||||||
if (false == NetPlay::StartGame(path))
|
if (false == NetPlay::StartGame(path))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// TODO: i dont like this here
|
// TODO: i dont like this here
|
||||||
m_on_game = Common::Timer::GetTimeMs();
|
m_current_game = Common::Timer::GetTimeMs();
|
||||||
m_crit.buffer.Leave();
|
|
||||||
|
|
||||||
// no change, just update with clients
|
// no change, just update with clients
|
||||||
AdjustPadBufferSize(m_target_buffer_size);
|
AdjustPadBufferSize(m_target_buffer_size);
|
||||||
|
@ -596,7 +591,7 @@ bool NetPlayServer::StartGame(const std::string &path)
|
||||||
// tell clients to start game
|
// tell clients to start game
|
||||||
sf::Packet spac;
|
sf::Packet spac;
|
||||||
spac << (MessageId)NP_MSG_START_GAME;
|
spac << (MessageId)NP_MSG_START_GAME;
|
||||||
spac << m_on_game;
|
spac << m_current_game;
|
||||||
|
|
||||||
CritLocker player_lock(m_crit.players); // lock players
|
CritLocker player_lock(m_crit.players); // lock players
|
||||||
CritLocker send_lock(m_crit.send); // lock send
|
CritLocker send_lock(m_crit.send); // lock send
|
||||||
|
|
|
@ -84,8 +84,8 @@ NetPlaySetupDiag::NetPlaySetupDiag(wxWindow* const parent, const CGameListCtrl*
|
||||||
wxStaticText* const alert_lbl = new wxStaticText(connect_tab, wxID_ANY
|
wxStaticText* const alert_lbl = new wxStaticText(connect_tab, wxID_ANY
|
||||||
, wxT("ALERT:\n\nNetPlay will currently only work properly when using the following settings:")
|
, wxT("ALERT:\n\nNetPlay will currently only work properly when using the following settings:")
|
||||||
wxT("\n - Dual Core [OFF]")
|
wxT("\n - Dual Core [OFF]")
|
||||||
wxT("\n - Audio Throttle [OFF/ON] (try both)")
|
wxT("\n - Audio Throttle [OFF]")
|
||||||
wxT("\n - DSP LLE/HLE (try both)")
|
wxT("\n - DSP-HLE with \"Null Audio\" or DSP-LLE")
|
||||||
wxT("\n - Manually set the exact number of controllers that will be used to [Standard Controller]")
|
wxT("\n - Manually set the exact number of controllers that will be used to [Standard Controller]")
|
||||||
wxT("\n\nAll players should try to use the same Dolphin version and settings.")
|
wxT("\n\nAll players should try to use the same Dolphin version and settings.")
|
||||||
wxT("\nDisable all memory cards or send them to all players before starting.")
|
wxT("\nDisable all memory cards or send them to all players before starting.")
|
||||||
|
@ -178,11 +178,8 @@ NetPlaySetupDiag::~NetPlaySetupDiag()
|
||||||
inifile.Save(dolphin_ini);
|
inifile.Save(dolphin_ini);
|
||||||
}
|
}
|
||||||
|
|
||||||
void NetPlaySetupDiag::OnHost(wxCommandEvent& event)
|
void NetPlaySetupDiag::OnHost(wxCommandEvent&)
|
||||||
{
|
{
|
||||||
// warning removal
|
|
||||||
event.GetId();
|
|
||||||
|
|
||||||
if (::netplay_ptr)
|
if (::netplay_ptr)
|
||||||
{
|
{
|
||||||
PanicAlert("A NetPlay window is already open!!");
|
PanicAlert("A NetPlay window is already open!!");
|
||||||
|
@ -217,11 +214,8 @@ void NetPlaySetupDiag::OnHost(wxCommandEvent& event)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void NetPlaySetupDiag::OnJoin(wxCommandEvent& event)
|
void NetPlaySetupDiag::OnJoin(wxCommandEvent&)
|
||||||
{
|
{
|
||||||
// warning removal
|
|
||||||
event.GetId();
|
|
||||||
|
|
||||||
if (::netplay_ptr)
|
if (::netplay_ptr)
|
||||||
{
|
{
|
||||||
PanicAlert("A NetPlay window is already open!!");
|
PanicAlert("A NetPlay window is already open!!");
|
||||||
|
@ -248,11 +242,8 @@ void NetPlaySetupDiag::OnJoin(wxCommandEvent& event)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void NetPlaySetupDiag::OnQuit(wxCommandEvent& event)
|
void NetPlaySetupDiag::OnQuit(wxCommandEvent&)
|
||||||
{
|
{
|
||||||
// warning removal
|
|
||||||
event.GetId();
|
|
||||||
|
|
||||||
Destroy();
|
Destroy();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -359,11 +350,8 @@ NetPlayDiag::~NetPlayDiag()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void NetPlayDiag::OnChat(wxCommandEvent& event)
|
void NetPlayDiag::OnChat(wxCommandEvent&)
|
||||||
{
|
{
|
||||||
// warning removal
|
|
||||||
event.GetId();
|
|
||||||
|
|
||||||
wxString s = m_chat_msg_text->GetValue();
|
wxString s = m_chat_msg_text->GetValue();
|
||||||
|
|
||||||
if (s.Length())
|
if (s.Length())
|
||||||
|
@ -374,11 +362,8 @@ void NetPlayDiag::OnChat(wxCommandEvent& event)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void NetPlayDiag::OnStart(wxCommandEvent& event)
|
void NetPlayDiag::OnStart(wxCommandEvent&)
|
||||||
{
|
{
|
||||||
// warning removal
|
|
||||||
event.GetId();
|
|
||||||
|
|
||||||
// find path for selected game
|
// find path for selected game
|
||||||
std::string ntmp, ptmp, path;
|
std::string ntmp, ptmp, path;
|
||||||
std::istringstream nss(m_game_list->GetGameNames()), pss(m_game_list->GetGamePaths());
|
std::istringstream nss(m_game_list->GetGameNames()), pss(m_game_list->GetGamePaths());
|
||||||
|
@ -399,19 +384,13 @@ void NetPlayDiag::OnStart(wxCommandEvent& event)
|
||||||
PanicAlert("Game not found!!");
|
PanicAlert("Game not found!!");
|
||||||
}
|
}
|
||||||
|
|
||||||
void NetPlayDiag::OnStop(wxCommandEvent& event)
|
void NetPlayDiag::OnStop(wxCommandEvent&)
|
||||||
{
|
{
|
||||||
// warning removal
|
|
||||||
event.GetId();
|
|
||||||
|
|
||||||
::netplay_ptr->StopGame();
|
::netplay_ptr->StopGame();
|
||||||
}
|
}
|
||||||
|
|
||||||
void NetPlayDiag::OnPadBuffHelp(wxCommandEvent& event)
|
void NetPlayDiag::OnPadBuffHelp(wxCommandEvent&)
|
||||||
{
|
{
|
||||||
// warning removal
|
|
||||||
event.GetId();
|
|
||||||
|
|
||||||
const u64 time = ((NetPlayServer*)::netplay_ptr)->CalculateMinimumBufferTime();
|
const u64 time = ((NetPlayServer*)::netplay_ptr)->CalculateMinimumBufferTime();
|
||||||
std::ostringstream ss;
|
std::ostringstream ss;
|
||||||
ss << "< Calculated from pings: required buffer: "
|
ss << "< Calculated from pings: required buffer: "
|
||||||
|
@ -432,20 +411,14 @@ void NetPlayDiag::OnAdjustBuffer(wxCommandEvent& event)
|
||||||
m_chat_text->AppendText(wxString(ss.str().c_str(), *wxConvCurrent).Append(wxT('\n')));
|
m_chat_text->AppendText(wxString(ss.str().c_str(), *wxConvCurrent).Append(wxT('\n')));
|
||||||
}
|
}
|
||||||
|
|
||||||
void NetPlayDiag::OnQuit(wxCommandEvent& event)
|
void NetPlayDiag::OnQuit(wxCommandEvent&)
|
||||||
{
|
{
|
||||||
// warning removal
|
|
||||||
event.GetId();
|
|
||||||
|
|
||||||
Destroy();
|
Destroy();
|
||||||
}
|
}
|
||||||
|
|
||||||
// update gui
|
// update gui
|
||||||
void NetPlayDiag::OnThread(wxCommandEvent& event)
|
void NetPlayDiag::OnThread(wxCommandEvent& event)
|
||||||
{
|
{
|
||||||
// warning removal
|
|
||||||
event.GetId();
|
|
||||||
|
|
||||||
// player list
|
// player list
|
||||||
m_playerids.clear();
|
m_playerids.clear();
|
||||||
std::string tmps;
|
std::string tmps;
|
||||||
|
@ -495,11 +468,8 @@ void NetPlayDiag::OnThread(wxCommandEvent& event)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void NetPlayDiag::OnChangeGame(wxCommandEvent& event)
|
void NetPlayDiag::OnChangeGame(wxCommandEvent&)
|
||||||
{
|
{
|
||||||
// warning removal
|
|
||||||
event.GetId();
|
|
||||||
|
|
||||||
wxString game_name;
|
wxString game_name;
|
||||||
ChangeGameDiag* const cgd = new ChangeGameDiag(this, m_game_list, game_name);
|
ChangeGameDiag* const cgd = new ChangeGameDiag(this, m_game_list, game_name);
|
||||||
cgd->ShowModal();
|
cgd->ShowModal();
|
||||||
|
@ -512,11 +482,8 @@ void NetPlayDiag::OnChangeGame(wxCommandEvent& event)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void NetPlayDiag::OnConfigPads(wxCommandEvent& event)
|
void NetPlayDiag::OnConfigPads(wxCommandEvent&)
|
||||||
{
|
{
|
||||||
// warning removal
|
|
||||||
event.GetId();
|
|
||||||
|
|
||||||
int mapping[4];
|
int mapping[4];
|
||||||
|
|
||||||
// get selected player id
|
// get selected player id
|
||||||
|
@ -565,11 +532,8 @@ ChangeGameDiag::ChangeGameDiag(wxWindow* const parent, const CGameListCtrl* cons
|
||||||
SetSizerAndFit(dlg_szr);
|
SetSizerAndFit(dlg_szr);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ChangeGameDiag::OnPick(wxCommandEvent& event)
|
void ChangeGameDiag::OnPick(wxCommandEvent&)
|
||||||
{
|
{
|
||||||
// warning removal
|
|
||||||
event.GetId();
|
|
||||||
|
|
||||||
// return the selected game name
|
// return the selected game name
|
||||||
m_game_name = m_game_lbox->GetStringSelection();
|
m_game_name = m_game_lbox->GetStringSelection();
|
||||||
Destroy();
|
Destroy();
|
||||||
|
|
|
@ -30,23 +30,10 @@
|
||||||
#include <wx/gbsizer.h>
|
#include <wx/gbsizer.h>
|
||||||
#include <wx/listbox.h>
|
#include <wx/listbox.h>
|
||||||
#include <wx/spinctrl.h>
|
#include <wx/spinctrl.h>
|
||||||
//#include <wx/thread.h>
|
|
||||||
|
|
||||||
#include "GameListCtrl.h"
|
#include "GameListCtrl.h"
|
||||||
|
|
||||||
// just leaving these here so i can find something later if i need it
|
#include "FifoQueue.h"
|
||||||
//#include "Frame.h"
|
|
||||||
//#include "Globals.h"
|
|
||||||
//#include "BootManager.h"
|
|
||||||
//#include "Common.h"
|
|
||||||
//#include "NetStructs.h"
|
|
||||||
//#include "Core.h"
|
|
||||||
//#include "HW/SI.h"
|
|
||||||
//#include "HW/SI_Device.h"
|
|
||||||
//#include "HW/SI_DeviceGCController.h"
|
|
||||||
//#include "Timer.h"
|
|
||||||
|
|
||||||
#include "LockingQueue.h"
|
|
||||||
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
|
@ -82,8 +69,7 @@ public:
|
||||||
, const std::string& game, const bool is_hosting = false);
|
, const std::string& game, const bool is_hosting = false);
|
||||||
~NetPlayDiag();
|
~NetPlayDiag();
|
||||||
|
|
||||||
LockingQueue<std::string> chat_msgs;
|
Common::FifoQueue<std::string> chat_msgs;
|
||||||
//std::string chat_msg;
|
|
||||||
|
|
||||||
void OnStart(wxCommandEvent& event);
|
void OnStart(wxCommandEvent& event);
|
||||||
void OnStop(wxCommandEvent& event);
|
void OnStop(wxCommandEvent& event);
|
||||||
|
@ -109,7 +95,6 @@ private:
|
||||||
std::vector<int> m_playerids;
|
std::vector<int> m_playerids;
|
||||||
|
|
||||||
const CGameListCtrl* const m_game_list;
|
const CGameListCtrl* const m_game_list;
|
||||||
//NetPlay* const m_netplay;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
DECLARE_EVENT_TYPE(wxEVT_THREAD, -1)
|
DECLARE_EVENT_TYPE(wxEVT_THREAD, -1)
|
||||||
|
|
Loading…
Reference in New Issue