Skip to content

Commit 54e6369

Browse files
refactor multiplayer controller and core controller for improved synchronization and management
1 parent 65efa88 commit 54e6369

5 files changed

Lines changed: 287 additions & 80 deletions

File tree

src/platform/libretro/core_controller.c

Lines changed: 38 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,37 +9,66 @@ void CoreControllerInit(struct CoreController* controller, struct mCore* core) {
99
controller->core = core;
1010
controller->threadContext.core = core;
1111
controller->threadContext.userData = controller;
12-
13-
// Minimal version from Qt:
14-
controller->isPaused = false;
1512
controller->hasStarted = false;
16-
17-
// Qt version adds a lot of logging, etc. but we'll use libretro callbacks directly later.
13+
controller->multiplayer = NULL;
1814
}
1915

2016
void CoreControllerDeinit(struct CoreController* controller) {
21-
if (controller->core) {
22-
controller->core->deinit(controller->core);
17+
if (!controller) {
18+
return;
2319
}
20+
controller->hasStarted = false;
21+
controller->multiplayer = NULL;
22+
controller->core = NULL;
2423
}
2524

2625
void CoreControllerSetPath(struct CoreController* controller, const char* path) {
26+
if (!path) {
27+
controller->path[0] = '\0';
28+
return;
29+
}
2730
strncpy(controller->path, path, sizeof(controller->path) - 1);
31+
controller->path[sizeof(controller->path) - 1] = '\0';
2832
}
2933

3034
void CoreControllerStart(struct CoreController* controller) {
31-
if (controller->hasStarted) {
35+
if (!controller || !controller->core || controller->hasStarted) {
3236
return;
3337
}
3438
mCoreThreadStart(&controller->threadContext);
3539
controller->hasStarted = true;
3640
}
3741

3842
void CoreControllerStop(struct CoreController* controller) {
39-
if (!controller->hasStarted) {
43+
if (!controller || !controller->hasStarted) {
4044
return;
4145
}
4246
mCoreThreadEnd(&controller->threadContext);
4347
mCoreThreadJoin(&controller->threadContext);
4448
controller->hasStarted = false;
4549
}
50+
51+
bool CoreControllerIsPaused(const struct CoreController* controller) {
52+
if (!controller || !controller->hasStarted) {
53+
return false;
54+
}
55+
return mCoreThreadIsPaused((struct mCoreThread*) &controller->threadContext);
56+
}
57+
58+
bool CoreControllerHasStarted(const struct CoreController* controller) {
59+
return controller && controller->hasStarted;
60+
}
61+
62+
void CoreControllerSetMultiplayer(struct CoreController* controller, struct MultiplayerController* multiplayer) {
63+
if (!controller) {
64+
return;
65+
}
66+
controller->multiplayer = multiplayer;
67+
}
68+
69+
void CoreControllerClearMultiplayer(struct CoreController* controller) {
70+
if (!controller) {
71+
return;
72+
}
73+
controller->multiplayer = NULL;
74+
}

src/platform/libretro/core_controller.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,7 @@ struct CoreController {
1010
struct mCore* core;
1111
char path[256];
1212
char savePath[256];
13-
bool isPaused;
1413
bool hasStarted;
15-
void* userData;
1614
struct MultiplayerController* multiplayer;
1715
};
1816

@@ -21,5 +19,9 @@ void CoreControllerDeinit(struct CoreController* controller);
2119
void CoreControllerSetPath(struct CoreController* controller, const char* path);
2220
void CoreControllerStart(struct CoreController* controller);
2321
void CoreControllerStop(struct CoreController* controller);
22+
bool CoreControllerIsPaused(const struct CoreController* controller);
23+
bool CoreControllerHasStarted(const struct CoreController* controller);
24+
void CoreControllerSetMultiplayer(struct CoreController* controller, struct MultiplayerController* multiplayer);
25+
void CoreControllerClearMultiplayer(struct CoreController* controller);
2426

2527
#endif

src/platform/libretro/libretro.c

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2258,17 +2258,6 @@ bool retro_load_game(const struct retro_game_info* game) {
22582258
if (numCores > 1) {
22592259
for (int i = 0; i < numCores; ++i) {
22602260
CoreControllerStart(&controllers[i]);
2261-
mCoreThreadPause(&controllers[i].threadContext);
2262-
struct mCoreSync* sync = &controllers[i].threadContext.impl->sync;
2263-
MutexLock(&sync->videoFrameMutex);
2264-
sync->videoFrameWait = false;
2265-
MutexUnlock(&sync->videoFrameMutex);
2266-
2267-
if (i > 0) {
2268-
MutexLock(&sync->audioBufferMutex);
2269-
sync->audioWait = false;
2270-
MutexUnlock(&sync->audioBufferMutex);
2271-
}
22722261
}
22732262
}
22742263

@@ -2283,11 +2272,12 @@ void retro_unload_game(void) {
22832272
if (numCores > 1) {
22842273
MultiplayerControllerDetachGame(&multiplayer, &controllers[i]);
22852274
}
2286-
if (controllers[i].hasStarted) {
2275+
if (CoreControllerHasStarted(&controllers[i])) {
22872276
CoreControllerStop(&controllers[i]);
22882277
}
22892278
mCoreConfigDeinit(&controllers[i].core->config);
22902279
controllers[i].core->deinit(controllers[i].core);
2280+
CoreControllerDeinit(&controllers[i]);
22912281
}
22922282
MultiplayerControllerDeinit(&multiplayer);
22932283
numCores = 1;

0 commit comments

Comments
 (0)