diff --git a/HISTORY.txt b/HISTORY.txt index 58de36f..c85f4b8 100644 --- a/HISTORY.txt +++ b/HISTORY.txt @@ -17,6 +17,7 @@ Genesis Plus GX 1.7.5 (xx/xx/xxxx) (Eke-Eke) * added optional support for external VORBIS library * added optional CHD file support * added CDC & GFX register polling detection / synchronization +* added configurable CD-DA and PCM outputs mixing volume * improved Timer interrupt timings and CDD interrupt accuracy (fixes audio stutters during Popful Mail FMV) * improved CDC emulation (fixes random freezes during Jeopardy & ESPN Sunday Night NFL intro) * improved emulation of mirrored memory areas diff --git a/builds/genesis_plus_gx_libretro.dll b/builds/genesis_plus_gx_libretro.dll index f347c4e..9bc4bd5 100644 Binary files a/builds/genesis_plus_gx_libretro.dll and b/builds/genesis_plus_gx_libretro.dll differ diff --git a/builds/genplus_cube.dol b/builds/genplus_cube.dol index 8bdecc3..5f0cdb9 100644 Binary files a/builds/genplus_cube.dol and b/builds/genplus_cube.dol differ diff --git a/builds/genplus_wii.dol b/builds/genplus_wii.dol index 153271b..edb18b0 100644 Binary files a/builds/genplus_wii.dol and b/builds/genplus_wii.dol differ diff --git a/core/cd_hw/cdd.c b/core/cd_hw/cdd.c index 22a1783..07fa3e4 100644 --- a/core/cd_hw/cdd.c +++ b/core/cd_hw/cdd.c @@ -1491,6 +1491,12 @@ void cdd_read_audio(unsigned int samples) r = (((int16)((ptr[3] + ptr[2]*256)) * mul) / 1024); ptr+=4; #endif + + /* CD-DA output mixing volume (0-100%) */ + l = (l * config.cdda_volume) / 100; + r = (r * config.cdda_volume) / 100; + + /* update blip buffer */ blip_add_delta_fast(snd.blips[2], i, l-prev_l, r-prev_r); prev_l = l; prev_r = r; @@ -1564,6 +1570,12 @@ void cdd_read_audio(unsigned int samples) /* left & right channels */ l = ((ptr[0] * mul) / 1024); r = ((ptr[1] * mul) / 1024); + + /* CD-DA output mixing volume (0-100%) */ + l = (l * config.cdda_volume) / 100; + r = (r * config.cdda_volume) / 100; + + /* update blip buffer */ blip_add_delta_fast(snd.blips[2], i, l-prev_l, r-prev_r); prev_l = l; prev_r = r; @@ -1614,6 +1626,12 @@ void cdd_read_audio(unsigned int samples) r = (((int16)((ptr[2] + ptr[3]*256)) * mul) / 1024); ptr+=4; #endif + + /* CD-DA output mixing volume (0-100%) */ + l = (l * config.cdda_volume) / 100; + r = (r * config.cdda_volume) / 100; + + /* update blip buffer */ blip_add_delta_fast(snd.blips[2], i, l-prev_l, r-prev_r); prev_l = l; prev_r = r; @@ -1649,6 +1667,7 @@ void cdd_read_audio(unsigned int samples) /* no audio output */ if (prev_l | prev_r) { + /* update blip buffer */ blip_add_delta_fast(snd.blips[2], 0, -prev_l, -prev_r); /* save audio output for next frame */ @@ -1657,7 +1676,7 @@ void cdd_read_audio(unsigned int samples) } } - /* end of Blip Buffer timeframe */ + /* end of blip buffer timeframe */ blip_end_frame(snd.blips[2], samples); } diff --git a/core/cd_hw/pcm.c b/core/cd_hw/pcm.c index 80ae3e6..735b248 100644 --- a/core/cd_hw/pcm.c +++ b/core/cd_hw/pcm.c @@ -183,7 +183,11 @@ void pcm_run(unsigned int length) if (r < -32768) r = -32768; else if (r > 32767) r = 32767; - /* update Blip Buffer */ + /* PCM output mixing level (0-100%) */ + l = (l * config.pcm_volume) / 100; + r = (r * config.pcm_volume) / 100; + + /* update blip buffer */ blip_add_delta_fast(snd.blips[1], i, l-prev_l, r-prev_r); prev_l = l; prev_r = r; diff --git a/gcw0/config.c b/gcw0/config.c index 3c9c941..c64e68a 100644 --- a/gcw0/config.c +++ b/gcw0/config.c @@ -41,6 +41,8 @@ void set_config_defaults(void) /* sound options */ config.psg_preamp = 150; config.fm_preamp = 100; + config.cdda_volume = 100; + config.pcm_volume = 100; config.hq_fm = 1; config.hq_psg = 1; config.filter = 1; @@ -49,7 +51,7 @@ void set_config_defaults(void) config.lg = 100; config.mg = 100; config.hg = 100; - config.lp_range = 0x7fff; /* 0.5 in 0.16 fixed point */ + config.lp_range = 0x9999; /* 0.6 in 0.16 fixed point */ config.ym2612 = YM2612_DISCRETE; config.ym2413 = 1; /* = AUTO (0 = always OFF, 1 = always ON) */ config.mono = 0; diff --git a/gcw0/config.h b/gcw0/config.h index 116d8b8..eda59ea 100644 --- a/gcw0/config.h +++ b/gcw0/config.h @@ -25,6 +25,8 @@ typedef struct uint8 ym2413; int16 psg_preamp; int16 fm_preamp; + int16 cdda_volume; + int16 pcm_volume; uint32 lp_range; int16 low_freq; int16 high_freq; diff --git a/gx/config.c b/gx/config.c index 3ab7faa..c209a6c 100644 --- a/gx/config.c +++ b/gx/config.c @@ -100,10 +100,12 @@ void config_default(void) /* sound options */ config.psg_preamp = 150; config.fm_preamp = 100; + config.cdda_volume = 100; + config.pcm_volume = 100; config.hq_fm = 1; config.hq_psg = 1; config.filter = 1; - config.lp_range = 0x7FFF; /* 0.5 in 0.16 fixed point */ + config.lp_range = 0x9999; /* 0.6 in 0.16 fixed point */ config.low_freq = 880; config.high_freq = 5000; config.lg = 100; diff --git a/gx/config.h b/gx/config.h index 034aae7..a6533c9 100644 --- a/gx/config.h +++ b/gx/config.h @@ -57,6 +57,8 @@ typedef struct uint8 mono; int16 psg_preamp; int16 fm_preamp; + int16 cdda_volume; + int16 pcm_volume; int16 low_freq; int16 high_freq; int16 lg; diff --git a/gx/gui/menu.c b/gx/gui/menu.c index 1f103f2..6292e77 100644 --- a/gx/gui/menu.c +++ b/gx/gui/menu.c @@ -347,8 +347,10 @@ static gui_item items_audio[] = {NULL,NULL,"YM2612 Type: DISCRETE", "Select YM2612 chip model", 56,132,276,48}, {NULL,NULL,"High-Quality FM: ON", "Enable/Disable YM2612/YM2413 high-quality resampling", 56,132,276,48}, {NULL,NULL,"High-Quality PSG: ON", "Enable/Disable SN76489 high-quality resampling", 56,132,276,48}, - {NULL,NULL,"FM Volume: 1.00", "Adjust YM2612/YM2413 audio balance", 56,132,276,48}, - {NULL,NULL,"PSG Volume: 2.50", "Adjust SN76489 audio balance", 56,132,276,48}, + {NULL,NULL,"FM Volume: 1.00", "Adjust YM2612/YM2413 output mixing level", 56,132,276,48}, + {NULL,NULL,"PSG Volume: 2.50", "Adjust SN76489 output mixing level", 56,132,276,48}, + {NULL,NULL,"CD-DA Volume: 1.00", "Adjust CD audio output mixing level", 56,132,276,48}, + {NULL,NULL,"PCM Volume: 1.00", "Adjust CD hardware RF5C164 output mixing level", 56,132,276,48}, {NULL,NULL,"Audio Output: STEREO", "Select audio mixing output type", 56,132,276,48}, {NULL,NULL,"Filtering: 3-BAND EQ", "Select audio filtering type", 56,132,276,48}, {NULL,NULL,"Low Gain: 1.00", "Adjust EQ Low Band Gain", 56,132,276,48}, @@ -895,6 +897,8 @@ static void soundmenu () int ret, quit = 0; float fm_volume = (float)config.fm_preamp/100.0; float psg_volume = (float)config.psg_preamp/100.0; + float cdda_volume = (float)config.cdda_volume/100.0; + float pcm_volume = (float)config.pcm_volume/100.0; gui_menu *m = &menu_audio; gui_item *items = m->items; @@ -911,8 +915,10 @@ static void soundmenu () sprintf (items[4].text, "FM Volume: %1.2f", fm_volume); sprintf (items[5].text, "PSG Volume: %1.2f", psg_volume); + sprintf (items[6].text, "CD-DA Volume: %1.2f", cdda_volume); + sprintf (items[7].text, "PCM Volume: %1.2f", pcm_volume); - sprintf (items[6].text, "Audio Output: %s", config.mono ? "MONO":"STEREO"); + sprintf (items[8].text, "Audio Output: %s", config.mono ? "MONO":"STEREO"); if (config.filter == 2) { @@ -920,27 +926,27 @@ static void soundmenu () float mg = (float)config.mg/100.0; float hg = (float)config.hg/100.0; - sprintf(items[7].text, "Filtering: 3-BAND EQ"); - sprintf(items[8].text, "Low Gain: %1.2f", lg); - strcpy(items[8].comment, "Adjust EQ Low Band Gain"); - sprintf(items[9].text, "Middle Gain: %1.2f", mg); - sprintf(items[10].text, "High Gain: %1.2f", hg); - sprintf(items[11].text, "Low Freq: %d", config.low_freq); - sprintf(items[12].text, "High Freq: %d", config.high_freq); - m->max_items = 13; + sprintf(items[9].text, "Filtering: 3-BAND EQ"); + sprintf(items[10].text, "Low Gain: %1.2f", lg); + strcpy(items[10].comment, "Adjust EQ Low Band Gain"); + sprintf(items[11].text, "Middle Gain: %1.2f", mg); + sprintf(items[12].text, "High Gain: %1.2f", hg); + sprintf(items[13].text, "Low Freq: %d", config.low_freq); + sprintf(items[14].text, "High Freq: %d", config.high_freq); + m->max_items = 15; } else if (config.filter == 1) { int16 lp_range = (config.lp_range * 100 + 0xffff) / 0x10000; - sprintf (items[7].text, "Filtering: LOW-PASS"); - sprintf (items[8].text, "Low-Pass Rate: %d %%", lp_range); - strcpy (items[8].comment, "Adjust Low Pass filter"); - m->max_items = 9; + sprintf (items[9].text, "Filtering: LOW-PASS"); + sprintf (items[10].text, "Low-Pass Rate: %d %%", lp_range); + strcpy (items[10].comment, "Adjust Low Pass filter"); + m->max_items = 11; } else { - sprintf (items[7].text, "Filtering: OFF"); - m->max_items = 8; + sprintf (items[9].text, "Filtering: OFF"); + m->max_items = 10; } GUI_InitMenu(m); @@ -1023,35 +1029,51 @@ static void soundmenu () case 6: { - config.mono ^= 1; - sprintf (items[6].text, "Audio Out: %s", config.mono ? "MONO":"STEREO"); + GUI_OptionBox(m,0,"CD-DA Volume",(void *)&cdda_volume,0.01,0.0,1.0,0); + sprintf (items[6].text, "CD-DA Volume: %1.2f", cdda_volume); + config.cdda_volume = (int)(cdda_volume * 100.0 + 0.5); break; } case 7: + { + GUI_OptionBox(m,0,"PCM Volume",(void *)&pcm_volume,0.01,0.0,1.0,0); + sprintf (items[7].text, "PCM Volume: %1.2f", pcm_volume); + config.pcm_volume = (int)(pcm_volume * 100.0 + 0.5); + break; + } + + case 8: + { + config.mono ^= 1; + sprintf (items[8].text, "Audio Out: %s", config.mono ? "MONO":"STEREO"); + break; + } + + case 9: { config.filter = (config.filter + 1) % 3; if (config.filter == 2) { float lg = (float)config.lg/100.0; - sprintf (items[7].text, "Filtering: 3-BAND EQ"); - sprintf (items[8].text, "Low Gain: %1.2f", lg); - strcpy (items[8].comment, "Adjust EQ Low Band Gain"); - m->max_items = 13; + sprintf (items[9].text, "Filtering: 3-BAND EQ"); + sprintf (items[10].text, "Low Gain: %1.2f", lg); + strcpy (items[10].comment, "Adjust EQ Low Band Gain"); + m->max_items = 15; audio_set_equalizer(); } else if (config.filter == 1) { int lp_range = (config.lp_range * 100 + 0xffff) / 0x10000; - sprintf (items[7].text, "Filtering: LOW-PASS"); - sprintf (items[8].text, "Low-Pass Rate: %d %%", lp_range); - strcpy (items[8].comment, "Adjust Low Pass filter"); - m->max_items = 9; + sprintf (items[9].text, "Filtering: LOW-PASS"); + sprintf (items[10].text, "Low-Pass Rate: %d %%", lp_range); + strcpy (items[10].comment, "Adjust Low Pass filter"); + m->max_items = 11; } else { - sprintf (items[7].text, "Filtering: OFF"); - m->max_items = 8; + sprintf (items[9].text, "Filtering: OFF"); + m->max_items = 10; } while ((m->offset + 4) > m->max_items) @@ -1062,58 +1084,58 @@ static void soundmenu () break; } - case 8: + case 10: { if (config.filter == 1) { int16 lp_range = (config.lp_range * 100 + 0xffff) / 0x10000; GUI_OptionBox(m,0,"Low-Pass Rate (%)",(void *)&lp_range,1,0,100,1); - sprintf (items[8].text, "Low-Pass Rate: %d %%", lp_range); + sprintf (items[10].text, "Low-Pass Rate: %d %%", lp_range); config.lp_range = (lp_range * 0x10000) / 100; } else { float lg = (float)config.lg/100.0; GUI_OptionBox(m,0,"Low Gain",(void *)&lg,0.01,0.0,2.0,0); - sprintf (items[8].text, "Low Gain: %1.2f", lg); + sprintf (items[10].text, "Low Gain: %1.2f", lg); config.lg = (int)(lg * 100.0); audio_set_equalizer(); } break; } - case 9: + case 11: { float mg = (float)config.mg/100.0; GUI_OptionBox(m,0,"Middle Gain",(void *)&mg,0.01,0.0,2.0,0); - sprintf (items[9].text, "Middle Gain: %1.2f", mg); + sprintf (items[11].text, "Middle Gain: %1.2f", mg); config.mg = (int)(mg * 100.0); audio_set_equalizer(); break; } - case 10: - { - float hg = (float)config.hg/100.0; - GUI_OptionBox(m,0,"High Gain",(void *)&hg,0.01,0.0,2.0,0); - sprintf (items[10].text, "High Gain: %1.2f", hg); - config.hg = (int)(hg * 100.0); - audio_set_equalizer(); - break; - } - - case 11: - { - GUI_OptionBox(m,0,"Low Frequency",(void *)&config.low_freq,10,0,config.high_freq,1); - sprintf (items[11].text, "Low Freq: %d", config.low_freq); - audio_set_equalizer(); - break; - } - case 12: + { + float hg = (float)config.hg/100.0; + GUI_OptionBox(m,0,"High Gain",(void *)&hg,0.01,0.0,2.0,0); + sprintf (items[12].text, "High Gain: %1.2f", hg); + config.hg = (int)(hg * 100.0); + audio_set_equalizer(); + break; + } + + case 13: + { + GUI_OptionBox(m,0,"Low Frequency",(void *)&config.low_freq,10,0,config.high_freq,1); + sprintf (items[13].text, "Low Freq: %d", config.low_freq); + audio_set_equalizer(); + break; + } + + case 14: { GUI_OptionBox(m,0,"High Frequency",(void *)&config.high_freq,100,config.low_freq,30000,1); - sprintf (items[12].text, "High Freq: %d", config.high_freq); + sprintf (items[14].text, "High Freq: %d", config.high_freq); audio_set_equalizer(); break; } diff --git a/libretro/libretro.c b/libretro/libretro.c index b81cada..d7fb575 100644 --- a/libretro/libretro.c +++ b/libretro/libretro.c @@ -909,10 +909,12 @@ static void config_default(void) /* sound options */ config.psg_preamp = 150; config.fm_preamp = 100; + config.cdda_volume = 100; + config.pcm_volume = 100; config.hq_fm = 1; /* high-quality FM resampling (slower) */ config.hq_psg = 1; /* high-quality PSG resampling (slower) */ - config.filter = 0; /* no filter */ - config.lp_range = 0x7fff; /* 0.5 in 0.16 fixed point */ + config.filter = 1; /* no filter */ + config.lp_range = 0x9999; /* 0.6 in 0.16 fixed point */ config.low_freq = 880; config.high_freq = 5000; config.lg = 100; @@ -1557,6 +1559,18 @@ static void check_variables(bool first_run) config.fm_preamp = (!var.value) ? 100: atoi(var.value); } + var.key = "genesis_plus_gx_cdda_volume"; + environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var); + { + config.cdda_volume = (!var.value) ? 100: atoi(var.value); + } + + var.key = "genesis_plus_gx_pcm_volume"; + environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var); + { + config.pcm_volume = (!var.value) ? 100: atoi(var.value); + } + var.key = "genesis_plus_gx_audio_filter"; environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var); { @@ -1575,7 +1589,7 @@ static void check_variables(bool first_run) var.key = "genesis_plus_gx_lowpass_range"; environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var); { - config.lp_range = (!var.value) ? 60 : ((atoi(var.value) * 65536) / 100); + config.lp_range = (!var.value) ? 0x9999 : ((atoi(var.value) * 65536) / 100); } #if HAVE_EQ diff --git a/libretro/libretro_core_options.h b/libretro/libretro_core_options.h index f9605aa..0fd324c 100644 --- a/libretro/libretro_core_options.h +++ b/libretro/libretro_core_options.h @@ -162,7 +162,7 @@ struct retro_core_option_v2_definition option_defs_us[] = { "genesis_plus_gx_add_on", "CD add-on (MD mode) (Requires Restart)", NULL, - "Specify which add-on to use for CD audio playback.", + "Specify which add-on to use for CD audio playback with supported Mega Drive/Genesis games.", NULL, "system", { @@ -178,7 +178,7 @@ struct retro_core_option_v2_definition option_defs_us[] = { "genesis_plus_gx_lock_on", "Cartridge Lock-On", NULL, - "Lock-On Technology is a Genesis feature that allowed an older game to connect to the pass-through port of a special cartridge for extended or altered gameplay. This option specifies which type of special 'lock-on' cartridge to emulate. A corresponding bios file must be present in RetroArch's system directory.", + "Lock-On Technology is a Mega Drive/Genesis feature that allowed an older game to connect to the pass-through port of a special cartridge for extended or altered gameplay. This option specifies which type of special 'lock-on' cartridge to emulate. A corresponding bios file must be present in RetroArch's system directory.", NULL, "system", { @@ -284,7 +284,7 @@ struct retro_core_option_v2_definition option_defs_us[] = { "genesis_plus_gx_render", "Interlaced Mode 2 Output", NULL, - "Interlaced Mode 2 allows the Genesis to output a double height (high resolution) 320x448 image by drawing alternate scanlines each frame (this is used by 'Sonic the Hedgehog 2' and 'Combat Cars' multiplayer modes). 'Double Field' mimics original hardware, producing a sharp image with flickering/interlacing artefacts. 'Single Field' apples a de-interlacing filter, which stabilises the image but causes mild blurring.", + "Interlaced Mode 2 allows the Mega Drive/Genesis to output a double height (high resolution) 320x448 image by drawing alternate scanlines each frame (this is used by 'Sonic the Hedgehog 2' and 'Combat Cars' multiplayer modes). 'Single Field' mimics original hardware, producing each field (320x224) alternatively with flickering/interlacing artefacts. 'Double Field' simulates the interlaced display, which stabilises the image but causes mild blurring.", NULL, "video", { @@ -373,9 +373,9 @@ struct retro_core_option_v2_definition option_defs_us[] = { "Mega Drive / Genesis FM", NULL, #ifdef HAVE_YM3438_CORE - "Select method used to emulate the FM synthesizer (main sound generator) of the Mega Drive/Genesis. 'MAME' options are fast, and run full speed on most systems. 'Nuked' options are cycle accurate, very high quality, and have substantial CPU requirements. The 'YM2612' chip is used by the original Model 1 Genesis. The 'YM3438' is used in later Genesis revisions.", + "Select method used to emulate the FM synthesizer (main sound generator) of the Mega Drive/Genesis. 'MAME' options are fast, and run full speed on most systems. 'Nuked' options are cycle accurate, very high quality, and have substantial CPU requirements. The 'YM2612' chip is used by the original Model 1 Mega Drive/Genesis. The 'YM3438' is used in later Mega Drive/Genesis revisions.", #else - "Select method used to emulate the FM synthesizer (main sound generator) of the Mega Drive/Genesis. The 'YM2612' chip is used by the original Model 1 Genesis. The 'YM3438' is used in later Genesis revisions.", + "Select method used to emulate the FM synthesizer (main sound generator) of the Mega Drive/Genesis. The 'YM2612' chip is used by the original Model 1 Mega Drive/Genesis. The 'YM3438' is used in later Mega Drive/Genesis revisions.", #endif NULL, "audio", @@ -409,7 +409,7 @@ struct retro_core_option_v2_definition option_defs_us[] = { "genesis_plus_gx_audio_filter", "Audio Filter", NULL, - "Enable a low pass audio filter to better simulate the characteristic sound of a Model 1 Genesis.", + "Enable a low pass audio filter to better simulate the characteristic sound of a Model 1 Mega Drive/Genesis.", NULL, "audio", { @@ -457,7 +457,7 @@ struct retro_core_option_v2_definition option_defs_us[] = { "genesis_plus_gx_psg_preamp", "PSG Preamp Level", NULL, - "Set the audio preamplifier level of the emulated SN76496 4-channel Programmable Sound Generator found in the Master System, Game Gear and Genesis.", + "Set the audio preamplifier level of the emulated SN76496 4-channel Programmable Sound Generator found in the SG-1000, Sega Mark III, Master System, Game Gear and Mega Drive/Genesis.", NULL, "audio", { @@ -510,7 +510,7 @@ struct retro_core_option_v2_definition option_defs_us[] = { "genesis_plus_gx_fm_preamp", "FM Preamp Level", NULL, - "Set the audio preamplifier level of the emulated Sega Mark III/Master System FM Sound Unit.", + "Set the audio preamplifier level of the emulated Mega Drive/Genesis FM sound synthetizer or Sega Mark III/Master System FM Sound Unit.", NULL, "audio", { @@ -559,6 +559,72 @@ struct retro_core_option_v2_definition option_defs_us[] = { }, "100" }, + { + "genesis_plus_gx_cdda_volume", + "CD-DA Volume", + NULL, + "Adjust the mixing volume of the emulated CD audio playback output.", + NULL, + "audio", + { + { "0", NULL }, + { "5", NULL }, + { "10", NULL }, + { "15", NULL }, + { "20", NULL }, + { "25", NULL }, + { "30", NULL }, + { "35", NULL }, + { "40", NULL }, + { "45", NULL }, + { "50", NULL }, + { "55", NULL }, + { "60", NULL }, + { "65", NULL }, + { "70", NULL }, + { "75", NULL }, + { "80", NULL }, + { "85", NULL }, + { "90", NULL }, + { "95", NULL }, + { "100", NULL }, + { NULL, NULL }, + }, + "100" + }, + { + "genesis_plus_gx_pcm_volume", + "PCM Volume", + NULL, + "Adjust the mixing volume of the emulated Sega CD / Mega CD RF5C164 PCM sound generator output.", + NULL, + "audio", + { + { "0", NULL }, + { "5", NULL }, + { "10", NULL }, + { "15", NULL }, + { "20", NULL }, + { "25", NULL }, + { "30", NULL }, + { "35", NULL }, + { "40", NULL }, + { "45", NULL }, + { "50", NULL }, + { "55", NULL }, + { "60", NULL }, + { "65", NULL }, + { "70", NULL }, + { "75", NULL }, + { "80", NULL }, + { "85", NULL }, + { "90", NULL }, + { "95", NULL }, + { "100", NULL }, + { NULL, NULL }, + }, + "100" + }, #ifdef HAVE_EQ { "genesis_plus_gx_audio_eq_low", @@ -706,7 +772,7 @@ struct retro_core_option_v2_definition option_defs_us[] = { "genesis_plus_gx_no_sprite_limit", "Remove Per-Line Sprite Limit", NULL, - "Removes the 8 (Master System) or 20 (Genesis) sprite-per-scanline hardware limit. This reduces flickering but can cause visual glitches, as some games exploit the hardware limit to generate special effects.", + "Removes the original sprite-per-scanline hardware limit. This reduces flickering but can cause visual glitches, as some games exploit the hardware limit to generate special effects.", NULL, "hacks", { @@ -753,7 +819,7 @@ struct retro_core_option_v2_definition option_defs_us[] = { "genesis_plus_gx_addr_error", "68K Address Error", NULL, - "The Genesis CPU (Motorola 68000) produces an Address Error (crash) when attempting to perform unaligned memory access. Enabling '68K Address Error' simulates this behaviour. It should only be disabled when playing ROM hacks, since these are typically developed using less accurate emulators and may rely on invalid RAM access for correct operation.", + "The Mega Drive/Genesis Main CPU (Motorola 68000) generates an Address Error exception (crash) when attempting to perform unaligned memory access. Enabling '68K Address Error' simulates this behaviour. It should only be disabled when playing ROM hacks, since these are typically developed using less accurate emulators and may rely on invalid RAM access for correct operation.", NULL, "hacks", { diff --git a/libretro/osd.h b/libretro/osd.h index 7ca38b3..750034c 100644 --- a/libretro/osd.h +++ b/libretro/osd.h @@ -104,6 +104,8 @@ typedef struct uint8 mono; int16 psg_preamp; int16 fm_preamp; + int16 cdda_volume; + int16 pcm_volume; uint16 lp_range; int16 low_freq; int16 high_freq; diff --git a/psp2/config.c b/psp2/config.c index 22ca60d..bf5fac8 100644 --- a/psp2/config.c +++ b/psp2/config.c @@ -10,6 +10,8 @@ void set_config_defaults(void) /* sound options */ config.psg_preamp = 150; config.fm_preamp = 100; + config.cdda_volume = 100; + config.pcm_volume = 100; config.hq_fm = 0; config.hq_psg = 0; config.filter = 1; @@ -18,7 +20,7 @@ void set_config_defaults(void) config.lg = 100; config.mg = 100; config.hg = 100; - config.lp_range = 0x7fff; /* 0.5 in 0.16 fixed point */ + config.lp_range = 0x9999; /* 0.6 in 0.16 fixed point */ config.ym2612 = YM2612_DISCRETE; config.ym2413 = 2; /* = AUTO (0 = always OFF, 1 = always ON) */ config.mono = 0; diff --git a/psp2/config.h b/psp2/config.h index cce1455..1661d9d 100644 --- a/psp2/config.h +++ b/psp2/config.h @@ -24,6 +24,8 @@ typedef struct uint8 ym2413; int16 psg_preamp; int16 fm_preamp; + int16 cdda_volume; + int16 pcm_volume; uint32 lp_range; int16 low_freq; int16 high_freq; diff --git a/sdl/config.c b/sdl/config.c index 1acf53b..a8dc355 100644 --- a/sdl/config.c +++ b/sdl/config.c @@ -11,6 +11,8 @@ void set_config_defaults(void) /* sound options */ config.psg_preamp = 150; config.fm_preamp = 100; + config.cdda_volume = 100; + config.pcm_volume = 100; config.hq_fm = 1; config.hq_psg = 1; config.filter = 1; @@ -19,7 +21,7 @@ void set_config_defaults(void) config.lg = 100; config.mg = 100; config.hg = 100; - config.lp_range = 0x7fff; /* 0.6 in 0.16 fixed point */ + config.lp_range = 0x9999; /* 0.6 in 0.16 fixed point */ config.ym2612 = YM2612_DISCRETE; config.ym2413 = 2; /* = AUTO (0 = always OFF, 1 = always ON) */ config.ym3438 = 0; diff --git a/sdl/config.h b/sdl/config.h index 200701f..96ffd1d 100644 --- a/sdl/config.h +++ b/sdl/config.h @@ -24,6 +24,8 @@ typedef struct uint8 opll; int16 psg_preamp; int16 fm_preamp; + int16 cdda_volume; + int16 pcm_volume; uint32 lp_range; int16 low_freq; int16 high_freq;