From d8212fd927fea1166606d7b12811030487db8704 Mon Sep 17 00:00:00 2001 From: spycrab Date: Wed, 4 Jul 2018 00:52:53 +0200 Subject: [PATCH 1/3] Core/Core: Fix getting stuck when Stop is called without emulation running --- Source/Core/Core/Core.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Core/Core/Core.cpp b/Source/Core/Core/Core.cpp index f54e477be3..f5bd36ab9b 100644 --- a/Source/Core/Core/Core.cpp +++ b/Source/Core/Core/Core.cpp @@ -237,7 +237,7 @@ static void ResetRumble() // Called from GUI thread void Stop() // - Hammertime! { - if (GetState() == State::Stopping) + if (GetState() == State::Stopping || GetState() == State::Uninitialized) return; const SConfig& _CoreParameter = SConfig::GetInstance(); From bbbd886184152e5759187eb375a1c69e693cd689 Mon Sep 17 00:00:00 2001 From: spycrab Date: Wed, 4 Jul 2018 00:54:50 +0200 Subject: [PATCH 2/3] Qt/MainWindow: Instantly stop when requested by NetPlay --- Source/Core/DolphinQt2/MainWindow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Core/DolphinQt2/MainWindow.cpp b/Source/Core/DolphinQt2/MainWindow.cpp index 926b62273e..e621d2ac2c 100644 --- a/Source/Core/DolphinQt2/MainWindow.cpp +++ b/Source/Core/DolphinQt2/MainWindow.cpp @@ -1041,7 +1041,7 @@ void MainWindow::NetPlayInit() connect(m_netplay_dialog, &NetPlayDialog::Boot, this, [this](const QString& path) { StartGame(path); }); - connect(m_netplay_dialog, &NetPlayDialog::Stop, this, &MainWindow::RequestStop); + connect(m_netplay_dialog, &NetPlayDialog::Stop, this, &MainWindow::ForceStop); connect(m_netplay_dialog, &NetPlayDialog::rejected, this, &MainWindow::NetPlayQuit); connect(m_netplay_setup_dialog, &NetPlaySetupDialog::Join, this, &MainWindow::NetPlayJoin); connect(m_netplay_setup_dialog, &NetPlaySetupDialog::Host, this, &MainWindow::NetPlayHost); From f7887a442f675a90d824a3bd4ca0929b9f78200e Mon Sep 17 00:00:00 2001 From: spycrab Date: Wed, 4 Jul 2018 01:02:13 +0200 Subject: [PATCH 3/3] Qt/NetPlayDialog: Stop games properly --- Source/Core/Core/NetPlayClient.cpp | 9 +++++++++ Source/Core/Core/NetPlayClient.h | 1 + Source/Core/Core/NetPlayServer.cpp | 7 +++++-- .../Core/DolphinQt2/NetPlay/NetPlayDialog.cpp | 19 ++++++++++++++----- .../Core/DolphinQt2/NetPlay/NetPlayDialog.h | 1 + 5 files changed, 30 insertions(+), 7 deletions(-) diff --git a/Source/Core/Core/NetPlayClient.cpp b/Source/Core/Core/NetPlayClient.cpp index 6b2c226f88..1e97ec1d2c 100644 --- a/Source/Core/Core/NetPlayClient.cpp +++ b/Source/Core/Core/NetPlayClient.cpp @@ -1152,6 +1152,15 @@ void NetPlayClient::Stop() m_gc_pad_event.Set(); m_wii_pad_event.Set(); + // Tell the server to stop if we have a pad mapped in game. + if (LocalPlayerHasControllerMapped()) + SendStopGamePacket(); + else + StopGame(); +} + +void NetPlayClient::RequestStopGame() +{ // Tell the server to stop if we have a pad mapped in game. if (LocalPlayerHasControllerMapped()) SendStopGamePacket(); diff --git a/Source/Core/Core/NetPlayClient.h b/Source/Core/Core/NetPlayClient.h index 2373f72084..cf7889abf1 100644 --- a/Source/Core/Core/NetPlayClient.h +++ b/Source/Core/Core/NetPlayClient.h @@ -80,6 +80,7 @@ public: void Stop(); bool ChangeGame(const std::string& game); void SendChatMessage(const std::string& msg); + void RequestStopGame(); // Send and receive pads values bool WiimoteUpdate(int _number, u8* data, const u8 size, u8 reporting_mode); diff --git a/Source/Core/Core/NetPlayServer.cpp b/Source/Core/Core/NetPlayServer.cpp index 416b358449..d1e533c8db 100644 --- a/Source/Core/Core/NetPlayServer.cpp +++ b/Source/Core/Core/NetPlayServer.cpp @@ -607,14 +607,17 @@ unsigned int NetPlayServer::OnData(sf::Packet& packet, Client& player) case NP_MSG_STOP_GAME: { + if (!m_is_running) + break; + + m_is_running = false; + // tell clients to stop game sf::Packet spac; spac << (MessageId)NP_MSG_STOP_GAME; std::lock_guard lkp(m_crit.players); SendToClients(spac); - - m_is_running = false; } break; diff --git a/Source/Core/DolphinQt2/NetPlay/NetPlayDialog.cpp b/Source/Core/DolphinQt2/NetPlay/NetPlayDialog.cpp index 693e9c77d4..3b4a441b15 100644 --- a/Source/Core/DolphinQt2/NetPlay/NetPlayDialog.cpp +++ b/Source/Core/DolphinQt2/NetPlay/NetPlayDialog.cpp @@ -245,8 +245,12 @@ void NetPlayDialog::ConnectWidgets() }); connect(&Settings::Instance(), &Settings::EmulationStateChanged, this, [=](Core::State state) { - if (state == Core::State::Uninitialized && isVisible()) - GameStatusChanged(false); + if (isVisible()) + { + GameStatusChanged(state != Core::State::Uninitialized); + if (state == Core::State::Uninitialized) + DisplayMessage(tr("Stopped game"), "red"); + } }); } @@ -452,11 +456,16 @@ void NetPlayDialog::UpdateGUI() void NetPlayDialog::BootGame(const std::string& filename) { + m_got_stop_request = false; emit Boot(QString::fromStdString(filename)); } void NetPlayDialog::StopGame() { + if (m_got_stop_request) + return; + + m_got_stop_request = true; emit Stop(); } @@ -508,6 +517,9 @@ void NetPlayDialog::OnMsgChangeGame(const std::string& title) void NetPlayDialog::GameStatusChanged(bool running) { + if (!running && !m_got_stop_request) + Settings::Instance().GetNetPlayClient()->RequestStopGame(); + QueueOnObject(this, [this, running] { if (Settings::Instance().GetNetPlayServer() != nullptr) { @@ -525,7 +537,6 @@ void NetPlayDialog::GameStatusChanged(bool running) void NetPlayDialog::OnMsgStartGame() { DisplayMessage(tr("Started game"), "green"); - GameStatusChanged(true); QueueOnObject(this, [this] { Settings::Instance().GetNetPlayClient()->StartGame(FindGame(m_current_game)); @@ -534,8 +545,6 @@ void NetPlayDialog::OnMsgStartGame() void NetPlayDialog::OnMsgStopGame() { - DisplayMessage(tr("Stopped game"), "red"); - GameStatusChanged(false); } void NetPlayDialog::OnPadBufferChanged(u32 buffer) diff --git a/Source/Core/DolphinQt2/NetPlay/NetPlayDialog.h b/Source/Core/DolphinQt2/NetPlay/NetPlayDialog.h index 2f121c88f0..8bc5778f7d 100644 --- a/Source/Core/DolphinQt2/NetPlay/NetPlayDialog.h +++ b/Source/Core/DolphinQt2/NetPlay/NetPlayDialog.h @@ -109,5 +109,6 @@ private: GameListModel* m_game_list_model = nullptr; bool m_use_traversal = false; bool m_is_copy_button_retry = false; + bool m_got_stop_request = true; int m_buffer_size = 0; };