From a8565b952cf717cad4171b610fea6315704f5921 Mon Sep 17 00:00:00 2001 From: Alex Duchesne Date: Tue, 17 Dec 2024 13:03:08 -0500 Subject: [PATCH] Removed app.options entirely, now rely on the handler The advantage is that the menu entries are generated on demand, so they'll always be up to date irt language. I think it would be better if the options_handler was in charge of showing the dialog too. It would allow in-app menus and it will also avoid the careless unbounded copying. But this first step preserves the previous behavior. --- components/retro-go/rg_gui.c | 8 ++------ components/retro-go/rg_system.c | 14 +++++++++----- components/retro-go/rg_system.h | 5 ++--- fmsx/main/main.c | 16 +++++++++------- gwenesis/main/main.c | 17 ++++++++++------- prboom-go/main/main.c | 13 ++++++++----- retro-core/main/main_gbc.c | 19 +++++++++++-------- retro-core/main/main_lynx.cpp | 14 ++++++++------ retro-core/main/main_nes.c | 19 +++++++++++-------- retro-core/main/main_pce.c | 13 ++++++++----- retro-core/main/main_sms.c | 13 ++++++++----- retro-core/main/main_snes.c | 17 ++++++++++------- 12 files changed, 96 insertions(+), 72 deletions(-) diff --git a/components/retro-go/rg_gui.c b/components/retro-go/rg_gui.c index a9fcfffc..4a5ed767 100644 --- a/components/retro-go/rg_gui.c +++ b/components/retro-go/rg_gui.c @@ -1570,6 +1570,7 @@ void rg_gui_options_menu(void) #ifdef RG_ENABLE_NETWORKING *opt++ = (rg_gui_option_t){0, _("Wi-Fi options"), NULL, RG_DIALOG_FLAG_NORMAL, &wifi_cb}; #endif + *opt++ = (rg_gui_option_t)RG_DIALOG_END; } // App settings that are shown only inside a game else @@ -1579,14 +1580,9 @@ void rg_gui_options_menu(void) *opt++ = (rg_gui_option_t){0, _("Filter"), "-", RG_DIALOG_FLAG_NORMAL, &filter_update_cb}; *opt++ = (rg_gui_option_t){0, _("Border"), "-", RG_DIALOG_FLAG_NORMAL, &border_update_cb}; *opt++ = (rg_gui_option_t){0, _("Speed"), "-", RG_DIALOG_FLAG_NORMAL, &speedup_update_cb}; + *opt++ = (rg_gui_option_t)RG_DIALOG_END; } - size_t extra_options = get_dialog_items_count(app->options); - for (size_t i = 0; i < extra_options; i++) - *opt++ = app->options[i]; - - *opt++ = (rg_gui_option_t)RG_DIALOG_END; - if (app->handlers.options) app->handlers.options(options + get_dialog_items_count(options)); diff --git a/components/retro-go/rg_system.c b/components/retro-go/rg_system.c index 8b3cec6f..ba480e10 100644 --- a/components/retro-go/rg_system.c +++ b/components/retro-go/rg_system.c @@ -37,6 +37,11 @@ typedef struct rg_stats_t statistics; } panic_trace_t; +typedef struct +{ + uint32_t magicWord; +} boot_config_t; + typedef struct { int32_t totalFrames, fullFrames, partFrames, ticks; @@ -78,6 +83,7 @@ static struct // The trace will survive a software reset static RTC_NOINIT_ATTR panic_trace_t panicTrace; +// static RTC_NOINIT_ATTR boot_config_t bootConfig; static RTC_NOINIT_ATTR time_t rtcValue; static bool panicTraceCleared = false; static bool exitCalled = false; @@ -367,21 +373,20 @@ static void platform_init(void) #endif } -rg_app_t *rg_system_reinit(int sampleRate, const rg_handlers_t *handlers, const rg_gui_option_t *options) +rg_app_t *rg_system_reinit(int sampleRate, const rg_handlers_t *handlers, void *_unused) { if (!app.initialized) - return rg_system_init(sampleRate, handlers, options); + return rg_system_init(sampleRate, handlers, NULL); app.sampleRate = sampleRate; if (handlers) app.handlers = *handlers; - app.options = options; rg_audio_set_sample_rate(app.sampleRate); return &app; } -rg_app_t *rg_system_init(int sampleRate, const rg_handlers_t *handlers, const rg_gui_option_t *options) +rg_app_t *rg_system_init(int sampleRate, const rg_handlers_t *handlers, void *_unused) { RG_ASSERT(app.initialized == false, "rg_system_init() was already called."); bool enterRecoveryMode = false; @@ -414,7 +419,6 @@ rg_app_t *rg_system_init(int sampleRate, const rg_handlers_t *handlers, const rg .isRelease = false, .logLevel = RG_LOG_DEBUG, #endif - .options = options, // TO DO: We should make a copy of it? }; // Do this very early, may be needed to enable serial console diff --git a/components/retro-go/rg_system.h b/components/retro-go/rg_system.h index 0d11f7b1..00458aef 100644 --- a/components/retro-go/rg_system.h +++ b/components/retro-go/rg_system.h @@ -185,7 +185,6 @@ typedef struct int logLevel; int saveSlot; const char *romPath; - const rg_gui_option_t *options; rg_handlers_t handlers; bool initialized; } rg_app_t; @@ -210,8 +209,8 @@ typedef struct int freeStackMain; } rg_stats_t; -rg_app_t *rg_system_init(int sampleRate, const rg_handlers_t *handlers, const rg_gui_option_t *options); -rg_app_t *rg_system_reinit(int sampleRate, const rg_handlers_t *handlers, const rg_gui_option_t *options); +rg_app_t *rg_system_init(int sampleRate, const rg_handlers_t *handlers, void *_unused); +rg_app_t *rg_system_reinit(int sampleRate, const rg_handlers_t *handlers, void *_unused); void rg_system_panic(const char *context, const char *message) __attribute__((noreturn)); void rg_system_shutdown(void) __attribute__((noreturn)); void rg_system_sleep(void) __attribute__((noreturn)); diff --git a/fmsx/main/main.c b/fmsx/main/main.c index 45b4be4a..36d0a304 100644 --- a/fmsx/main/main.c +++ b/fmsx/main/main.c @@ -410,6 +410,13 @@ static void audioTask(void *arg) } } +static void options_handler(rg_gui_option_t *dest) +{ + *dest++ = (rg_gui_option_t){0, _("Input"), "-", RG_DIALOG_FLAG_NORMAL, &input_select_cb}; + *dest++ = (rg_gui_option_t){0, _("Crop"), "-", RG_DIALOG_FLAG_NORMAL, &crop_select_cb}; + *dest++ = (rg_gui_option_t)RG_DIALOG_END; +} + void app_main(void) { const rg_handlers_t handlers = { @@ -418,15 +425,10 @@ void app_main(void) .reset = &reset_handler, .screenshot = &screenshot_handler, .event = &event_handler, - }; - const rg_gui_option_t options[] = { - {0, _("Input"), "-", RG_DIALOG_FLAG_NORMAL, &input_select_cb}, - {0, _("Crop"), "-", RG_DIALOG_FLAG_NORMAL, &crop_select_cb}, - // {0, "fMSX Menu", NULL, RG_DIALOG_FLAG_NORMAL, &fmsx_menu_cb}, - RG_DIALOG_END, + .options = &options_handler, }; - app = rg_system_init(AUDIO_SAMPLE_RATE, &handlers, options); + app = rg_system_init(AUDIO_SAMPLE_RATE, &handlers, NULL); // This is probably not right, but the emulator outputs 440 samples per frame?? rg_system_set_tick_rate(55); diff --git a/gwenesis/main/main.c b/gwenesis/main/main.c index 3da75dcd..bba47b61 100644 --- a/gwenesis/main/main.c +++ b/gwenesis/main/main.c @@ -189,6 +189,14 @@ static void event_handler(int event, void *arg) } } +static void options_handler(rg_gui_option_t *dest) +{ + *dest++ = (rg_gui_option_t){0, _("YM2612 audio "), "-", RG_DIALOG_FLAG_NORMAL, &yfm_update_cb}; + *dest++ = (rg_gui_option_t){0, _("SN76489 audio"), "-", RG_DIALOG_FLAG_NORMAL, &sn76489_update_cb}; + *dest++ = (rg_gui_option_t){0, _("Z80 emulation"), "-", RG_DIALOG_FLAG_NORMAL, &z80_update_cb}; + *dest++ = (rg_gui_option_t)RG_DIALOG_END; +} + void app_main(void) { const rg_handlers_t handlers = { @@ -197,15 +205,10 @@ void app_main(void) .reset = &reset_handler, .screenshot = &screenshot_handler, .event = &event_handler, - }; - const rg_gui_option_t options[] = { - {0, _("YM2612 audio "), "-", RG_DIALOG_FLAG_NORMAL, &yfm_update_cb}, - {0, _("SN76489 audio"), "-", RG_DIALOG_FLAG_NORMAL, &sn76489_update_cb}, - {0, _("Z80 emulation"), "-", RG_DIALOG_FLAG_NORMAL, &z80_update_cb}, - RG_DIALOG_END + .options = &options_handler, }; - app = rg_system_init(AUDIO_SAMPLE_RATE / 2, &handlers, options); + app = rg_system_init(AUDIO_SAMPLE_RATE / 2, &handlers, NULL); yfm_enabled = rg_settings_get_number(NS_APP, SETTING_YFM_EMULATION, 1); sn76489_enabled = rg_settings_get_number(NS_APP, SETTING_SN76489_EMULATION, 0); diff --git a/prboom-go/main/main.c b/prboom-go/main/main.c index 54e2480d..00fc49cf 100644 --- a/prboom-go/main/main.c +++ b/prboom-go/main/main.c @@ -524,6 +524,12 @@ bool is_iwad(const char *path) return header[0] == 'I' && header[1] == 'W'; } +static void options_handler(rg_gui_option_t *dest) +{ + *dest++ = (rg_gui_option_t){0, _("Gamma Boost"), "-", RG_DIALOG_FLAG_NORMAL, &gamma_update_cb}; + *dest++ = (rg_gui_option_t)RG_DIALOG_END; +} + void app_main() { const rg_handlers_t handlers = { @@ -532,13 +538,10 @@ void app_main() .reset = &reset_handler, .screenshot = &screenshot_handler, .event = &event_handler, - }; - const rg_gui_option_t options[] = { - {0, _("Gamma Boost"), "-", RG_DIALOG_FLAG_NORMAL, &gamma_update_cb}, - RG_DIALOG_END + .options = &options_handler, }; - app = rg_system_init(AUDIO_SAMPLE_RATE, &handlers, options); + app = rg_system_init(AUDIO_SAMPLE_RATE, &handlers, NULL); rg_system_set_tick_rate(TICRATE); const rg_display_t *display = rg_display_get_info(); diff --git a/retro-core/main/main_gbc.c b/retro-core/main/main_gbc.c index c9c34642..c41d282a 100644 --- a/retro-core/main/main_gbc.c +++ b/retro-core/main/main_gbc.c @@ -232,6 +232,15 @@ static void audio_callback(void *buffer, size_t length) audio_time += rg_system_timer() - startTime; } +static void options_handler(rg_gui_option_t *dest) +{ + *dest++ = (rg_gui_option_t){0, _("Palette"), "-", RG_DIALOG_FLAG_NORMAL, &palette_update_cb}; + *dest++ = (rg_gui_option_t){0, _("RTC config"), "-", RG_DIALOG_FLAG_NORMAL, &rtc_update_cb}; + *dest++ = (rg_gui_option_t){0, _("SRAM autosave"), "-", RG_DIALOG_FLAG_NORMAL, &sram_autosave_cb}; + *dest++ = (rg_gui_option_t){0, _("Enable BIOS"), "-", RG_DIALOG_FLAG_NORMAL, &enable_bios_cb}; + *dest++ = (rg_gui_option_t)RG_DIALOG_END; +} + void gbc_main(void) { const rg_handlers_t handlers = { @@ -240,16 +249,10 @@ void gbc_main(void) .reset = &reset_handler, .screenshot = &screenshot_handler, .event = &event_handler, - }; - const rg_gui_option_t options[] = { - {0, _("Palette"), "-", RG_DIALOG_FLAG_NORMAL, &palette_update_cb}, - {0, _("RTC config"), "-", RG_DIALOG_FLAG_NORMAL, &rtc_update_cb}, - {0, _("SRAM autosave"), "-", RG_DIALOG_FLAG_NORMAL, &sram_autosave_cb}, - {0, _("Enable BIOS"), "-", RG_DIALOG_FLAG_NORMAL, &enable_bios_cb}, - RG_DIALOG_END + .options = &options_handler, }; - app = rg_system_reinit(AUDIO_SAMPLE_RATE, &handlers, options); + app = rg_system_reinit(AUDIO_SAMPLE_RATE, &handlers, NULL); updates[0] = rg_surface_create(GB_WIDTH, GB_HEIGHT, RG_PIXEL_565_BE, MEM_ANY); updates[1] = rg_surface_create(GB_WIDTH, GB_HEIGHT, RG_PIXEL_565_BE, MEM_ANY); diff --git a/retro-core/main/main_lynx.cpp b/retro-core/main/main_lynx.cpp index 4bc23bd0..93c3c4e1 100644 --- a/retro-core/main/main_lynx.cpp +++ b/retro-core/main/main_lynx.cpp @@ -179,6 +179,12 @@ static bool reset_handler(bool hard) return true; } +static void options_handler(rg_gui_option_t *dest) +{ + *dest++ = (rg_gui_option_t){0, _("Rotation"), (char *)"-", RG_DIALOG_FLAG_NORMAL, &rotation_cb}; + *dest++ = (rg_gui_option_t)RG_DIALOG_END; +} + extern "C" void lynx_main(void) { const rg_handlers_t handlers = { @@ -192,12 +198,8 @@ extern "C" void lynx_main(void) .options = NULL, .about = NULL, }; - const rg_gui_option_t options[] = { - {0, _("Rotation"), (char *)"-", RG_DIALOG_FLAG_NORMAL, &rotation_cb}, - RG_DIALOG_END - }; - app = rg_system_reinit(AUDIO_SAMPLE_RATE, &handlers, options); + app = rg_system_reinit(AUDIO_SAMPLE_RATE, &handlers, NULL); // the HANDY_SCREEN_WIDTH * HANDY_SCREEN_WIDTH is deliberate because of rotation updates[0] = rg_surface_create(HANDY_SCREEN_WIDTH, HANDY_SCREEN_WIDTH, RG_PIXEL_565_BE, MEM_FAST); @@ -213,7 +215,7 @@ extern "C" void lynx_main(void) } gPrimaryFrameBuffer = (UBYTE*)currentUpdate->data; - gAudioBuffer = (SWORD*)malloc(AUDIO_BUFFER_LENGTH * 4); + gAudioBuffer = new SWORD[AUDIO_BUFFER_LENGTH * 2]; gAudioEnabled = 1; if (app->bootFlags & RG_BOOT_RESUME) diff --git a/retro-core/main/main_nes.c b/retro-core/main/main_nes.c index 9abfc5e2..f2de80ba 100644 --- a/retro-core/main/main_nes.c +++ b/retro-core/main/main_nes.c @@ -179,6 +179,15 @@ static void nsf_draw_overlay(void) } +static void options_handler(rg_gui_option_t *dest) +{ + *dest++ = (rg_gui_option_t){0, _("Palette"), "-", RG_DIALOG_FLAG_NORMAL, &palette_update_cb}; + *dest++ = (rg_gui_option_t){0, _("Overscan"), "-", RG_DIALOG_FLAG_NORMAL, &overscan_update_cb}; + *dest++ = (rg_gui_option_t){0, _("Crop sides"), "-", RG_DIALOG_FLAG_NORMAL, &autocrop_update_cb}; + *dest++ = (rg_gui_option_t){0, _("Sprite limit"), "-", RG_DIALOG_FLAG_NORMAL, &sprite_limit_cb}; + *dest++ = (rg_gui_option_t)RG_DIALOG_END; +} + void nes_main(void) { const rg_handlers_t handlers = { @@ -187,16 +196,10 @@ void nes_main(void) .reset = &reset_handler, .event = &event_handler, .screenshot = &screenshot_handler, - }; - const rg_gui_option_t options[] = { - {0, _("Palette"), "-", RG_DIALOG_FLAG_NORMAL, &palette_update_cb}, - {0, _("Overscan"), "-", RG_DIALOG_FLAG_NORMAL, &overscan_update_cb}, - {0, _("Crop sides"), "-", RG_DIALOG_FLAG_NORMAL, &autocrop_update_cb}, - {0, _("Sprite limit"), "-", RG_DIALOG_FLAG_NORMAL, &sprite_limit_cb}, - RG_DIALOG_END + .options = &options_handler, }; - app = rg_system_reinit(AUDIO_SAMPLE_RATE, &handlers, options); + app = rg_system_reinit(AUDIO_SAMPLE_RATE, &handlers, NULL); overscan = rg_settings_get_number(NS_APP, SETTING_OVERSCAN, 1); autocrop = rg_settings_get_number(NS_APP, SETTING_AUTOCROP, 0); diff --git a/retro-core/main/main_pce.c b/retro-core/main/main_pce.c index 54d8501a..ccdd7378 100644 --- a/retro-core/main/main_pce.c +++ b/retro-core/main/main_pce.c @@ -181,6 +181,12 @@ static bool reset_handler(bool hard) return true; } +static void options_handler(rg_gui_option_t *dest) +{ + *dest++ = (rg_gui_option_t){0, _("Overscan"), "-", RG_DIALOG_FLAG_NORMAL, &overscan_update_cb}; + *dest++ = (rg_gui_option_t)RG_DIALOG_END; +} + void pce_main(void) { const rg_handlers_t handlers = { @@ -189,13 +195,10 @@ void pce_main(void) .reset = &reset_handler, .screenshot = &screenshot_handler, .event = &event_handler, - }; - const rg_gui_option_t options[] = { - {0, _("Overscan"), "-", RG_DIALOG_FLAG_NORMAL, &overscan_update_cb}, - RG_DIALOG_END + .options = &options_handler, }; - app = rg_system_reinit(AUDIO_SAMPLE_RATE, &handlers, options); + app = rg_system_reinit(AUDIO_SAMPLE_RATE, &handlers, NULL); overscan = rg_settings_get_number(NS_APP, SETTING_OVERSCAN, 1); updates[0] = rg_surface_create(XBUF_WIDTH, XBUF_HEIGHT, RG_PIXEL_PAL565_BE, MEM_FAST); diff --git a/retro-core/main/main_sms.c b/retro-core/main/main_sms.c index 670d14ab..f14f3967 100644 --- a/retro-core/main/main_sms.c +++ b/retro-core/main/main_sms.c @@ -93,6 +93,12 @@ static rg_gui_event_t palette_update_cb(rg_gui_option_t *opt, rg_gui_event_t eve return RG_DIALOG_VOID; } +static void options_handler(rg_gui_option_t *dest) +{ + *dest++ = (rg_gui_option_t){0, _("Palette"), "-", RG_DIALOG_FLAG_NORMAL, &palette_update_cb}; + *dest++ = (rg_gui_option_t)RG_DIALOG_END; +} + void sms_main(void) { const rg_handlers_t handlers = { @@ -101,13 +107,10 @@ void sms_main(void) .reset = &reset_handler, .screenshot = &screenshot_handler, .event = &event_handler, - }; - const rg_gui_option_t options[] = { - {0, _("Palette"), "-", RG_DIALOG_FLAG_NORMAL, &palette_update_cb}, - RG_DIALOG_END + .options = &options_handler, }; - app = rg_system_reinit(AUDIO_SAMPLE_RATE, &handlers, options); + app = rg_system_reinit(AUDIO_SAMPLE_RATE, &handlers, NULL); updates[0] = rg_surface_create(SMS_WIDTH, SMS_HEIGHT, RG_PIXEL_PAL565_BE, MEM_FAST); updates[1] = rg_surface_create(SMS_WIDTH, SMS_HEIGHT, RG_PIXEL_PAL565_BE, MEM_FAST); diff --git a/retro-core/main/main_snes.c b/retro-core/main/main_snes.c index 621b64b2..c8f4393f 100644 --- a/retro-core/main/main_snes.c +++ b/retro-core/main/main_snes.c @@ -284,6 +284,14 @@ static void S9xAudioCallback(void) } #endif +static void options_handler(rg_gui_option_t *dest) +{ + *dest++ = (rg_gui_option_t){0, _("Audio enable"), "-", RG_DIALOG_FLAG_NORMAL, &apu_toggle_cb}; + *dest++ = (rg_gui_option_t){0, _("Audio filter"), "-", RG_DIALOG_FLAG_NORMAL, &lowpass_filter_cb}; + *dest++ = (rg_gui_option_t){0, _("Controls"), "-", RG_DIALOG_FLAG_NORMAL, &menu_keymap_cb}; + *dest++ = (rg_gui_option_t)RG_DIALOG_END; +} + void snes_main(void) { const rg_handlers_t handlers = { @@ -292,14 +300,9 @@ void snes_main(void) .reset = &reset_handler, .screenshot = &screenshot_handler, .event = &event_handler, + .options = &options_handler, }; - const rg_gui_option_t options[] = { - {0, _("Audio enable"), "-", RG_DIALOG_FLAG_NORMAL, &apu_toggle_cb}, - {0, _("Audio filter"), "-", RG_DIALOG_FLAG_NORMAL, &lowpass_filter_cb}, - {0, _("Controls"), "-", RG_DIALOG_FLAG_NORMAL, &menu_keymap_cb}, - RG_DIALOG_END, - }; - app = rg_system_reinit(AUDIO_SAMPLE_RATE, &handlers, options); + app = rg_system_reinit(AUDIO_SAMPLE_RATE, &handlers, NULL); apu_enabled = rg_settings_get_number(NS_APP, SETTING_APU_EMULATION, 1);