Core: Add savedataUpdated callback
Vicki Pfau vi@endrift.com
Fri, 28 Aug 2020 00:53:40 -0700
4 files changed,
15 insertions(+),
4 deletions(-)
M
include/mgba/core/interface.h
→
include/mgba/core/interface.h
@@ -91,6 +91,7 @@ void (*videoFrameEnded)(void* context);
void (*coreCrashed)(void* context); void (*sleep)(void* context); void (*keysRead)(void* context); + void (*savedataUpdated)(void* context); }; DECLARE_VECTOR(mCoreCallbacksList, struct mCoreCallbacks);
M
src/gb/gb.c
→
src/gb/gb.c
@@ -247,6 +247,14 @@ mLOG(GB_MEM, INFO, "Savedata synced");
} else { mLOG(GB_MEM, INFO, "Savedata failed to sync!"); } + + size_t c; + for (c = 0; c < mCoreCallbacksListSize(&gb->coreCallbacks); ++c) { + struct mCoreCallbacks* callbacks = mCoreCallbacksListGetPointer(&gb->coreCallbacks, c); + if (callbacks->savedataUpdated) { + callbacks->savedataUpdated(callbacks->context); + } + } } }
M
src/gba/gba.c
→
src/gba/gba.c
@@ -816,6 +816,7 @@ }
} void GBAFrameEnded(struct GBA* gba) { + int wasDirty = gba->memory.savedata.dirty; GBASavedataClean(&gba->memory.savedata, gba->video.frameCounter); if (gba->cpu->components && gba->cpu->components[CPU_COMPONENT_CHEAT_DEVICE]) {@@ -845,6 +846,9 @@ for (c = 0; c < mCoreCallbacksListSize(&gba->coreCallbacks); ++c) {
struct mCoreCallbacks* callbacks = mCoreCallbacksListGetPointer(&gba->coreCallbacks, c); if (callbacks->videoFrameEnded) { callbacks->videoFrameEnded(callbacks->context); + } + if (callbacks->savedataUpdated && wasDirty && !gba->memory.savedata.dirty) { + callbacks->savedataUpdated(callbacks->context); } } }
M
src/gba/savedata.c
→
src/gba/savedata.c
@@ -534,16 +534,14 @@ }
if (savedata->dirty & SAVEDATA_DIRT_NEW) { savedata->dirtAge = frameCount; savedata->dirty &= ~SAVEDATA_DIRT_NEW; - if (!(savedata->dirty & SAVEDATA_DIRT_SEEN)) { - savedata->dirty |= SAVEDATA_DIRT_SEEN; - } + savedata->dirty |= SAVEDATA_DIRT_SEEN; } else if ((savedata->dirty & SAVEDATA_DIRT_SEEN) && frameCount - savedata->dirtAge > CLEANUP_THRESHOLD) { if (savedata->maskWriteback) { GBASavedataUnmask(savedata); } + savedata->dirty = 0; if (savedata->mapMode & MAP_WRITE) { size_t size = GBASavedataSize(savedata); - savedata->dirty = 0; if (savedata->data && savedata->vf->sync(savedata->vf, savedata->data, size)) { mLOG(GBA_SAVE, INFO, "Savedata synced"); } else {