mirror of https://github.com/mgba-emu/mgba.git
Qt: Resume crashed game when loading a save state
This commit is contained in:
parent
83f0deab1b
commit
5dbe240442
1
CHANGES
1
CHANGES
|
@ -107,6 +107,7 @@ Misc:
|
|||
- Qt: Improve cheat parsing (fixes mgba.io/i/2297)
|
||||
- Qt: Change lossless setting to use WavPack audio
|
||||
- Qt: Use FFmpeg to convert additional camera formats, if available
|
||||
- Qt: Resume crashed game when loading a save state
|
||||
- SDL: Support exposing an axis directly as the gyro value (closes mgba.io/i/2531)
|
||||
- Windows: Attach to console if present
|
||||
- Vita: Add bilinear filtering option (closes mgba.io/i/344)
|
||||
|
|
|
@ -101,8 +101,6 @@ struct mCoreThreadInternal {
|
|||
bool mCoreThreadStart(struct mCoreThread* threadContext);
|
||||
bool mCoreThreadHasStarted(struct mCoreThread* threadContext);
|
||||
bool mCoreThreadHasExited(struct mCoreThread* threadContext);
|
||||
bool mCoreThreadHasCrashed(struct mCoreThread* threadContext);
|
||||
void mCoreThreadMarkCrashed(struct mCoreThread* threadContext);
|
||||
void mCoreThreadEnd(struct mCoreThread* threadContext);
|
||||
void mCoreThreadReset(struct mCoreThread* threadContext);
|
||||
void mCoreThreadJoin(struct mCoreThread* threadContext);
|
||||
|
@ -122,6 +120,10 @@ void mCoreThreadPauseFromThread(struct mCoreThread* threadContext);
|
|||
void mCoreThreadWaitFromThread(struct mCoreThread* threadContext);
|
||||
void mCoreThreadStopWaiting(struct mCoreThread* threadContext);
|
||||
|
||||
bool mCoreThreadHasCrashed(struct mCoreThread* threadContext);
|
||||
void mCoreThreadMarkCrashed(struct mCoreThread* threadContext);
|
||||
void mCoreThreadClearCrashed(struct mCoreThread* threadContext);
|
||||
|
||||
void mCoreThreadSetRewinding(struct mCoreThread* threadContext, bool);
|
||||
void mCoreThreadRewindParamsChanged(struct mCoreThread* threadContext);
|
||||
|
||||
|
|
|
@ -526,6 +526,15 @@ void mCoreThreadMarkCrashed(struct mCoreThread* threadContext) {
|
|||
MutexUnlock(&threadContext->impl->stateMutex);
|
||||
}
|
||||
|
||||
void mCoreThreadClearCrashed(struct mCoreThread* threadContext) {
|
||||
MutexLock(&threadContext->impl->stateMutex);
|
||||
if (threadContext->impl->state == mTHREAD_CRASHED) {
|
||||
threadContext->impl->state = mTHREAD_REQUEST;
|
||||
ConditionWake(&threadContext->impl->stateCond);
|
||||
}
|
||||
MutexUnlock(&threadContext->impl->stateMutex);
|
||||
}
|
||||
|
||||
void mCoreThreadEnd(struct mCoreThread* threadContext) {
|
||||
MutexLock(&threadContext->impl->stateMutex);
|
||||
_waitOnInterrupt(threadContext->impl);
|
||||
|
@ -685,6 +694,10 @@ void mCoreThreadPauseFromThread(struct mCoreThread* threadContext) {
|
|||
void mCoreThreadSetRewinding(struct mCoreThread* threadContext, bool rewinding) {
|
||||
MutexLock(&threadContext->impl->stateMutex);
|
||||
threadContext->impl->rewinding = rewinding;
|
||||
if (rewinding && threadContext->impl->state == mTHREAD_CRASHED) {
|
||||
threadContext->impl->state = mTHREAD_REQUEST;
|
||||
ConditionWake(&threadContext->impl->stateCond);
|
||||
}
|
||||
MutexUnlock(&threadContext->impl->stateMutex);
|
||||
}
|
||||
|
||||
|
|
|
@ -613,6 +613,7 @@ void CoreController::loadState(int slot) {
|
|||
m_stateSlot = slot;
|
||||
m_backupSaveState.clear();
|
||||
}
|
||||
mCoreThreadClearCrashed(&m_threadContext);
|
||||
mCoreThreadRunFunction(&m_threadContext, [](mCoreThread* context) {
|
||||
CoreController* controller = static_cast<CoreController*>(context->userData);
|
||||
if (!controller->m_backupLoadState.isOpen()) {
|
||||
|
@ -632,6 +633,7 @@ void CoreController::loadState(const QString& path, int flags) {
|
|||
if (flags != -1) {
|
||||
m_loadStateFlags = flags;
|
||||
}
|
||||
mCoreThreadClearCrashed(&m_threadContext);
|
||||
mCoreThreadRunFunction(&m_threadContext, [](mCoreThread* context) {
|
||||
CoreController* controller = static_cast<CoreController*>(context->userData);
|
||||
VFile* vf = VFileDevice::open(controller->m_statePath, O_RDONLY);
|
||||
|
@ -660,6 +662,7 @@ void CoreController::loadState(QIODevice* iodev, int flags) {
|
|||
if (flags != -1) {
|
||||
m_loadStateFlags = flags;
|
||||
}
|
||||
mCoreThreadClearCrashed(&m_threadContext);
|
||||
mCoreThreadRunFunction(&m_threadContext, [](mCoreThread* context) {
|
||||
CoreController* controller = static_cast<CoreController*>(context->userData);
|
||||
VFile* vf = controller->m_stateVf;
|
||||
|
|
Loading…
Reference in New Issue