frontend: add 2x scaling option
[pcsx_rearmed.git] / frontend / menu.c
index 8119505..a37ab05 100644 (file)
@@ -26,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"
@@ -36,7 +37,7 @@
 #include "../libpcsxcore/cheat.h"
 #include "../libpcsxcore/new_dynarec/new_dynarec.h"
 #include "../plugins/dfinput/externals.h"
-#include "../plugins/gpulib/cspace.h"
+#include "../plugins/dfsound/spu_config.h"
 #include "psemu_plugin_defs.h"
 #include "revision.h"
 
@@ -102,12 +103,6 @@ int 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];
@@ -214,6 +209,9 @@ static int optional_cdimg_filter(struct dirent **namelist, int count,
        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;
@@ -318,7 +316,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);
 }
@@ -393,7 +391,7 @@ static const struct {
        CE_CONFIG_VAL(VSyncWA),
        CE_CONFIG_VAL(Cpu),
        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),
@@ -431,9 +429,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),
@@ -1195,13 +1194,17 @@ 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";
@@ -1262,7 +1265,7 @@ 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, plat_target.hwfilter, men_dummy),
@@ -1400,13 +1403,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,
 };
 
@@ -1832,7 +1838,6 @@ static void menu_bios_warn(void)
 // ------------ main menu ------------
 
 static menu_entry e_menu_main[];
-void OnFile_Exit();
 
 static void draw_frame_main(void)
 {
@@ -2081,12 +2086,12 @@ static int swap_cd_multidisk(void)
 
 static void load_pcsx_cht(void)
 {
-       const char *exts[] = { "cht", NULL };
+       static const char *exts[] = { "cht", NULL };
        const char *fname;
-       char path[256];
+       char msg[64];
 
-       path[0] = 0;
-       fname = menu_loop_romsel(path, sizeof(path), exts, NULL);
+       fname = menu_loop_romsel(last_selected_fname,
+                       sizeof(last_selected_fname), exts, NULL);
        if (fname == NULL)
                return;
 
@@ -2096,8 +2101,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);
 }
@@ -2153,8 +2158,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;
@@ -2240,7 +2245,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))