mirror of https://github.com/mgba-emu/mgba.git
Core: Add single config option reloading function
This commit is contained in:
parent
4ea82f9e3a
commit
cbc27f08f9
|
@ -68,6 +68,7 @@ struct mCore {
|
||||||
|
|
||||||
void (*setSync)(struct mCore*, struct mCoreSync*);
|
void (*setSync)(struct mCore*, struct mCoreSync*);
|
||||||
void (*loadConfig)(struct mCore*, const struct mCoreConfig*);
|
void (*loadConfig)(struct mCore*, const struct mCoreConfig*);
|
||||||
|
void (*reloadConfigOption)(struct mCore*, const char* option, const struct mCoreConfig*);
|
||||||
|
|
||||||
void (*desiredVideoDimensions)(struct mCore*, unsigned* width, unsigned* height);
|
void (*desiredVideoDimensions)(struct mCore*, unsigned* width, unsigned* height);
|
||||||
void (*setVideoBuffer)(struct mCore*, color_t* buffer, size_t stride);
|
void (*setVideoBuffer)(struct mCore*, color_t* buffer, size_t stride);
|
||||||
|
|
|
@ -224,6 +224,59 @@ static void _GBCoreLoadConfig(struct mCore* core, const struct mCoreConfig* conf
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void _GBCoreReloadConfigOption(struct mCore* core, const char* option, const struct mCoreConfig* config) {
|
||||||
|
struct GB* gb = core->board;
|
||||||
|
if (!config) {
|
||||||
|
config = &core->config;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!option) {
|
||||||
|
// Reload options from opts
|
||||||
|
if (core->opts.mute) {
|
||||||
|
gb->audio.masterVolume = 0;
|
||||||
|
} else {
|
||||||
|
gb->audio.masterVolume = core->opts.volume;
|
||||||
|
}
|
||||||
|
gb->video.frameskip = core->opts.frameskip;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int fakeBool;
|
||||||
|
if (strcmp("mute", option) == 0) {
|
||||||
|
if (mCoreConfigGetIntValue(config, "mute", &fakeBool)) {
|
||||||
|
core->opts.mute = fakeBool;
|
||||||
|
|
||||||
|
if (core->opts.mute) {
|
||||||
|
gb->audio.masterVolume = 0;
|
||||||
|
} else {
|
||||||
|
gb->audio.masterVolume = core->opts.volume;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (strcmp("volume", option) == 0) {
|
||||||
|
if (mCoreConfigGetIntValue(config, "volume", &core->opts.volume) && !core->opts.mute) {
|
||||||
|
gb->audio.masterVolume = core->opts.volume;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (strcmp("frameskip", option) == 0) {
|
||||||
|
if (mCoreConfigGetIntValue(config, "frameskip", &core->opts.frameskip)) {
|
||||||
|
gb->video.frameskip = core->opts.frameskip;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (strcmp("allowOpposingDirections", option) == 0) {
|
||||||
|
if (config != &core->config) {
|
||||||
|
mCoreConfigCopyValue(&core->config, config, "allowOpposingDirections");
|
||||||
|
}
|
||||||
|
if (mCoreConfigGetIntValue(config, "allowOpposingDirections", &fakeBool)) {
|
||||||
|
gb->allowOpposingDirections = fakeBool;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void _GBCoreDesiredVideoDimensions(struct mCore* core, unsigned* width, unsigned* height) {
|
static void _GBCoreDesiredVideoDimensions(struct mCore* core, unsigned* width, unsigned* height) {
|
||||||
struct GB* gb = core->board;
|
struct GB* gb = core->board;
|
||||||
if (gb && (!(gb->model & GB_MODEL_SGB) || !gb->video.sgbBorders)) {
|
if (gb && (!(gb->model & GB_MODEL_SGB) || !gb->video.sgbBorders)) {
|
||||||
|
@ -901,6 +954,7 @@ struct mCore* GBCoreCreate(void) {
|
||||||
core->supportsFeature = _GBCoreSupportsFeature;
|
core->supportsFeature = _GBCoreSupportsFeature;
|
||||||
core->setSync = _GBCoreSetSync;
|
core->setSync = _GBCoreSetSync;
|
||||||
core->loadConfig = _GBCoreLoadConfig;
|
core->loadConfig = _GBCoreLoadConfig;
|
||||||
|
core->reloadConfigOption = _GBCoreReloadConfigOption;
|
||||||
core->desiredVideoDimensions = _GBCoreDesiredVideoDimensions;
|
core->desiredVideoDimensions = _GBCoreDesiredVideoDimensions;
|
||||||
core->setVideoBuffer = _GBCoreSetVideoBuffer;
|
core->setVideoBuffer = _GBCoreSetVideoBuffer;
|
||||||
core->setVideoGLTex = _GBCoreSetVideoGLTex;
|
core->setVideoGLTex = _GBCoreSetVideoGLTex;
|
||||||
|
|
|
@ -296,6 +296,59 @@ static void _GBACoreLoadConfig(struct mCore* core, const struct mCoreConfig* con
|
||||||
mCoreConfigCopyValue(&core->config, config, "videoScale");
|
mCoreConfigCopyValue(&core->config, config, "videoScale");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void _GBACoreReloadConfigOption(struct mCore* core, const char* option, const struct mCoreConfig* config) {
|
||||||
|
struct GBA* gba = core->board;
|
||||||
|
if (!config) {
|
||||||
|
config = &core->config;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!option) {
|
||||||
|
// Reload options from opts
|
||||||
|
if (core->opts.mute) {
|
||||||
|
gba->audio.masterVolume = 0;
|
||||||
|
} else {
|
||||||
|
gba->audio.masterVolume = core->opts.volume;
|
||||||
|
}
|
||||||
|
gba->video.frameskip = core->opts.frameskip;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int fakeBool;
|
||||||
|
if (strcmp("mute", option) == 0) {
|
||||||
|
if (mCoreConfigGetIntValue(config, "mute", &fakeBool)) {
|
||||||
|
core->opts.mute = fakeBool;
|
||||||
|
|
||||||
|
if (core->opts.mute) {
|
||||||
|
gba->audio.masterVolume = 0;
|
||||||
|
} else {
|
||||||
|
gba->audio.masterVolume = core->opts.volume;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (strcmp("volume", option) == 0) {
|
||||||
|
if (mCoreConfigGetIntValue(config, "volume", &core->opts.volume) && !core->opts.mute) {
|
||||||
|
gba->audio.masterVolume = core->opts.volume;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (strcmp("frameskip", option) == 0) {
|
||||||
|
if (mCoreConfigGetIntValue(config, "frameskip", &core->opts.frameskip)) {
|
||||||
|
gba->video.frameskip = core->opts.frameskip;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (strcmp("allowOpposingDirections", option) == 0) {
|
||||||
|
if (config != &core->config) {
|
||||||
|
mCoreConfigCopyValue(&core->config, config, "allowOpposingDirections");
|
||||||
|
}
|
||||||
|
if (mCoreConfigGetIntValue(config, "allowOpposingDirections", &fakeBool)) {
|
||||||
|
gba->allowOpposingDirections = fakeBool;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void _GBACoreDesiredVideoDimensions(struct mCore* core, unsigned* width, unsigned* height) {
|
static void _GBACoreDesiredVideoDimensions(struct mCore* core, unsigned* width, unsigned* height) {
|
||||||
#if defined(BUILD_GLES2) || defined(BUILD_GLES3)
|
#if defined(BUILD_GLES2) || defined(BUILD_GLES3)
|
||||||
struct GBACore* gbacore = (struct GBACore*) core;
|
struct GBACore* gbacore = (struct GBACore*) core;
|
||||||
|
@ -1021,6 +1074,7 @@ struct mCore* GBACoreCreate(void) {
|
||||||
core->supportsFeature = _GBACoreSupportsFeature;
|
core->supportsFeature = _GBACoreSupportsFeature;
|
||||||
core->setSync = _GBACoreSetSync;
|
core->setSync = _GBACoreSetSync;
|
||||||
core->loadConfig = _GBACoreLoadConfig;
|
core->loadConfig = _GBACoreLoadConfig;
|
||||||
|
core->reloadConfigOption = _GBACoreReloadConfigOption;
|
||||||
core->desiredVideoDimensions = _GBACoreDesiredVideoDimensions;
|
core->desiredVideoDimensions = _GBACoreDesiredVideoDimensions;
|
||||||
core->setVideoBuffer = _GBACoreSetVideoBuffer;
|
core->setVideoBuffer = _GBACoreSetVideoBuffer;
|
||||||
core->setVideoGLTex = _GBACoreSetVideoGLTex;
|
core->setVideoGLTex = _GBACoreSetVideoGLTex;
|
||||||
|
|
|
@ -922,33 +922,8 @@ void CoreController::updateFastForward() {
|
||||||
m_threadContext.impl->sync.fpsTarget = m_fpsTarget;
|
m_threadContext.impl->sync.fpsTarget = m_fpsTarget;
|
||||||
setSync(true);
|
setSync(true);
|
||||||
}
|
}
|
||||||
// XXX: Have a way of just updating volume
|
|
||||||
switch (platform()) {
|
m_threadContext.core->reloadConfigOption(m_threadContext.core, NULL, NULL);
|
||||||
#ifdef M_CORE_GBA
|
|
||||||
case PLATFORM_GBA: {
|
|
||||||
GBA* gba = static_cast<GBA*>(m_threadContext.core->board);
|
|
||||||
if (m_threadContext.core->opts.mute) {
|
|
||||||
gba->audio.masterVolume = 0;
|
|
||||||
} else {
|
|
||||||
gba->audio.masterVolume = m_threadContext.core->opts.volume;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#ifdef M_CORE_GB
|
|
||||||
case PLATFORM_GB: {
|
|
||||||
GB* gb = static_cast<GB*>(m_threadContext.core->board);
|
|
||||||
if (m_threadContext.core->opts.mute) {
|
|
||||||
gb->audio.masterVolume = 0;
|
|
||||||
} else {
|
|
||||||
gb->audio.masterVolume = m_threadContext.core->opts.volume;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
CoreController::Interrupter::Interrupter(CoreController* parent, bool fromThread)
|
CoreController::Interrupter::Interrupter(CoreController* parent, bool fromThread)
|
||||||
|
|
Loading…
Reference in New Issue