Netplay: Fixed regressions/crashes caused by refactoring

This commit is contained in:
Sour 2018-07-02 18:11:12 -04:00
parent 974bd8cd07
commit 2504fe0b71
3 changed files with 33 additions and 8 deletions

View file

@ -27,7 +27,6 @@ GameClientConnection::GameClientConnection(shared_ptr<Console> console, shared_p
_minimumQueueSize = 3; _minimumQueueSize = 3;
MessageManager::DisplayMessage("NetPlay", "ConnectedToServer"); MessageManager::DisplayMessage("NetPlay", "ConnectedToServer");
_console->GetControlManager()->RegisterInputProvider(this);
} }
GameClientConnection::~GameClientConnection() GameClientConnection::~GameClientConnection()
@ -208,10 +207,10 @@ bool GameClientConnection::SetInput(BaseControlDevice *device)
void GameClientConnection::InitControlDevice() void GameClientConnection::InitControlDevice()
{ {
if(_controllerPort == BaseControlDevice::ExpDevicePort) { if(_controllerPort == BaseControlDevice::ExpDevicePort) {
_newControlDevice = ControlManager::CreateExpansionDevice(EmulationSettings::GetExpansionDevice(), nullptr); _newControlDevice = ControlManager::CreateExpansionDevice(EmulationSettings::GetExpansionDevice(), _console);
} else { } else {
//Pretend we are using port 0 (to use player 1's keybindings during netplay) //Pretend we are using port 0 (to use player 1's keybindings during netplay)
_newControlDevice = ControlManager::CreateControllerDevice(EmulationSettings::GetControllerType(_controllerPort), 0, nullptr); _newControlDevice = ControlManager::CreateControllerDevice(EmulationSettings::GetControllerType(_controllerPort), 0, _console);
} }
} }
@ -219,6 +218,8 @@ void GameClientConnection::ProcessNotification(ConsoleNotificationType type, voi
{ {
if(type == ConsoleNotificationType::ConfigChanged) { if(type == ConsoleNotificationType::ConfigChanged) {
InitControlDevice(); InitControlDevice();
} else if(type == ConsoleNotificationType::GameLoaded) {
_console->GetControlManager()->RegisterInputProvider(this);
} }
} }

View file

@ -10,7 +10,7 @@ using std::thread;
#include "PlayerListMessage.h" #include "PlayerListMessage.h"
#include "NotificationManager.h" #include "NotificationManager.h"
unique_ptr<GameServer> GameServer::Instance; shared_ptr<GameServer> GameServer::Instance;
GameServer::GameServer(shared_ptr<Console> console, uint16_t listenPort, string password, string hostPlayerName) GameServer::GameServer(shared_ptr<Console> console, uint16_t listenPort, string password, string hostPlayerName)
{ {
@ -20,8 +20,9 @@ GameServer::GameServer(shared_ptr<Console> console, uint16_t listenPort, string
_password = password; _password = password;
_hostPlayerName = hostPlayerName; _hostPlayerName = hostPlayerName;
_hostControllerPort = 0; _hostControllerPort = 0;
_console->GetControlManager()->RegisterInputRecorder(this);
_console->GetControlManager()->RegisterInputProvider(this); //If a game is already running, register ourselves as an input recorder/provider right away
RegisterServerInput();
} }
GameServer::~GameServer() GameServer::~GameServer()
@ -35,6 +36,15 @@ GameServer::~GameServer()
_console->GetControlManager()->UnregisterInputProvider(this); _console->GetControlManager()->UnregisterInputProvider(this);
} }
void GameServer::RegisterServerInput()
{
ControlManager* controlManager = _console->GetControlManager();
if(controlManager) {
controlManager->RegisterInputRecorder(this);
controlManager->RegisterInputProvider(this);
}
}
void GameServer::AcceptConnections() void GameServer::AcceptConnections()
{ {
while(true) { while(true) {
@ -102,6 +112,14 @@ void GameServer::RecordInput(vector<shared_ptr<BaseControlDevice>> devices)
} }
} }
void GameServer::ProcessNotification(ConsoleNotificationType type, void * parameter)
{
if(type == ConsoleNotificationType::GameLoaded) {
//Register the server as an input provider/recorder
RegisterServerInput();
}
}
void GameServer::Exec() void GameServer::Exec()
{ {
_listener.reset(new Socket()); _listener.reset(new Socket());
@ -129,6 +147,7 @@ void GameServer::Stop()
void GameServer::StartServer(shared_ptr<Console> console, uint16_t port, string password, string hostPlayerName) void GameServer::StartServer(shared_ptr<Console> console, uint16_t port, string password, string hostPlayerName)
{ {
Instance.reset(new GameServer(console, port, password, hostPlayerName)); Instance.reset(new GameServer(console, port, password, hostPlayerName));
console->GetNotificationManager()->RegisterNotificationListener(Instance);
Instance->_serverThread.reset(new thread(&GameServer::Exec, Instance.get())); Instance->_serverThread.reset(new thread(&GameServer::Exec, Instance.get()));
} }

View file

@ -9,10 +9,10 @@
using std::thread; using std::thread;
class Console; class Console;
class GameServer : public IInputRecorder, public IInputProvider class GameServer : public IInputRecorder, public IInputProvider, public INotificationListener
{ {
private: private:
static unique_ptr<GameServer> Instance; static shared_ptr<GameServer> Instance;
shared_ptr<Console> _console; shared_ptr<Console> _console;
unique_ptr<thread> _serverThread; unique_ptr<thread> _serverThread;
atomic<bool> _stop; atomic<bool> _stop;
@ -35,6 +35,8 @@ public:
GameServer(shared_ptr<Console> console, uint16_t port, string password, string hostPlayerName); GameServer(shared_ptr<Console> console, uint16_t port, string password, string hostPlayerName);
virtual ~GameServer(); virtual ~GameServer();
void RegisterServerInput();
static void StartServer(shared_ptr<Console> console, uint16_t port, string password, string hostPlayerName); static void StartServer(shared_ptr<Console> console, uint16_t port, string password, string hostPlayerName);
static void StopServer(); static void StopServer();
static bool Started(); static bool Started();
@ -50,4 +52,7 @@ public:
bool SetInput(BaseControlDevice *device) override; bool SetInput(BaseControlDevice *device) override;
void RecordInput(vector<shared_ptr<BaseControlDevice>> devices) override; void RecordInput(vector<shared_ptr<BaseControlDevice>> devices) override;
// Inherited via INotificationListener
virtual void ProcessNotification(ConsoleNotificationType type, void * parameter) override;
}; };