X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=pcsx_rearmed.git;a=blobdiff_plain;f=frontend%2Fmenu.c;h=b25e1927c2aab322d1e5ad5424cb06daa8bddfc7;hp=a984bbf079341ef8a62fbd8727052402530a7803;hb=69e482e3def6669a4fa921d07f9ba04883d7de34;hpb=79f216e32563acc81517729fe56a6f11f110b0a4 diff --git a/frontend/menu.c b/frontend/menu.c index a984bbf0..b25e1927 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" @@ -32,10 +34,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/dfinput/externals.h" #include "../plugins/gpulib/cspace.h" +#include "psemu_plugin_defs.h" #include "revision.h" #define REARMED_BIRTHDAY_TIME 1293306830 /* 25 Dec 2010 */ @@ -79,18 +81,18 @@ typedef enum MA_OPT_HWFILTER, MA_OPT_SWFILTER, MA_OPT_GAMMA, + MA_OPT_VOUT_MODE, } 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; int g_opts, g_scaler, g_gamma = 100; int soft_scaling, analog_deadzone; // for Caanoo -int filter, soft_filter; +int soft_filter; #ifdef __ARM_ARCH_7A__ #define DEFAULT_PSX_CLOCK 57 @@ -115,11 +117,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 +188,109 @@ 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; + + 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) { @@ -222,11 +329,13 @@ 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; + plat_target.vout_fullscreen = 0; psx_clock = DEFAULT_PSX_CLOCK; region = 0; @@ -274,7 +383,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,15 +392,17 @@ 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(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(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), @@ -401,14 +512,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 +534,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; } @@ -542,20 +668,25 @@ fail: 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 +696,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 +725,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 +751,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 +816,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 }, @@ -1067,6 +1204,7 @@ static const char *men_soft_filter[] = { "None", static const char *men_dummy[] = { NULL }; 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_gamma[] = "Gamma/brightness adjustment (default 100)"; @@ -1125,8 +1263,9 @@ 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 ("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), mee_range_h ("Gamma adjustment", MA_OPT_GAMMA, g_gamma, 1, 200, h_gamma), // mee_onoff ("Vsync", 0, vsync, 1), @@ -1351,7 +1490,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 +1503,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 +1515,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 +1700,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 +1832,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 +1939,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 +1997,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 +2023,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 +2056,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 +2080,12 @@ static int swap_cd_multidisk(void) static void load_pcsx_cht(void) { + const char *exts[] = { "cht", NULL }; + const char *fname; char path[256]; - char *fname; path[0] = 0; - fname = menu_loop_romsel(path, sizeof(path)); + fname = menu_loop_romsel(path, sizeof(path), exts, NULL); if (fname == NULL) return; @@ -2010,8 +2152,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 +2239,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 +2406,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 +2432,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 +2449,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 +2506,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