From 5db42e83c97d705a0a1d564148458bf29082c4bc Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Thu, 12 Sep 2024 02:13:38 -0700 Subject: [PATCH] Qt: Delay attaching SIO driver until a second player is connected --- src/platform/qt/MultiplayerController.cpp | 39 ++++++++++++++++------- src/platform/qt/MultiplayerController.h | 1 + 2 files changed, 29 insertions(+), 11 deletions(-) diff --git a/src/platform/qt/MultiplayerController.cpp b/src/platform/qt/MultiplayerController.cpp index 616a252b5..0d12359bb 100644 --- a/src/platform/qt/MultiplayerController.cpp +++ b/src/platform/qt/MultiplayerController.cpp @@ -201,7 +201,8 @@ bool MultiplayerController::attachGame(CoreController* controller) { interrupters.append(p.controller); } - if (attached() == 0) { + bool doDelayedAttach = false; + if (m_platform == mPLATFORM_NONE) { switch (controller->platform()) { #ifdef M_CORE_GBA case mPLATFORM_GBA: @@ -242,8 +243,6 @@ bool MultiplayerController::attachGame(CoreController* controller) { return false; } - GBA* gba = static_cast(thread->core->board); - GBASIOLockstepDriver* node = new GBASIOLockstepDriver; LockstepUser* user = new LockstepUser; mLockstepThreadUserInit(user, thread); @@ -262,10 +261,11 @@ bool MultiplayerController::attachGame(CoreController* controller) { }; GBASIOLockstepDriverCreate(node, &user->d); - GBASIOLockstepCoordinatorAttach(&m_gbaCoordinator, node); player.node.gba = node; - GBASIOSetDriver(&gba->sio, &node->d); + if (m_pids.size()) { + doDelayedAttach = true; + } break; } #endif @@ -281,6 +281,7 @@ bool MultiplayerController::attachGame(CoreController* controller) { GBSIOLockstepNodeCreate(node); GBSIOLockstepAttachNode(&m_gbLockstep, node); player.node.gb = node; + player.attached = true; GBSIOSetDriver(&gb->sio, &node->d); break; @@ -320,6 +321,19 @@ bool MultiplayerController::attachGame(CoreController* controller) { ++m_nextPid; fixOrder(); + if (doDelayedAttach) { + for (auto pid: m_players) { + Player& player = m_pids.find(pid).value(); + if (player.attached) { + continue; + } + GBA* gba = static_cast(player.controller->thread()->core->board); + GBASIOLockstepCoordinatorAttach(&m_gbaCoordinator, player.node.gba); + GBASIOSetDriver(&gba->sio, &player.node.gba->d); + player.attached = true; + } + } + emit gameAttached(); return true; } @@ -354,13 +368,16 @@ void MultiplayerController::detachGame(CoreController* controller) { #ifdef M_CORE_GBA case mPLATFORM_GBA: { GBA* gba = static_cast(thread->core->board); - GBASIOLockstepDriver* node = reinterpret_cast(gba->sio.driver); - GBASIOSetDriver(&gba->sio, nullptr); - if (node) { - GBASIOLockstepCoordinatorDetach(&m_gbaCoordinator, node); - delete node->user; - delete node; + Player& p = m_pids.find(pid).value(); + GBASIODriver* node = gba->sio.driver; + if (node == &p.node.gba->d) { + GBASIOSetDriver(&gba->sio, nullptr); } + if (p.attached) { + GBASIOLockstepCoordinatorDetach(&m_gbaCoordinator, p.node.gba); + } + delete p.node.gba->user; + delete p.node.gba; break; } #endif diff --git a/src/platform/qt/MultiplayerController.h b/src/platform/qt/MultiplayerController.h index 9eaf20b16..666cb390b 100644 --- a/src/platform/qt/MultiplayerController.h +++ b/src/platform/qt/MultiplayerController.h @@ -64,6 +64,7 @@ private: unsigned waitMask = 0; int saveId = 1; int preferredId = 0; + bool attached = false; }; struct LockstepUser : mLockstepThreadUser { MultiplayerController* controller;