X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=pcsx_rearmed.git;a=blobdiff_plain;f=frontend%2Fmenu.c;h=cfa3284830f9027ee20a56cb3ce646b647313deb;hp=a984bbf079341ef8a62fbd8727052402530a7803;hb=35d3fd2efb47352edf794255da3e4745f6bd0a0d;hpb=79f216e32563acc81517729fe56a6f11f110b0a4 diff --git a/frontend/menu.c b/frontend/menu.c index a984bbf0..cfa32848 100644 --- a/frontend/menu.c +++ b/frontend/menu.c @@ -1,5 +1,5 @@ /* - * (C) Gražvydas "notaz" Ignotas, 2010-2011 + * (C) Gražvydas "notaz" Ignotas, 2010-2013 * * This work is licensed under the terms of any of these licenses * (at your option): @@ -8,6 +8,7 @@ * See the COPYING file in the top-level directory. */ +#define _GNU_SOURCE 1 #include #include #include @@ -16,6 +17,7 @@ #include #include #include +#include #include "main.h" #include "menu.h" @@ -24,6 +26,7 @@ #include "plugin_lib.h" #include "plat.h" #include "pcnt.h" +#include "cspace.h" #include "libpicofe/plat.h" #include "libpicofe/input.h" #include "libpicofe/linux/in_evdev.h" @@ -32,10 +35,10 @@ #include "../libpcsxcore/cdrom.h" #include "../libpcsxcore/cdriso.h" #include "../libpcsxcore/cheat.h" -#include "../libpcsxcore/psemu_plugin_defs.h" #include "../libpcsxcore/new_dynarec/new_dynarec.h" -#include "../plugins/dfinput/main.h" -#include "../plugins/gpulib/cspace.h" +#include "../plugins/dfinput/externals.h" +#include "../plugins/dfsound/spu_config.h" +#include "psemu_plugin_defs.h" #include "revision.h" #define REARMED_BIRTHDAY_TIME 1293306830 /* 25 Dec 2010 */ @@ -79,18 +82,21 @@ typedef enum MA_OPT_HWFILTER, MA_OPT_SWFILTER, MA_OPT_GAMMA, + MA_OPT_VOUT_MODE, + MA_OPT_SCANLINES, + MA_OPT_SCANLINE_LEVEL, } menu_id; static int last_vout_w, last_vout_h, last_vout_bpp; static int cpu_clock, cpu_clock_st, volume_boost, frameskip; -static char rom_fname_reload[MAXPATHLEN]; static char last_selected_fname[MAXPATHLEN]; static int config_save_counter, region, in_type_sel1, in_type_sel2; static int psx_clock; -static int memcard1_sel, memcard2_sel; +static int memcard1_sel = -1, memcard2_sel = -1; int g_opts, g_scaler, g_gamma = 100; +int scanlines, scanline_level = 20; int soft_scaling, analog_deadzone; // for Caanoo -int filter, soft_filter; +int soft_filter; #ifdef __ARM_ARCH_7A__ #define DEFAULT_PSX_CLOCK 57 @@ -100,12 +106,6 @@ int filter, soft_filter; #define DEFAULT_PSX_CLOCK_S "50" #endif -// sound plugin -extern int iUseReverb; -extern int iUseInterpolation; -extern int iXAPitch; -extern int iVolume; - static const char *bioses[24]; static const char *gpu_plugins[16]; static const char *spu_plugins[16]; @@ -115,11 +115,13 @@ static int bios_sel, gpu_plugsel, spu_plugsel; #ifndef UI_FEATURES_H #define MENU_BIOS_PATH "bios/" #define MENU_SHOW_VARSCALER 0 +#define MENU_SHOW_VOUTMODE 1 #define MENU_SHOW_SCALER2 0 #define MENU_SHOW_NUBS_BTNS 0 #define MENU_SHOW_VIBRATION 0 #define MENU_SHOW_DEADZONE 0 #define MENU_SHOW_MINIMIZE 0 +#define MENU_SHOW_FULLSCREEN 1 #define MENU_SHOW_VOLUME 0 #endif @@ -184,6 +186,112 @@ static int emu_save_load_game(int load, int unused) return ret; } +static void rm_namelist_entry(struct dirent **namelist, + int count, const char *name) +{ + int i; + + for (i = 1; i < count; i++) { + if (namelist[i] == NULL || namelist[i]->d_type == DT_DIR) + continue; + + if (strcmp(name, namelist[i]->d_name) == 0) { + free(namelist[i]); + namelist[i] = NULL; + break; + } + } +} + +static int optional_cdimg_filter(struct dirent **namelist, int count, + const char *basedir) +{ + const char *ext, *p; + char buf[256], buf2[256]; + int i, d, ret, good_cue; + struct stat64 statf; + FILE *f; + + if (count <= 1) + return count; + + for (i = 1; i < count; i++) { + if (namelist[i] == NULL || namelist[i]->d_type == DT_DIR) + continue; + + ext = strrchr(namelist[i]->d_name, '.'); + if (ext == NULL) { + // should not happen but whatever + free(namelist[i]); + namelist[i] = NULL; + continue; + } + ext++; + + // first find .cue files and remove files they reference + if (strcasecmp(ext, "cue") == 0) + { + snprintf(buf, sizeof(buf), "%s/%s", basedir, + namelist[i]->d_name); + + f = fopen(buf, "r"); + if (f == NULL) { + free(namelist[i]); + namelist[i] = NULL; + continue; + } + + good_cue = 0; + while (fgets(buf, sizeof(buf), f)) { + ret = sscanf(buf, " FILE \"%256[^\"]\"", buf2); + if (ret != 1) + ret = sscanf(buf, " FILE %256s", buf2); + if (ret != 1) + continue; + + p = strrchr(buf2, '/'); + if (p == NULL) + p = strrchr(buf2, '\\'); + if (p != NULL) + p++; + else + p = buf2; + + snprintf(buf, sizeof(buf), "%s/%s", basedir, p); + ret = stat64(buf, &statf); + if (ret == 0) { + rm_namelist_entry(namelist, count, p); + good_cue = 1; + } + } + fclose(f); + + if (!good_cue) { + free(namelist[i]); + namelist[i] = NULL; + } + continue; + } + + p = strcasestr(namelist[i]->d_name, "track"); + if (p != NULL) { + ret = strtoul(p + 5, NULL, 10); + if (ret > 1) { + free(namelist[i]); + namelist[i] = NULL; + continue; + } + } + } + + // compact namelist + for (i = d = 1; i < count; i++) + if (namelist[i] != NULL) + namelist[d++] = namelist[i]; + + return d; +} + // propagate menu settings to the emu vars static void menu_sync_config(void) { @@ -211,7 +319,7 @@ static void menu_sync_config(void) allow_abs_only_old = in_evdev_allow_abs_only; } - iVolume = 768 + 128 * volume_boost; + spu_config.iVolume = 768 + 128 * volume_boost; pl_rearmed_cbs.frameskip = frameskip - 1; pl_timing_prepare(Config.PsxType); } @@ -222,11 +330,15 @@ static void menu_set_defconfig(void) g_opts = 0; g_scaler = SCALE_4_3; + g_gamma = 100; volume_boost = 0; frameskip = 0; analog_deadzone = 50; soft_scaling = 1; soft_filter = 0; + scanlines = 0; + scanline_level = 20; + plat_target.vout_fullscreen = 0; psx_clock = DEFAULT_PSX_CLOCK; region = 0; @@ -274,7 +386,7 @@ static const struct { CE_CONFIG_STR(Spu), // CE_CONFIG_STR(Cdr), CE_CONFIG_VAL(Xa), - CE_CONFIG_VAL(Sio), +// CE_CONFIG_VAL(Sio), CE_CONFIG_VAL(Mdec), CE_CONFIG_VAL(Cdda), CE_CONFIG_VAL(Debug), @@ -283,21 +395,27 @@ static const struct { CE_CONFIG_VAL(RCntFix), CE_CONFIG_VAL(VSyncWA), CE_CONFIG_VAL(Cpu), - CE_CONFIG_VAL(CdrReschedule), CE_INTVAL(region), - CE_INTVAL_V(g_scaler, 2), + CE_INTVAL_V(g_scaler, 3), + CE_INTVAL(g_gamma), CE_INTVAL(g_layer_x), CE_INTVAL(g_layer_y), CE_INTVAL(g_layer_w), CE_INTVAL(g_layer_h), - CE_INTVAL(filter), CE_INTVAL(soft_filter), + CE_INTVAL(scanlines), + CE_INTVAL(scanline_level), + CE_INTVAL(plat_target.vout_method), + CE_INTVAL(plat_target.hwfilter), + CE_INTVAL(plat_target.vout_fullscreen), CE_INTVAL(state_slot), CE_INTVAL(cpu_clock), CE_INTVAL(g_opts), CE_INTVAL(in_type_sel1), CE_INTVAL(in_type_sel2), CE_INTVAL(analog_deadzone), + CE_INTVAL(memcard1_sel), + CE_INTVAL(memcard2_sel), CE_INTVAL_N("adev0_is_nublike", in_adev_is_nublike[0]), CE_INTVAL_N("adev1_is_nublike", in_adev_is_nublike[1]), CE_INTVAL_V(frameskip, 3), @@ -320,9 +438,10 @@ static const struct { CE_INTVAL_P(gpu_peopsgl.iVRamSize), CE_INTVAL_P(gpu_peopsgl.iTexGarbageCollection), CE_INTVAL_P(gpu_peopsgl.dwActFixes), - CE_INTVAL_V(iUseReverb, 3), - CE_INTVAL_V(iXAPitch, 3), - CE_INTVAL_V(iUseInterpolation, 3), + CE_INTVAL(spu_config.iUseReverb), + CE_INTVAL(spu_config.iXAPitch), + CE_INTVAL(spu_config.iUseInterpolation), + CE_INTVAL(spu_config.iTempo), CE_INTVAL(config_save_counter), CE_INTVAL(in_evdev_allow_abs_only), CE_INTVAL(volume_boost), @@ -401,14 +520,18 @@ static int menu_write_config(int is_game) static int menu_do_last_cd_img(int is_get) { + static const char *defaults[] = { "/media", "/mnt/sd", "/mnt" }; char path[256]; + struct stat64 st; FILE *f; - int ret; + int i, ret = -1; snprintf(path, sizeof(path), "." PCSX_DOT_DIR "lastcdimg.txt"); f = fopen(path, is_get ? "r" : "w"); - if (f == NULL) - return -1; + if (f == NULL) { + ret = -1; + goto out; + } if (is_get) { ret = fread(last_selected_fname, 1, sizeof(last_selected_fname) - 1, f); @@ -419,6 +542,17 @@ static int menu_do_last_cd_img(int is_get) fprintf(f, "%s\n", last_selected_fname); fclose(f); +out: + if (is_get) { + for (i = 0; last_selected_fname[0] == 0 + || stat64(last_selected_fname, &st) != 0; i++) + { + if (i >= ARRAY_SIZE(defaults)) + break; + strcpy(last_selected_fname, defaults[i]); + } + } + return 0; } @@ -539,23 +673,51 @@ fail: if (strcmp(Config.Spu, spu_plugins[i]) == 0) { spu_plugsel = i; break; } + // memcard selections + char mcd1_old[sizeof(Config.Mcd1)]; + char mcd2_old[sizeof(Config.Mcd2)]; + strcpy(mcd1_old, Config.Mcd1); + strcpy(mcd2_old, Config.Mcd2); + + if ((unsigned int)memcard1_sel < ARRAY_SIZE(memcards)) { + if (memcard1_sel == 0) + strcpy(Config.Mcd1, "none"); + else if (memcards[memcard1_sel] != NULL) + snprintf(Config.Mcd1, sizeof(Config.Mcd1), ".%s%s", + MEMCARD_DIR, memcards[memcard1_sel]); + } + if ((unsigned int)memcard2_sel < ARRAY_SIZE(memcards)) { + if (memcard2_sel == 0) + strcpy(Config.Mcd2, "none"); + else if (memcards[memcard2_sel] != NULL) + snprintf(Config.Mcd2, sizeof(Config.Mcd2), ".%s%s", + MEMCARD_DIR, memcards[memcard2_sel]); + } + if (strcmp(mcd1_old, Config.Mcd1) || strcmp(mcd2_old, Config.Mcd2)) + LoadMcds(Config.Mcd1, Config.Mcd2); + return ret; } +static const char *filter_exts[] = { + "bin", "img", "mdf", "iso", "cue", "z", + "bz", "znx", "pbp", "cbn", NULL +}; + // rrrr rggg gggb bbbb static unsigned short fname2color(const char *fname) { - static const char *cdimg_exts[] = { ".bin", ".img", ".mdf", ".iso", ".cue", ".z", - ".bz", ".znx", ".pbp", ".cbn" }; - static const char *other_exts[] = { ".ccd", ".toc", ".mds", ".sub", - ".table", ".index", ".sbi" }; + static const char *other_exts[] = { + "ccd", "toc", "mds", "sub", "table", "index", "sbi" + }; const char *ext = strrchr(fname, '.'); int i; if (ext == NULL) return 0xffff; - for (i = 0; i < array_size(cdimg_exts); i++) - if (strcasecmp(ext, cdimg_exts[i]) == 0) + ext++; + for (i = 0; filter_exts[i] != NULL; i++) + if (strcasecmp(ext, filter_exts[i]) == 0) return 0x7bff; for (i = 0; i < array_size(other_exts); i++) if (strcasecmp(ext, other_exts[i]) == 0) @@ -565,10 +727,6 @@ static unsigned short fname2color(const char *fname) static void draw_savestate_bg(int slot); -static const char *filter_exts[] = { - ".mp3", ".MP3", ".txt", ".htm", "html", ".jpg", ".pnd" -}; - #define MENU_ALIGN_LEFT #ifdef __ARM_ARCH_7A__ // assume hires device #define MENU_X2 1 @@ -598,8 +756,8 @@ static void draw_savestate_bg(int slot) if (f == NULL) return; - if (gzseek(f, 0x29933d, SEEK_SET) != 0x29933d) { - fprintf(stderr, "gzseek failed\n"); + if ((ret = (int)gzseek(f, 0x29933d, SEEK_SET)) != 0x29933d) { + fprintf(stderr, "gzseek failed: %d\n", ret); gzclose(f); return; } @@ -624,12 +782,18 @@ static void draw_savestate_bg(int slot) x = gpu->ulControl[5] & 0x3ff; y = (gpu->ulControl[5] >> 10) & 0x1ff; - s = (u16 *)gpu->psxVRam + y * 1024 + x; w = psx_widths[(gpu->ulStatus >> 16) & 7]; tmp = gpu->ulControl[7]; h = ((tmp >> 10) & 0x3ff) - (tmp & 0x3ff); if (gpu->ulStatus & 0x80000) // doubleheight h *= 2; + if (h <= 0 || h > 512) + goto out; + if (y > 512 - 64) + y = 0; + if (y + h > 512) + h = 512 - y; + s = (u16 *)gpu->psxVRam + y * 1024 + x; x = max(0, g_menuscreen_w - w) & ~3; y = max(0, g_menuscreen_h / 2 - h / 2); @@ -683,12 +847,16 @@ me_bind_action emuctrl_actions[] = { "Next Save Slot ", 1 << SACTION_NEXT_SSLOT }, { "Toggle Frameskip ", 1 << SACTION_TOGGLE_FSKIP }, { "Take Screenshot ", 1 << SACTION_SCREENSHOT }, - { "Fast Forward ", 1 << SACTION_FAST_FORWARD }, + { "Show/Hide FPS ", 1 << SACTION_TOGGLE_FPS }, #ifdef __ARM_ARCH_7A__ { "Switch Renderer ", 1 << SACTION_SWITCH_DISPMODE }, #endif + { "Fast Forward ", 1 << SACTION_FAST_FORWARD }, #if MENU_SHOW_MINIMIZE { "Minimize ", 1 << SACTION_MINIMIZE }, +#endif +#if MENU_SHOW_FULLSCREEN + { "Toggle fullscreen", 1 << SACTION_TOGGLE_FULLSCREEN }, #endif { "Enter Menu ", 1 << SACTION_ENTER_MENU }, { "Gun Trigger ", 1 << SACTION_GUN_TRIGGER }, @@ -1058,16 +1226,22 @@ static int menu_loop_keyconfig(int id, int keys) // ------------ gfx options menu ------------ -static const char *men_scaler[] = { "1x1", "scaled 4:3", "integer scaled 4:3", "fullscreen", "custom", NULL }; +static const char *men_scaler[] = { + "1x1", "integer scaled 2x", "scaled 4:3", "integer scaled 4:3", "fullscreen", "custom", NULL +}; static const char *men_soft_filter[] = { "None", #ifdef __ARM_NEON__ "scale2x", "eagle2x", #endif NULL }; static const char *men_dummy[] = { NULL }; +static const char h_scaler[] = "int. 2x - scales w. or h. 2x if it fits on screen\n" + "int. 4:3 - uses integer if possible, else fractional"; static const char h_cscaler[] = "Displays the scaler layer, you can resize it\n" "using d-pad or move it using R+d-pad"; +static const char h_overlay[] = "Overlay provides hardware accelerated scaling"; static const char h_soft_filter[] = "Works only if game uses low resolution modes"; +static const char h_scanline_l[] = "Scanline brightness, 0-100%"; static const char h_gamma[] = "Gamma/brightness adjustment (default 100)"; static int menu_loop_cscaler(int id, int keys) @@ -1124,10 +1298,15 @@ static int menu_loop_cscaler(int id, int keys) static menu_entry e_menu_gfx_options[] = { - mee_enum ("Scaler", MA_OPT_VARSCALER, g_scaler, men_scaler), + mee_enum_h ("Scaler", MA_OPT_VARSCALER, g_scaler, men_scaler, h_scaler), + mee_enum ("Video output mode", MA_OPT_VOUT_MODE, plat_target.vout_method, men_dummy), mee_onoff ("Software Scaling", MA_OPT_SCALER2, soft_scaling, 1), - mee_enum ("Hardware Filter", MA_OPT_HWFILTER, filter, men_dummy), + mee_enum ("Hardware Filter", MA_OPT_HWFILTER, plat_target.hwfilter, men_dummy), mee_enum_h ("Software Filter", MA_OPT_SWFILTER, soft_filter, men_soft_filter, h_soft_filter), +#ifdef __ARM_NEON__ + mee_onoff ("Scanlines", MA_OPT_SCANLINES, scanlines, 1), + mee_range_h ("Scanline brightness", MA_OPT_SCANLINE_LEVEL, scanline_level, 0, 100, h_scanline_l), +#endif mee_range_h ("Gamma adjustment", MA_OPT_GAMMA, g_gamma, 1, 200, h_gamma), // mee_onoff ("Vsync", 0, vsync, 1), mee_cust_h ("Setup custom scaler", MA_OPT_VARSCALER_C, menu_loop_cscaler, NULL, h_cscaler), @@ -1261,13 +1440,16 @@ static int menu_loop_plugin_gpu_peopsgl(int id, int keys) static const char *men_spu_interp[] = { "None", "Simple", "Gaussian", "Cubic", NULL }; static const char h_spu_volboost[] = "Large values cause distortion"; +static const char h_spu_tempo[] = "Slows down audio if emu is too slow\n" + "This is inaccurate and breaks games"; static menu_entry e_menu_plugin_spu[] = { mee_range_h ("Volume boost", 0, volume_boost, -5, 30, h_spu_volboost), - mee_onoff ("Reverb", 0, iUseReverb, 2), - mee_enum ("Interpolation", 0, iUseInterpolation, men_spu_interp), - mee_onoff ("Adjust XA pitch", 0, iXAPitch, 1), + mee_onoff ("Reverb", 0, spu_config.iUseReverb, 1), + mee_enum ("Interpolation", 0, spu_config.iUseInterpolation, men_spu_interp), + mee_onoff ("Adjust XA pitch", 0, spu_config.iXAPitch, 1), + mee_onoff_h ("Adjust tempo", 0, spu_config.iTempo, 1, h_spu_tempo), mee_end, }; @@ -1351,7 +1533,6 @@ static int menu_loop_speed_hacks(int id, int keys) return 0; } -static const char *men_cfg_cdrr[] = { "Auto", "ON", "OFF", NULL }; static const char h_cfg_cpul[] = "Shows CPU usage in %"; static const char h_cfg_spu[] = "Shows active SPU channels\n" "(green: normal, red: fmod, blue: noise)"; @@ -1365,7 +1546,6 @@ static const char h_cfg_rcnt1[] = "Parasite Eve 2, Vandal Hearts 1/2 Fix\n" "(timing hack, breaks other games)"; static const char h_cfg_rcnt2[] = "InuYasha Sengoku Battle Fix\n" "(timing hack, breaks other games)"; -static const char h_cfg_cdrr[] = "Compatibility tweak (CD timing hack, breaks FMVs)"; static const char h_cfg_nodrc[] = "Disable dynamic recompiler and use interpreter\n" "Might be useful to overcome some dynarec bugs"; static const char h_cfg_shacks[] = "Breaks games but may give better performance\n" @@ -1378,11 +1558,10 @@ static menu_entry e_menu_adv_options[] = mee_onoff_h ("Disable Frame Limiter", 0, g_opts, OPT_NO_FRAMELIM, h_cfg_fl), mee_onoff_h ("Disable XA Decoding", 0, Config.Xa, 1, h_cfg_xa), mee_onoff_h ("Disable CD Audio", 0, Config.Cdda, 1, h_cfg_cdda), - mee_onoff_h ("SIO IRQ Always Enabled", 0, Config.Sio, 1, h_cfg_sio), + //mee_onoff_h ("SIO IRQ Always Enabled", 0, Config.Sio, 1, h_cfg_sio), mee_onoff_h ("SPU IRQ Always Enabled", 0, Config.SpuIrq, 1, h_cfg_spuirq), //mee_onoff_h ("Rootcounter hack", 0, Config.RCntFix, 1, h_cfg_rcnt1), mee_onoff_h ("Rootcounter hack 2", 0, Config.VSyncWA, 1, h_cfg_rcnt2), - mee_enum_h ("CD read reschedule hack",0, Config.CdrReschedule, men_cfg_cdrr, h_cfg_cdrr), mee_onoff_h ("Disable dynarec (slow!)",0, Config.Cpu, 1, h_cfg_nodrc), mee_handler_h ("[Speed hacks]", menu_loop_speed_hacks, h_cfg_shacks), mee_end, @@ -1564,10 +1743,10 @@ out: static void handle_memcard_sel(void) { - Config.Mcd1[0] = 0; + strcpy(Config.Mcd1, "none"); if (memcard1_sel != 0) snprintf(Config.Mcd1, sizeof(Config.Mcd1), ".%s%s", MEMCARD_DIR, memcards[memcard1_sel]); - Config.Mcd2[0] = 0; + strcpy(Config.Mcd2, "none"); if (memcard2_sel != 0) snprintf(Config.Mcd2, sizeof(Config.Mcd2), ".%s%s", MEMCARD_DIR, memcards[memcard2_sel]); LoadMcds(Config.Mcd1, Config.Mcd2); @@ -1696,7 +1875,6 @@ static void menu_bios_warn(void) // ------------ main menu ------------ static menu_entry e_menu_main[]; -void OnFile_Exit(); static void draw_frame_main(void) { @@ -1804,9 +1982,11 @@ static int run_bios(void) static int run_exe(void) { + const char *exts[] = { "exe", NULL }; const char *fname; - fname = menu_loop_romsel(last_selected_fname, sizeof(last_selected_fname)); + fname = menu_loop_romsel(last_selected_fname, + sizeof(last_selected_fname), exts, NULL); if (fname == NULL) return -1; @@ -1860,7 +2040,9 @@ static int romsel_run(void) int prev_gpu, prev_spu; const char *fname; - fname = menu_loop_romsel(last_selected_fname, sizeof(last_selected_fname)); + fname = menu_loop_romsel(last_selected_fname, + sizeof(last_selected_fname), filter_exts, + optional_cdimg_filter); if (fname == NULL) return -1; @@ -1884,16 +2066,18 @@ static int romsel_run(void) return -1; } - strcpy(last_selected_fname, rom_fname_reload); + strcpy(last_selected_fname, fname); menu_do_last_cd_img(0); return 0; } static int swap_cd_image(void) { - char *fname; + const char *fname; - fname = menu_loop_romsel(last_selected_fname, sizeof(last_selected_fname)); + fname = menu_loop_romsel(last_selected_fname, + sizeof(last_selected_fname), filter_exts, + optional_cdimg_filter); if (fname == NULL) return -1; @@ -1915,7 +2099,7 @@ static int swap_cd_image(void) SetCdOpenCaseTime(time(NULL) + 2); LidInterrupt(); - strcpy(last_selected_fname, rom_fname_reload); + strcpy(last_selected_fname, fname); return 0; } @@ -1939,11 +2123,12 @@ static int swap_cd_multidisk(void) static void load_pcsx_cht(void) { - char path[256]; - char *fname; + static const char *exts[] = { "cht", NULL }; + const char *fname; + char msg[64]; - path[0] = 0; - fname = menu_loop_romsel(path, sizeof(path)); + fname = menu_loop_romsel(last_selected_fname, + sizeof(last_selected_fname), exts, NULL); if (fname == NULL) return; @@ -1953,8 +2138,8 @@ static void load_pcsx_cht(void) if (NumCheats == 0 && NumCodes == 0) menu_update_msg("failed to load cheats"); else { - snprintf(path, sizeof(path), "%d cheat(s) loaded", NumCheats + NumCodes); - menu_update_msg(path); + snprintf(msg, sizeof(msg), "%d cheat(s) loaded", NumCheats + NumCodes); + menu_update_msg(msg); } me_enable(e_menu_main, MA_MAIN_CHEATS, ready_to_go && NumCheats); } @@ -2010,8 +2195,8 @@ static int main_menu_handler(int id, int keys) in_menu_wait(PBTN_MOK|PBTN_MBACK, NULL, 70); break; case MA_MAIN_EXIT: - OnFile_Exit(); - break; + emu_core_ask_exit(); + return 1; default: lprintf("%s: something unknown selected\n", __FUNCTION__); break; @@ -2097,7 +2282,7 @@ void menu_loop(void) do { me_loop_d(e_menu_main, &sel, NULL, draw_frame_main); - } while (!ready_to_go); + } while (!ready_to_go && !g_emu_want_quit); /* wait until menu, ok, back is released */ while (in_menu_wait_any(NULL, 50) & (PBTN_MENU|PBTN_MOK|PBTN_MBACK)) @@ -2264,8 +2449,6 @@ void menu_init(void) char buff[MAXPATHLEN]; int i; - strcpy(last_selected_fname, "/media"); - cpu_clock_st = cpu_clock = plat_target_cpu_clock_get(); scan_bios_plugins(); @@ -2292,6 +2475,11 @@ void menu_init(void) && plat_target.cpu_clock_get != NULL && cpu_clock_st > 0; me_enable(e_menu_gfx_options, MA_OPT_CPU_CLOCKS, i); + i = me_id2offset(e_menu_gfx_options, MA_OPT_VOUT_MODE); + e_menu_gfx_options[i].data = plat_target.vout_methods; + me_enable(e_menu_gfx_options, MA_OPT_VOUT_MODE, + plat_target.vout_methods != NULL); + i = me_id2offset(e_menu_gfx_options, MA_OPT_HWFILTER); e_menu_gfx_options[i].data = plat_target.hwfilters; me_enable(e_menu_gfx_options, MA_OPT_HWFILTER, @@ -2304,6 +2492,7 @@ void menu_init(void) me_enable(e_menu_gfx_options, MA_OPT_SWFILTER, 0); #endif me_enable(e_menu_gfx_options, MA_OPT_VARSCALER, MENU_SHOW_VARSCALER); + me_enable(e_menu_gfx_options, MA_OPT_VOUT_MODE, MENU_SHOW_VOUTMODE); me_enable(e_menu_gfx_options, MA_OPT_VARSCALER_C, MENU_SHOW_VARSCALER); me_enable(e_menu_gfx_options, MA_OPT_SCALER2, MENU_SHOW_SCALER2); me_enable(e_menu_keyconfig, MA_CTRL_NUBS_BTNS, MENU_SHOW_NUBS_BTNS); @@ -2360,9 +2549,12 @@ void menu_prepare_emu(void) plat_video_menu_leave(); psxCpu = (Config.Cpu == CPU_INTERPRETER) ? &psxInt : &psxRec; - if (psxCpu != prev_cpu) + if (psxCpu != prev_cpu) { + prev_cpu->Shutdown(); + psxCpu->Init(); // note that this does not really reset, just clears drc caches psxCpu->Reset(); + } // core doesn't care about Config.Cdda changes, // so handle them manually here