ui, revised menu and option handling, added sound filter settings
authorkub <derkub@gmail.com>
Fri, 5 Mar 2021 19:20:22 +0000 (20:20 +0100)
committerkub <derkub@gmail.com>
Fri, 5 Mar 2021 21:11:39 +0000 (22:11 +0100)
pico/pico.h
pico/sound/sound.c
platform/common/config_file.c
platform/common/emu.c
platform/common/emu.h
platform/common/menu_pico.c
platform/common/menu_pico.h
platform/libretro/libretro.c
platform/psp/emu.c
platform/psp/mp3.c

index 5ec67d4..912d950 100644 (file)
@@ -57,7 +57,7 @@ extern void *p32x_bios_g, *p32x_bios_m, *p32x_bios_s;
 #define POPT_EN_STEREO      (1<< 3)\r
 #define POPT_ALT_RENDERER   (1<< 4) // 00 00x0\r
 #define POPT_EN_YM2413      (1<< 5)\r
-// unused                   (1<< 6)\r
+#define POPT_EN_SNDFILTER   (1<< 6)\r
 #define POPT_ACC_SPRITES    (1<< 7)\r
 #define POPT_DIS_32C_BORDER (1<< 8) // 00 0x00\r
 #define POPT_EXT_FM         (1<< 9)\r
@@ -102,8 +102,7 @@ typedef struct
        unsigned short overclockM68k;  // overclock the emulated 68k, in %\r
 \r
        int sndRate;                   // rate in Hz\r
-       unsigned short sndFilter;      // Set low pass sound filter 0: off, 1: on (use integer in case we want to add other filter types later)\r
-       int32_t sndFilterRange;        // Low pass sound filter range [0, 65536]\r
+       int sndFilterAlpha;            // Low pass sound filter alpha (Q16)\r
        short *sndOut;                 // PCM output buffer\r
        void (*writeSound)(int len);   // write .sndOut callback, called once per frame\r
 \r
index 0807c03..806a597 100644 (file)
@@ -50,8 +50,6 @@ PICO_INTERNAL void PsndReset(void)
   // PsndRerate calls YM2612Init, which also resets\r
   PsndRerate(0);\r
   timers_reset();\r
-\r
-  mix_reset(PicoIn.sndFilter ? PicoIn.sndFilterRange : 0);\r
 }\r
 \r
 \r
@@ -106,6 +104,7 @@ void PsndRerate(int preserve_state)
 \r
   // set mixer\r
   PsndMix_32_to_16l = (PicoIn.opt & POPT_EN_STEREO) ? mix_32_to_16l_stereo : mix_32_to_16_mono;\r
+  mix_reset(PicoIn.opt & POPT_EN_SNDFILTER ? PicoIn.sndFilterAlpha : 0);\r
 \r
   if (PicoIn.AHW & PAHW_PICO)\r
     PicoReratePico();\r
index e5962e2..59bbe12 100644 (file)
@@ -279,6 +279,11 @@ static int custom_read(menu_entry *me, const char *var, const char *val)
                                return 0;
                        return 1;
 
+               case MA_OPT_SOUND_ALPHA:
+                       if (strcasecmp(var, "Filter strength (alpha)") != 0) return 0;
+                       PicoIn.sndFilterAlpha = 0x10000 * atof(val);
+                       return 1;
+
                case MA_OPT_REGION:
                        if (strcasecmp(var, "Region") != 0) return 0;
                        if       (strncasecmp(val, "Auto: ", 6) == 0)
@@ -349,12 +354,12 @@ static int custom_read(menu_entry *me, const char *var, const char *val)
                        // XXX: use enum
                        if (strcasecmp(var, "Wait for vsync") != 0) return 0;
                        if        (strcasecmp(val, "never") == 0) {
-                               currentConfig.EmuOpt &= ~0x12000;
+                               currentConfig.EmuOpt &= ~(EOPT_VSYNC|EOPT_VSYNC_MODE);
                        } else if (strcasecmp(val, "sometimes") == 0) {
-                               currentConfig.EmuOpt |=  0x12000;
+                               currentConfig.EmuOpt |=  (EOPT_VSYNC|EOPT_VSYNC_MODE);
                        } else if (strcasecmp(val, "always") == 0) {
-                               currentConfig.EmuOpt &= ~0x12000;
-                               currentConfig.EmuOpt |=  0x02000;
+                               currentConfig.EmuOpt &= ~EOPT_VSYNC_MODE;
+                               currentConfig.EmuOpt |=  EOPT_VSYNC;
                        } else
                                return 0;
                        return 1;
index 151fb53..ecc9172 100644 (file)
@@ -585,8 +585,10 @@ static void make_config_cfg(char *cfg_buff_512)
 void emu_prep_defconfig(void)\r
 {\r
        memset(&defaultConfig, 0, sizeof(defaultConfig));\r
-       defaultConfig.EmuOpt    = 0x9d | EOPT_EN_CD_LEDS;\r
-       defaultConfig.s_PicoOpt = POPT_EN_STEREO|POPT_EN_FM|POPT_EN_PSG|POPT_EN_Z80 |\r
+       defaultConfig.EmuOpt    = EOPT_EN_SRAM | EOPT_EN_SOUND | EOPT_16BPP |\r
+                                 EOPT_EN_CD_LEDS | EOPT_GZIP_SAVES | 0x10/*?*/;\r
+       defaultConfig.s_PicoOpt = POPT_EN_SNDFILTER|\r
+                                 POPT_EN_STEREO|POPT_EN_FM|POPT_EN_PSG|POPT_EN_Z80 |\r
                                  POPT_EN_MCD_PCM|POPT_EN_MCD_CDDA|POPT_EN_MCD_GFX |\r
                                  POPT_EN_DRC|POPT_ACC_SPRITES |\r
                                  POPT_EN_32X|POPT_EN_PWM;\r
@@ -594,6 +596,7 @@ void emu_prep_defconfig(void)
        defaultConfig.s_PicoRegion = 0; // auto\r
        defaultConfig.s_PicoAutoRgnOrder = 0x184; // US, EU, JP\r
        defaultConfig.s_PicoCDBuffers = 0;\r
+       defaultConfig.s_PicoSndFilterAlpha = 0x10000 * 60 / 100;\r
        defaultConfig.confirm_save = EOPT_CONFIRM_SAVE;\r
        defaultConfig.Frameskip = -1; // auto\r
        defaultConfig.input_dev0 = PICO_INPUT_PAD_3BTN;\r
@@ -617,6 +620,7 @@ void emu_set_defconfig(void)
        PicoIn.sndRate = currentConfig.s_PsndRate;\r
        PicoIn.regionOverride = currentConfig.s_PicoRegion;\r
        PicoIn.autoRgnOrder = currentConfig.s_PicoAutoRgnOrder;\r
+       PicoIn.sndFilterAlpha = currentConfig.s_PicoSndFilterAlpha;\r
 }\r
 \r
 int emu_read_config(const char *rom_fname, int no_defaults)\r
@@ -974,7 +978,7 @@ void emu_set_fastforward(int set_on)
                PicoIn.sndOut = NULL;\r
                currentConfig.Frameskip = 8;\r
                currentConfig.EmuOpt &= ~4;\r
-               currentConfig.EmuOpt |= 0x40000;\r
+               currentConfig.EmuOpt |= EOPT_NO_FRMLIMIT;\r
                is_on = 1;\r
                emu_status_msg("FAST FORWARD");\r
        }\r
index 512ed71..a211002 100644 (file)
@@ -55,6 +55,7 @@ typedef struct _currentConfig_t {
        int s_PicoRegion;
        int s_PicoAutoRgnOrder;
        int s_PicoCDBuffers;
+       int s_PicoSndFilterAlpha;
        int Frameskip;
        int input_dev0;
        int input_dev1;
index fc238c3..5aa509d 100644 (file)
@@ -530,7 +530,6 @@ static const char h_ovrclk[] = "Will break some games, keep at 0";
 
 static menu_entry e_menu_adv_options[] =
 {
-       mee_onoff     ("SRAM/BRAM saves",          MA_OPT_SRAM_STATES,    currentConfig.EmuOpt, EOPT_EN_SRAM),
        mee_onoff     ("Disable sprite limit",     MA_OPT2_NO_SPRITE_LIM, PicoIn.opt, POPT_DIS_SPRITE_LIM),
        mee_range_h   ("Overclock M68k (%)",       MA_OPT2_OVERCLOCK_M68K,currentConfig.overclock_68k, 0, 1000, h_ovrclk),
        mee_onoff     ("Emulate Z80",              MA_OPT2_ENABLE_Z80,    PicoIn.opt, POPT_EN_Z80),
@@ -538,12 +537,9 @@ static menu_entry e_menu_adv_options[] =
        mee_onoff     ("Disable YM2612 SSG-EG",    MA_OPT2_DISABLE_YM_SSG,PicoIn.opt, POPT_DIS_FM_SSGEG),
        mee_onoff     ("Emulate SN76496 (PSG)",    MA_OPT2_ENABLE_SN76496,PicoIn.opt, POPT_EN_PSG),
        mee_onoff     ("Emulate YM2413 (FM)",      MA_OPT2_ENABLE_YM2413 ,PicoIn.opt, POPT_EN_YM2413),
-       mee_onoff     ("gzip savestates",          MA_OPT2_GZIP_STATES,   currentConfig.EmuOpt, EOPT_GZIP_SAVES),
-       mee_onoff     ("Don't save last used ROM", MA_OPT2_NO_LAST_ROM,   currentConfig.EmuOpt, EOPT_NO_AUTOSVCFG),
        mee_onoff     ("Disable idle loop patching",MA_OPT2_NO_IDLE_LOOPS,PicoIn.opt, POPT_DIS_IDLE_DET),
        mee_onoff     ("Disable frame limiter",    MA_OPT2_NO_FRAME_LIMIT,currentConfig.EmuOpt, EOPT_NO_FRMLIMIT),
        mee_onoff     ("Enable dynarecs",          MA_OPT2_DYNARECS,      PicoIn.opt, POPT_EN_DRC),
-       mee_onoff     ("Status line in main menu", MA_OPT2_STATUS_LINE,   currentConfig.EmuOpt, EOPT_SHOW_RTC),
        mee_range     ("Max auto frameskip",       MA_OPT2_MAX_FRAMESKIP, currentConfig.max_skip, 1, 10),
        mee_onoff     ("PWM IRQ optimization",     MA_OPT2_PWM_IRQ_OPT,   PicoIn.opt, POPT_PWM_IRQ_OPT),
        MENU_OPTIONS_ADV
@@ -560,6 +556,85 @@ static int menu_loop_adv_options(int id, int keys)
        return 0;
 }
 
+// ------------ sound options menu ------------
+
+static int sndrate_prevnext(int rate, int dir)
+{
+       static const int rates[] = { 8000, 11025, 16000, 22050, 44100 };
+       int i;
+
+       for (i = 0; i < 5; i++)
+               if (rates[i] == rate) break;
+
+       i += dir ? 1 : -1;
+       if (i > 4) {
+               if (!(PicoIn.opt & POPT_EN_STEREO)) {
+                       PicoIn.opt |= POPT_EN_STEREO;
+                       return rates[0];
+               }
+               return rates[4];
+       }
+       if (i < 0) {
+               if (PicoIn.opt & POPT_EN_STEREO) {
+                       PicoIn.opt &= ~POPT_EN_STEREO;
+                       return rates[4];
+               }
+               return rates[0];
+       }
+       return rates[i];
+}
+
+static int mh_opt_snd(int id, int keys)
+{
+       PicoIn.sndRate = sndrate_prevnext(PicoIn.sndRate, keys & PBTN_RIGHT);
+       return 0;
+}
+
+static const char *mgn_opt_sound(int id, int *offs)
+{
+       const char *str2;
+       *offs = -8;
+       str2 = (PicoIn.opt & POPT_EN_STEREO) ? "stereo" : "mono";
+       sprintf(static_buff, "%5iHz %s", PicoIn.sndRate, str2);
+       return static_buff;
+}
+
+static int mh_opt_alpha(int id, int keys)
+{
+       int val = (PicoIn.sndFilterAlpha * 100 + 0x08000) / 0x10000;
+       if (keys & PBTN_LEFT)   val--;
+       if (keys & PBTN_RIGHT)  val++;
+       if (val <  1)           val = 1;
+       if (val > 99)           val = 99;
+       PicoIn.sndFilterAlpha = val * 0x10000 / 100;
+       return 0;
+}
+
+static const char *mgn_opt_alpha(int id, int *offs)
+{
+       int val = (PicoIn.sndFilterAlpha * 100 + 0x08000) / 0x10000;
+       sprintf(static_buff, "0.%02d", val);
+       return static_buff;
+}
+
+static menu_entry e_menu_snd_options[] =
+{
+       mee_onoff     ("Enable sound",             MA_OPT_ENABLE_SOUND,  currentConfig.EmuOpt, EOPT_EN_SOUND),
+       mee_cust      ("Sound Quality",            MA_OPT_SOUND_QUALITY, mh_opt_snd, mgn_opt_sound),
+       mee_onoff     ("Sound filter (low pass)",  MA_OPT_SOUND_FILTER,  PicoIn.opt, POPT_EN_SNDFILTER),
+       mee_cust      ("Filter strength (alpha)",  MA_OPT_SOUND_ALPHA,   mh_opt_alpha, mgn_opt_alpha),
+       mee_end,
+};
+
+static int menu_loop_snd_options(int id, int keys)
+{
+       static int sel = 0;
+
+       me_loop(e_menu_snd_options, &sel);
+
+       return 0;
+}
+
 // ------------ gfx options menu ------------
 
 static const char h_gamma[] = "Gamma/brightness adjustment (default 1.00)";
@@ -590,36 +665,32 @@ static int menu_loop_gfx_options(int id, int keys)
        return 0;
 }
 
-// ------------ options menu ------------
+// ------------ UI options menu ------------
 
-static menu_entry e_menu_options[];
+static const char *men_confirm_save[] = { "OFF", "writes", "loads", "both", NULL };
+static const char h_confirm_save[]    = "Ask for confirmation when overwriting save,\n"
+                                       "loading state or both";
 
-static int sndrate_prevnext(int rate, int dir)
+static menu_entry e_menu_ui_options[] =
 {
-       static const int rates[] = { 8000, 11025, 16000, 22050, 44100 };
-       int i;
+       mee_enum_h    ("Confirm savestate",        MA_OPT_CONFIRM_STATES, currentConfig.confirm_save, men_confirm_save, h_confirm_save),
+       mee_onoff     ("Don't save last used ROM", MA_OPT2_NO_LAST_ROM,   currentConfig.EmuOpt, EOPT_NO_AUTOSVCFG),
+       mee_end,
+};
 
-       for (i = 0; i < 5; i++)
-               if (rates[i] == rate) break;
+static int menu_loop_ui_options(int id, int keys)
+{
+       static int sel = 0;
 
-       i += dir ? 1 : -1;
-       if (i > 4) {
-               if (!(PicoIn.opt & POPT_EN_STEREO)) {
-                       PicoIn.opt |= POPT_EN_STEREO;
-                       return rates[0];
-               }
-               return rates[4];
-       }
-       if (i < 0) {
-               if (PicoIn.opt & POPT_EN_STEREO) {
-                       PicoIn.opt &= ~POPT_EN_STEREO;
-                       return rates[4];
-               }
-               return rates[0];
-       }
-       return rates[i];
+       me_loop(e_menu_ui_options, &sel);
+
+       return 0;
 }
 
+// ------------ options menu ------------
+
+static menu_entry e_menu_options[];
+
 static void region_prevnext(int right)
 {
        // jp_ntsc=1, jp_pal=2, usa=4, eu=8
@@ -651,9 +722,6 @@ static void region_prevnext(int right)
 static int mh_opt_misc(int id, int keys)
 {
        switch (id) {
-       case MA_OPT_SOUND_QUALITY:
-               PicoIn.sndRate = sndrate_prevnext(PicoIn.sndRate, keys & PBTN_RIGHT);
-               break;
        case MA_OPT_REGION:
                region_prevnext(keys & PBTN_RIGHT);
                break;
@@ -711,15 +779,6 @@ static const char *mgn_opt_fskip(int id, int *offs)
        return static_buff;
 }
 
-static const char *mgn_opt_sound(int id, int *offs)
-{
-       const char *str2;
-       *offs = -8;
-       str2 = (PicoIn.opt & POPT_EN_STEREO) ? "stereo" : "mono";
-       sprintf(static_buff, "%5iHz %s", PicoIn.sndRate, str2);
-       return static_buff;
-}
-
 static const char *mgn_opt_region(int id, int *offs)
 {
        static const char *names[] = { "Auto", "      Japan NTSC", "      Japan PAL", "      USA", "      Europe" };
@@ -754,21 +813,16 @@ static const char *mgn_saveloadcfg(int id, int *offs)
        return static_buff;
 }
 
-static const char *men_confirm_save[] = { "OFF", "writes", "loads", "both", NULL };
-static const char h_confirm_save[]    = "Ask for confirmation when overwriting save,\n"
-                                       "loading state or both";
-
 static menu_entry e_menu_options[] =
 {
        mee_range     ("Save slot",                MA_OPT_SAVE_SLOT,     state_slot, 0, 9),
        mee_range_cust("Frameskip",                MA_OPT_FRAMESKIP,     currentConfig.Frameskip, -1, 16, mgn_opt_fskip),
        mee_cust      ("Region",                   MA_OPT_REGION,        mh_opt_misc, mgn_opt_region),
        mee_onoff     ("Show FPS",                 MA_OPT_SHOW_FPS,      currentConfig.EmuOpt, EOPT_SHOW_FPS),
-       mee_onoff     ("Enable sound",             MA_OPT_ENABLE_SOUND,  currentConfig.EmuOpt, EOPT_EN_SOUND),
-       mee_cust      ("Sound Quality",            MA_OPT_SOUND_QUALITY, mh_opt_misc, mgn_opt_sound),
-       mee_enum_h    ("Confirm savestate",        MA_OPT_CONFIRM_STATES,currentConfig.confirm_save, men_confirm_save, h_confirm_save),
        mee_range     ("",                         MA_OPT_CPU_CLOCKS,    currentConfig.CPUclock, 20, 3200),
+       mee_handler   ("[Interface options]",      menu_loop_ui_options),
        mee_handler   ("[Display options]",        menu_loop_gfx_options),
+       mee_handler   ("[Sound options]",          menu_loop_snd_options),
        mee_handler   ("[Sega/Mega CD options]",   menu_loop_cd_options),
 #ifndef NO_32X
        mee_handler   ("[32X options]",            menu_loop_32x_options),
@@ -1219,7 +1273,7 @@ void menu_update_msg(const char *msg)
 /* hidden options for config engine only */
 static menu_entry e_menu_hidden[] =
 {
-       mee_onoff("Accurate sprites", MA_OPT_ACC_SPRITES, PicoIn.opt, 0x080),
+       mee_onoff("Accurate sprites", MA_OPT_ACC_SPRITES, PicoIn.opt, POPT_ACC_SPRITES),
        mee_onoff("autoload savestates", MA_OPT_AUTOLOAD_SAVE, g_autostateld_opt, 1),
        mee_end,
 };
@@ -1227,6 +1281,8 @@ static menu_entry e_menu_hidden[] =
 static menu_entry *e_menu_table[] =
 {
        e_menu_options,
+       e_menu_ui_options,
+       e_menu_snd_options,
        e_menu_gfx_options,
        e_menu_adv_options,
        e_menu_cd_options,
index 8f72baf..ee9d2ba 100644 (file)
@@ -28,7 +28,6 @@ typedef enum
        MA_OPT_INPUT_DEV0,
        MA_OPT_INPUT_DEV1,
        MA_OPT_REGION,
-       MA_OPT_SRAM_STATES,
        MA_OPT_CONFIRM_STATES,
        MA_OPT_SAVE_SLOT,
        MA_OPT_CPU_CLOCKS,
@@ -42,6 +41,8 @@ typedef enum
        MA_OPT_TEARING_FIX,     /* wiz */
        MA_OPT_VOUT_MODE,
        MA_OPT_AUTOLOAD_SAVE,
+       MA_OPT_SOUND_FILTER,
+       MA_OPT_SOUND_ALPHA,
        MA_OPT2_GAMMA,
        MA_OPT2_A_SN_GAMMA,
        MA_OPT2_DBLBUFF,        /* giz */
@@ -51,10 +52,8 @@ typedef enum
        MA_OPT2_DISABLE_YM_SSG,
        MA_OPT2_ENABLE_SN76496,
        MA_OPT2_ENABLE_YM2413,
-       MA_OPT2_GZIP_STATES,
        MA_OPT2_NO_LAST_ROM,
        MA_OPT2_RAMTIMINGS,     /* gp2x */
-       MA_OPT2_STATUS_LINE,    /* psp */
        MA_OPT2_NO_FRAME_LIMIT, /* psp */
        MA_OPT2_DYNARECS,
        MA_OPT2_NO_SPRITE_LIM,
index a6fce3e..a80fd99 100644 (file)
@@ -1543,25 +1543,26 @@ static void update_variables(bool first_run)
       PicoIn.opt &= ~POPT_EN_DRC;
 #endif
 
-   old_snd_filter = PicoIn.sndFilter;
+   old_snd_filter = PicoIn.opt & POPT_EN_SNDFILTER;
    var.value = NULL;
    var.key = "picodrive_audio_filter";
-   PicoIn.sndFilter = 0;
+   PicoIn.opt &= ~POPT_EN_SNDFILTER;
    if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) {
       if (strcmp(var.value, "low-pass") == 0)
-         PicoIn.sndFilter = 1;
+         PicoIn.opt |= POPT_EN_SNDFILTER;
    }
 
-   old_snd_filter_range = PicoIn.sndFilterRange;
+   old_snd_filter_range = PicoIn.sndFilterAlpha;
    var.value = NULL;
    var.key = "picodrive_lowpass_range";
-   PicoIn.sndFilterRange = (60 * 65536) / 100;
+   PicoIn.sndFilterAlpha = (60 * 0x10000 / 100);
    if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) {
-      PicoIn.sndFilterRange = (atoi(var.value) * 65536) / 100;
+      PicoIn.sndFilterAlpha = (atoi(var.value) * 0x10000 / 100);
    }
 
-   if (old_snd_filter != PicoIn.sndFilter || old_snd_filter_range != PicoIn.sndFilterRange) {
-      mix_reset(PicoIn.sndFilter ? PicoIn.sndFilterRange : 0);
+   if (((old_snd_filter ^ PicoIn.opt) & POPT_EN_SNDFILTER) ||
+         old_snd_filter_range != PicoIn.sndFilterAlpha) {
+      mix_reset (PicoIn.opt & POPT_EN_SNDFILTER ? PicoIn.sndFilterAlpha : 0);
    }
 
    old_frameskip_type = frameskip_type;
index 016c44d..179bf96 100644 (file)
@@ -477,7 +477,8 @@ void pemu_sound_start(void)
                }
        }
 
-       if (PicoIn.sndRate != PsndRate_old || (PicoIn.opt&0x0b) != (PicoOpt_old&0x0b) || Pico.m.pal != pal_old) {
+       ret = POPT_EN_FM|POPT_EN_PSG|POPT_EN_STEREO;
+       if (PicoIn.sndRate != PsndRate_old || (PicoIn.opt&ret) != (PicoOpt_old&ret) || Pico.m.pal != pal_old) {
                PsndRerate(Pico.m.frame_count ? 1 : 0);
        }
        stereo=(PicoIn.opt&8)>>3;
@@ -578,6 +579,7 @@ void pemu_prep_defconfig(void)
        defaultConfig.scale = 1.20;    // fullscreen
        defaultConfig.hscale40 = 1.25;
        defaultConfig.hscale32 = 1.56;
+       defaultConfig.EmuOpt |= EOPT_SHOW_RTC;
 }
 
 /* check configuration for inconsistencies */
index 5ec8206..cc4fc1b 100644 (file)
@@ -457,7 +457,7 @@ int mp3_get_offset(void) // 0-1023
        unsigned int offs1024 = 0;
        int cdda_on;
 
-       cdda_on = (PicoIn.AHW & PAHW_MCD) && (PicoIn.opt&0x800) && !(Pico_mcd->s68k_regs[0x36] & 1) &&
+       cdda_on = (PicoIn.AHW & PAHW_MCD) && (PicoIn.opt & POPT_EN_MCD_CDDA) && !(Pico_mcd->s68k_regs[0x36] & 1) &&
                        /* TODO (Pico_mcd->scd.Status_CDC & 1) &&*/ mp3_handle >= 0;
 
        if (cdda_on) {