[Core/Sound]

. added optional MONO output mode
. improved Low-Pass filter

[Gamecube/Wii]
. added configurable deflickering filter (normally enabled by default)
. various improvement & bugfixes
This commit is contained in:
EkeEke 2013-06-16 23:39:38 +02:00
parent c32af0586a
commit f2800e6a2a
9 changed files with 177 additions and 134 deletions

View File

@ -100,8 +100,8 @@ void config_default(void)
config.fm_preamp = 100; config.fm_preamp = 100;
config.hq_fm = 1; config.hq_fm = 1;
config.psgBoostNoise = 1; config.psgBoostNoise = 1;
config.filter = 0; config.filter = 1;
config.lp_range = 60; config.lp_range = 0x9999; /* 0.6 in 16.16 fixed point */
config.low_freq = 880; config.low_freq = 880;
config.high_freq = 5000; config.high_freq = 5000;
config.lg = 1.0; config.lg = 1.0;
@ -109,6 +109,7 @@ void config_default(void)
config.hg = 1.0; config.hg = 1.0;
config.dac_bits = 14; config.dac_bits = 14;
config.ym2413 = 2; /* AUTO */ config.ym2413 = 2; /* AUTO */
config.mono = 0;
/* system options */ /* system options */
config.system = 0; /* AUTO */ config.system = 0; /* AUTO */
@ -131,16 +132,16 @@ void config_default(void)
config.gg_extra = 0; config.gg_extra = 0;
config.ntsc = 0; config.ntsc = 0;
config.vsync = 1; /* AUTO */ config.vsync = 1; /* AUTO */
config.bilinear = 1;
config.vfilter = 1;
if (VIDEO_HaveComponentCable()) if (VIDEO_HaveComponentCable())
{ {
config.render = 2; config.render = 2;
config.bilinear = 1;
} }
else else
{ {
config.render = 0; config.render = 0;
config.bilinear = 0;
} }
switch (vmode->viTVMode >> 2) switch (vmode->viTVMode >> 2)
@ -159,7 +160,7 @@ void config_default(void)
} }
#ifdef HW_RVL #ifdef HW_RVL
config.trap = 0; config.trap = 0;
config.gamma = VI_GM_1_0 / 10.0; config.gamma = VI_GM_1_0 / 10.0;
#endif #endif

View File

@ -40,7 +40,7 @@
#ifndef _CONFIG_H_ #ifndef _CONFIG_H_
#define _CONFIG_H_ #define _CONFIG_H_
#define CONFIG_VERSION "GENPLUS-GX 1.7.2" #define CONFIG_VERSION "GENPLUS-GX 1.7.4"
/**************************************************************************** /****************************************************************************
* Config Option * Config Option
@ -54,9 +54,10 @@ typedef struct
uint8 psgBoostNoise; uint8 psgBoostNoise;
uint8 dac_bits; uint8 dac_bits;
uint8 ym2413; uint8 ym2413;
uint8 mono;
int16 psg_preamp; int16 psg_preamp;
int16 fm_preamp; int16 fm_preamp;
int16 lp_range; uint32 lp_range;
int16 low_freq; int16 low_freq;
int16 high_freq; int16 high_freq;
int16 lg; int16 lg;
@ -68,7 +69,6 @@ typedef struct
uint8 vdp_mode; uint8 vdp_mode;
uint8 force_dtack; uint8 force_dtack;
uint8 addr_error; uint8 addr_error;
uint8 tmss;
uint8 bios; uint8 bios;
uint8 lock_on; uint8 lock_on;
uint8 hot_swap; uint8 hot_swap;
@ -81,6 +81,7 @@ typedef struct
uint8 render; uint8 render;
uint8 tv_mode; uint8 tv_mode;
uint8 bilinear; uint8 bilinear;
uint8 vfilter;
uint8 aspect; uint8 aspect;
int16 xshift; int16 xshift;
int16 yshift; int16 yshift;

View File

@ -484,7 +484,7 @@ int FileSelector(int type)
if (selection < 0) if (selection < 0)
{ {
selection = maxfiles - 1; selection = maxfiles - 1;
offset = selection - 10 + 1; offset = maxfiles - 10;
} }
if (selection < offset) if (selection < offset)
offset -= 10; offset -= 10;
@ -559,8 +559,12 @@ int FileSelector(int type)
if ((filelist[i].flags) && !strcmp(prev_folder,filelist[i].filename)) if ((filelist[i].flags) && !strcmp(prev_folder,filelist[i].filename))
{ {
selection = i; selection = i;
offset = (i / 10) * 10; while (i >= (offset + 10))
i = maxfiles; {
offset += 10;
if (offset > (maxfiles - 10)) offset = maxfiles - 10;
}
break;
} }
} }
} }

View File

@ -332,7 +332,7 @@ static gui_item items_options[5] =
}; };
/* Audio options */ /* Audio options */
static gui_item items_audio[12] = static gui_item items_audio[13] =
{ {
{NULL,NULL,"Master System FM: AUTO", "Enable/disable YM2413 chip", 56,132,276,48}, {NULL,NULL,"Master System FM: AUTO", "Enable/disable YM2413 chip", 56,132,276,48},
{NULL,NULL,"High-Quality FM: ON", "Adjust YM2612/YM2413 resampling quality", 56,132,276,48}, {NULL,NULL,"High-Quality FM: ON", "Adjust YM2612/YM2413 resampling quality", 56,132,276,48},
@ -340,6 +340,7 @@ static gui_item items_audio[12] =
{NULL,NULL,"FM Volume: 1.00", "Adjust YM2612/YM2413 output level", 56,132,276,48}, {NULL,NULL,"FM Volume: 1.00", "Adjust YM2612/YM2413 output level", 56,132,276,48},
{NULL,NULL,"PSG Volume: 2.50", "Adjust SN76489 output level", 56,132,276,48}, {NULL,NULL,"PSG Volume: 2.50", "Adjust SN76489 output level", 56,132,276,48},
{NULL,NULL,"PSG Noise Boost: OFF", "Boost SN76489 Noise Channel", 56,132,276,48}, {NULL,NULL,"PSG Noise Boost: OFF", "Boost SN76489 Noise Channel", 56,132,276,48},
{NULL,NULL,"Audio Out: STEREO", "Select audio mixing output type", 56,132,276,48},
{NULL,NULL,"Filtering: 3-BAND EQ", "Setup Audio filtering", 56,132,276,48}, {NULL,NULL,"Filtering: 3-BAND EQ", "Setup Audio filtering", 56,132,276,48},
{NULL,NULL,"Low Gain: 1.00", "Adjust EQ Low Band Gain", 56,132,276,48}, {NULL,NULL,"Low Gain: 1.00", "Adjust EQ Low Band Gain", 56,132,276,48},
{NULL,NULL,"Mid Gain: 1.00", "Adjust EQ Mid Band Gain", 56,132,276,48}, {NULL,NULL,"Mid Gain: 1.00", "Adjust EQ Mid Band Gain", 56,132,276,48},
@ -365,25 +366,26 @@ static gui_item items_system[10] =
/* Video options */ /* Video options */
#ifdef HW_RVL #ifdef HW_RVL
static gui_item items_video[12] = static gui_item items_video[13] =
#else #else
static gui_item items_video[10] = static gui_item items_video[11] =
#endif #endif
{ {
{NULL,NULL,"Display: PROGRESSIVE", "Select video mode", 56,132,276,48}, {NULL,NULL,"Display: PROGRESSIVE", "Select video mode", 56,132,276,48},
{NULL,NULL,"TV mode: 50/60Hz", "Select video refresh rate", 56,132,276,48}, {NULL,NULL,"TV mode: 50/60Hz", "Select video refresh rate", 56,132,276,48},
{NULL,NULL,"VSYNC: AUTO", "Enable/disable sync with Video Hardware", 56,132,276,48}, {NULL,NULL,"VSYNC: AUTO", "Enable/disable sync with Video Hardware", 56,132,276,48},
{NULL,NULL,"GX Bilinear Filter: OFF", "Enable/disable texture hardware filtering", 56,132,276,48}, {NULL,NULL,"GX Bilinear Filter: OFF", "Enable/disable texture hardware filtering", 56,132,276,48},
{NULL,NULL,"GX Deflickering Filter: OFF","Enable/disable GX hardware filtering", 56,132,276,48},
#ifdef HW_RVL #ifdef HW_RVL
{NULL,NULL,"VI Trap Filter: ON", "Enable/disable video hardware filtering", 56,132,276,48}, {NULL,NULL,"VI Trap Filter: ON", "Enable/disable video hardware filtering", 56,132,276,48},
{NULL,NULL,"VI Gamma Correction: 1.0","Adjust video hardware gamma correction", 56,132,276,48}, {NULL,NULL,"VI Gamma Correction: 1.0", "Adjust video hardware gamma correction", 56,132,276,48},
#endif #endif
{NULL,NULL,"NTSC Filter: COMPOSITE", "Enable/disable NTSC software filtering", 56,132,276,48}, {NULL,NULL,"NTSC Filter: COMPOSITE", "Enable/disable NTSC software filtering", 56,132,276,48},
{NULL,NULL,"Borders: OFF", "Enable/disable overscan emulation", 56,132,276,48}, {NULL,NULL,"Borders: OFF", "Enable/disable overscan emulation", 56,132,276,48},
{NULL,NULL,"GG screen: ORIGINAL", "Enable/disable Game Gear extended screen", 56,132,276,48}, {NULL,NULL,"GG screen: ORIGINAL", "Enable/disable Game Gear extended screen", 56,132,276,48},
{NULL,NULL,"Aspect: ORIGINAL (4:3)", "Select display aspect ratio", 56,132,276,48}, {NULL,NULL,"Aspect: ORIGINAL (4:3)", "Select display aspect ratio", 56,132,276,48},
{NULL,NULL,"Screen Position (+0,+0)", "Adjust display position", 56,132,276,48}, {NULL,NULL,"Screen Position (+0,+0)", "Adjust display position", 56,132,276,48},
{NULL,NULL,"Screen Scaling (+0,+0)", "Adjust display scaling", 56,132,276,48} {NULL,NULL,"Screen Scaling (+0,+0)", "Adjust display scaling", 56,132,276,48}
}; };
/* Menu options */ /* Menu options */
@ -819,6 +821,7 @@ static void soundmenu ()
sprintf (items[3].text, "FM Volume: %1.2f", fm_volume); sprintf (items[3].text, "FM Volume: %1.2f", fm_volume);
sprintf (items[4].text, "PSG Volume: %1.2f", psg_volume); sprintf (items[4].text, "PSG Volume: %1.2f", psg_volume);
sprintf (items[5].text, "PSG Noise Boost: %s", config.psgBoostNoise ? "ON":"OFF"); sprintf (items[5].text, "PSG Noise Boost: %s", config.psgBoostNoise ? "ON":"OFF");
sprintf (items[6].text, "Audio Out: %s", config.mono ? "MONO":"STEREO");
if (config.filter == 2) if (config.filter == 2)
{ {
@ -826,26 +829,27 @@ static void soundmenu ()
float mg = (float)config.mg/100.0; float mg = (float)config.mg/100.0;
float hg = (float)config.hg/100.0; float hg = (float)config.hg/100.0;
sprintf(items[6].text, "Filtering: 3-BAND EQ"); sprintf(items[7].text, "Filtering: 3-BAND EQ");
sprintf(items[7].text, "Low Gain: %1.2f", lg); sprintf(items[8].text, "Low Gain: %1.2f", lg);
strcpy(items[7].comment, "Adjust EQ Low Band Gain"); strcpy(items[8].comment, "Adjust EQ Low Band Gain");
sprintf(items[8].text, "Middle Gain: %1.2f", mg); sprintf(items[9].text, "Middle Gain: %1.2f", mg);
sprintf(items[9].text, "High Gain: %1.2f", hg); sprintf(items[10].text, "High Gain: %1.2f", hg);
sprintf(items[10].text, "Low Freq: %d", config.low_freq); sprintf(items[11].text, "Low Freq: %d", config.low_freq);
sprintf(items[11].text, "High Freq: %d", config.high_freq); sprintf(items[12].text, "High Freq: %d", config.high_freq);
m->max_items = 12; m->max_items = 13;
} }
else if (config.filter == 1) else if (config.filter == 1)
{ {
sprintf (items[6].text, "Filtering: LOW-PASS"); int lp_range = (config.lp_range * 100 + 0xffff) / 0x10000;
sprintf (items[7].text, "Low-Pass Rate: %d %%", config.lp_range); sprintf (items[7].text, "Filtering: LOW-PASS");
strcpy (items[7].comment, "Adjust Low Pass filter"); sprintf (items[8].text, "Low-Pass Rate: %d %%", lp_range);
m->max_items = 8; strcpy (items[9].comment, "Adjust Low Pass filter");
m->max_items = 9;
} }
else else
{ {
sprintf (items[6].text, "Filtering: OFF"); sprintf (items[7].text, "Filtering: OFF");
m->max_items = 7; m->max_items = 8;
} }
GUI_InitMenu(m); GUI_InitMenu(m);
@ -935,28 +939,36 @@ static void soundmenu ()
} }
case 6: case 6:
{
config.mono ^= 1;
sprintf (items[6].text, "Audio Out: %s", config.mono ? "MONO":"STEREO");
break;
}
case 7:
{ {
config.filter = (config.filter + 1) % 3; config.filter = (config.filter + 1) % 3;
if (config.filter == 2) if (config.filter == 2)
{ {
float lg = (float)config.lg/100.0; float lg = (float)config.lg/100.0;
sprintf (items[6].text, "Filtering: 3-BAND EQ"); sprintf (items[7].text, "Filtering: 3-BAND EQ");
sprintf (items[7].text, "Low Gain: %1.2f", lg); sprintf (items[8].text, "Low Gain: %1.2f", lg);
strcpy (items[7].comment, "Adjust EQ Low Band Gain"); strcpy (items[8].comment, "Adjust EQ Low Band Gain");
m->max_items = 12; m->max_items = 13;
audio_set_equalizer(); audio_set_equalizer();
} }
else if (config.filter == 1) else if (config.filter == 1)
{ {
sprintf (items[6].text, "Filtering: LOW-PASS"); int lp_range = (config.lp_range * 100 + 0xffff) / 0x10000;
sprintf (items[7].text, "Low-Pass Rate: %d %%", config.lp_range); sprintf (items[7].text, "Filtering: LOW-PASS");
strcpy (items[7].comment, "Adjust Low Pass filter"); sprintf (items[8].text, "Low-Pass Rate: %d %%", lp_range);
m->max_items = 8; strcpy (items[8].comment, "Adjust Low Pass filter");
m->max_items = 9;
} }
else else
{ {
sprintf (items[6].text, "Filtering: OFF"); sprintf (items[7].text, "Filtering: OFF");
m->max_items = 7; m->max_items = 8;
} }
while ((m->offset + 4) > m->max_items) while ((m->offset + 4) > m->max_items)
@ -967,56 +979,58 @@ static void soundmenu ()
break; break;
} }
case 7: case 8:
{ {
if (config.filter == 1) if (config.filter == 1)
{ {
GUI_OptionBox(m,0,"Low-Pass Rate",(void *)&config.lp_range,1,0,100,1); int lp_range = (config.lp_range * 100 + 0xffff) / 0x10000;
sprintf (items[7].text, "Low-Pass Rate: %d %%", config.lp_range); GUI_OptionBox(m,0,"Low-Pass Rate",(void *)&lp_range,1,0,100,1);
sprintf (items[8].text, "Low-Pass Rate: %d %%", lp_range);
config.lp_range = (lp_range * 0x10000) / 100;
} }
else else
{ {
float lg = (float)config.lg/100.0; float lg = (float)config.lg/100.0;
GUI_OptionBox(m,0,"Low Gain",(void *)&lg,0.01,0.0,2.0,0); GUI_OptionBox(m,0,"Low Gain",(void *)&lg,0.01,0.0,2.0,0);
sprintf (items[7].text, "Low Gain: %1.2f", lg); sprintf (items[8].text, "Low Gain: %1.2f", lg);
config.lg = (int)(lg * 100.0); config.lg = (int)(lg * 100.0);
audio_set_equalizer(); audio_set_equalizer();
} }
break; break;
} }
case 8: case 9:
{ {
float mg = (float)config.mg/100.0; float mg = (float)config.mg/100.0;
GUI_OptionBox(m,0,"Middle Gain",(void *)&mg,0.01,0.0,2.0,0); GUI_OptionBox(m,0,"Middle Gain",(void *)&mg,0.01,0.0,2.0,0);
sprintf (items[8].text, "Middle Gain: %1.2f", mg); sprintf (items[9].text, "Middle Gain: %1.2f", mg);
config.mg = (int)(mg * 100.0); config.mg = (int)(mg * 100.0);
audio_set_equalizer(); audio_set_equalizer();
break; break;
} }
case 9:
{
float hg = (float)config.hg/100.0;
GUI_OptionBox(m,0,"High Gain",(void *)&hg,0.01,0.0,2.0,0);
sprintf (items[9].text, "High Gain: %1.2f", hg);
config.hg = (int)(hg * 100.0);
audio_set_equalizer();
break;
}
case 10: case 10:
{ {
GUI_OptionBox(m,0,"Low Frequency",(void *)&config.low_freq,10,0,config.high_freq,1); float hg = (float)config.hg/100.0;
sprintf (items[10].text, "Low Freq: %d", config.low_freq); 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(); audio_set_equalizer();
break; break;
} }
case 11: 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:
{ {
GUI_OptionBox(m,0,"High Frequency",(void *)&config.high_freq,100,config.low_freq,30000,1); GUI_OptionBox(m,0,"High Frequency",(void *)&config.high_freq,100,config.low_freq,30000,1);
sprintf (items[11].text, "High Freq: %d", config.high_freq); sprintf (items[12].text, "High Freq: %d", config.high_freq);
audio_set_equalizer(); audio_set_equalizer();
break; break;
} }
@ -1292,14 +1306,7 @@ static void systemmenu ()
case 6: /*** 68k Address Error ***/ case 6: /*** 68k Address Error ***/
{ {
config.addr_error ^= 1; config.addr_error ^= 1;
if (((system_hw & SYSTEM_PBC) == SYSTEM_MD) && (system_hw != SYSTEM_MCD)) m68k.aerr_enabled = config.addr_error;
{
/* reinitialize cartridge hardware (UMK3 hack support) */
md_cart_init();
/* restore SRAM */
slot_autoload(0,config.s_device);
}
sprintf (items[6].text, "68k Address Error: %s", config.addr_error ? "ON" : "OFF"); sprintf (items[6].text, "68k Address Error: %s", config.addr_error ? "ON" : "OFF");
break; break;
} }
@ -1439,14 +1446,14 @@ static void systemmenu ()
* *
****************************************************************************/ ****************************************************************************/
#ifdef HW_RVL #ifdef HW_RVL
#define VI_OFFSET 6 #define VI_OFFSET 7
static void update_gamma(void) static void update_gamma(void)
{ {
VIDEO_SetGamma((int)(config.gamma * 10.0)); VIDEO_SetGamma((int)(config.gamma * 10.0));
VIDEO_Flush(); VIDEO_Flush();
} }
#else #else
#define VI_OFFSET 4 #define VI_OFFSET 5
#endif #endif
static void videomenu () static void videomenu ()
@ -1477,10 +1484,11 @@ static void videomenu ()
sprintf (items[2].text, "VSYNC: OFF"); sprintf (items[2].text, "VSYNC: OFF");
sprintf (items[3].text, "GX Bilinear Filter: %s", config.bilinear ? " ON" : "OFF"); sprintf (items[3].text, "GX Bilinear Filter: %s", config.bilinear ? " ON" : "OFF");
sprintf (items[4].text, "GX Deflickering Filter: %s", config.vfilter ? " ON" : "OFF");
#ifdef HW_RVL #ifdef HW_RVL
sprintf (items[4].text, "VI Trap Filter: %s", config.trap ? " ON" : "OFF"); sprintf (items[5].text, "VI Trap Filter: %s", config.trap ? " ON" : "OFF");
sprintf (items[5].text, "VI Gamma Correction: %1.1f", config.gamma); sprintf (items[6].text, "VI Gamma Correction: %1.1f", config.gamma);
#endif #endif
if (config.ntsc == 1) if (config.ntsc == 1)
@ -1493,7 +1501,7 @@ static void videomenu ()
sprintf (items[VI_OFFSET].text, "NTSC Filter: OFF"); sprintf (items[VI_OFFSET].text, "NTSC Filter: OFF");
if (config.overscan == 3) if (config.overscan == 3)
sprintf (items[VI_OFFSET+1].text, "Borders: ALL"); sprintf (items[VI_OFFSET+1].text, "Borders: FULL");
else if (config.overscan == 2) else if (config.overscan == 2)
sprintf (items[VI_OFFSET+1].text, "Borders: H ONLY"); sprintf (items[VI_OFFSET+1].text, "Borders: H ONLY");
else if (config.overscan == 1) else if (config.overscan == 1)
@ -1590,13 +1598,18 @@ static void videomenu ()
sprintf (items[3].text, "GX Bilinear Filter: %s", config.bilinear ? " ON" : "OFF"); sprintf (items[3].text, "GX Bilinear Filter: %s", config.bilinear ? " ON" : "OFF");
break; break;
#ifdef HW_RVL case 4: /*** GX Copy filtering (deflickering filter) ***/
case 4: /*** VIDEO Trap filtering ***/ config.vfilter ^= 1;
config.trap ^= 1; sprintf (items[4].text, "GX Deflicker Filter: %s", config.vfilter ? " ON" : "OFF");
sprintf (items[4].text, "VI Trap Filter: %s", config.trap ? " ON" : "OFF");
break; break;
case 5: /*** VIDEO Gamma correction ***/ #ifdef HW_RVL
case 5: /*** VIDEO Trap filtering ***/
config.trap ^= 1;
sprintf (items[5].text, "VI Trap Filter: %s", config.trap ? " ON" : "OFF");
break;
case 6: /*** VIDEO Gamma correction ***/
if (system_hw) if (system_hw)
{ {
update_gamma(); update_gamma();
@ -1615,7 +1628,7 @@ static void videomenu ()
m->arrows[1]->state = state[1]; m->arrows[1]->state = state[1];
m->screenshot = 0; m->screenshot = 0;
strcpy(m->title,"Video Settings"); strcpy(m->title,"Video Settings");
sprintf (items[5].text, "VI Gamma Correction: %1.1f", config.gamma); sprintf (items[6].text, "VI Gamma Correction: %1.1f", config.gamma);
VIDEO_SetGamma(VI_GM_1_0); VIDEO_SetGamma(VI_GM_1_0);
VIDEO_Flush(); VIDEO_Flush();
} }
@ -1641,7 +1654,7 @@ static void videomenu ()
case VI_OFFSET+1: /*** overscan emulation ***/ case VI_OFFSET+1: /*** overscan emulation ***/
config.overscan = (config.overscan + 1) & 3; config.overscan = (config.overscan + 1) & 3;
if (config.overscan == 3) if (config.overscan == 3)
sprintf (items[VI_OFFSET+1].text, "Borders: ALL"); sprintf (items[VI_OFFSET+1].text, "Borders: FULL");
else if (config.overscan == 2) else if (config.overscan == 2)
sprintf (items[VI_OFFSET+1].text, "Borders: H ONLY"); sprintf (items[VI_OFFSET+1].text, "Borders: H ONLY");
else if (config.overscan == 1) else if (config.overscan == 1)

View File

@ -78,7 +78,7 @@ static void ai_callback(void)
prevtime = current; prevtime = current;
#endif #endif
audio_sync = 1; audio_sync = 0;
} }
/* AUDIO engine initialization */ /* AUDIO engine initialization */
@ -128,7 +128,7 @@ void gx_audio_Shutdown(void)
***/ ***/
int gx_audio_Update(void) int gx_audio_Update(void)
{ {
if (audio_sync) if (!audio_sync)
{ {
/* Current available soundbuffer */ /* Current available soundbuffer */
s16 *sb = (s16 *)(soundbuffer[mixbuffer]); s16 *sb = (s16 *)(soundbuffer[mixbuffer]);
@ -151,7 +151,7 @@ int gx_audio_Update(void)
DCFlushRange((void *)sb, size); DCFlushRange((void *)sb, size);
AUDIO_InitDMA((u32) sb, size); AUDIO_InitDMA((u32) sb, size);
mixbuffer = (mixbuffer + 1) % SOUND_BUFFER_NUM; mixbuffer = (mixbuffer + 1) % SOUND_BUFFER_NUM;
audio_sync = 0; audio_sync = 1;
/* Start Audio DMA */ /* Start Audio DMA */
/* this is called once to kick-off DMA from external memory to audio interface */ /* this is called once to kick-off DMA from external memory to audio interface */
@ -200,7 +200,7 @@ void gx_audio_Start(void)
memset(soundbuffer, 0, 3 * SOUND_BUFFER_LEN); memset(soundbuffer, 0, 3 * SOUND_BUFFER_LEN);
audioStarted = 0; audioStarted = 0;
mixbuffer = 0; mixbuffer = 0;
audio_sync = 1; audio_sync = 0;
} }
/*** /***

View File

@ -368,7 +368,7 @@ static void vi_callback(u32 cnt)
prevtime = current; prevtime = current;
#endif #endif
video_sync = 1; video_sync = 0;
} }
/* Vertex Rendering */ /* Vertex Rendering */
@ -460,7 +460,7 @@ static void gxResetRendering(u8 type)
} }
/* Reset GX rendering mode */ /* Reset GX rendering mode */
static void gxResetMode(GXRModeObj *tvmode) static void gxResetMode(GXRModeObj *tvmode, int vfilter_enabled)
{ {
Mtx44 p; Mtx44 p;
f32 yScale = GX_GetYScaleFactor(tvmode->efbHeight, tvmode->xfbHeight); f32 yScale = GX_GetYScaleFactor(tvmode->efbHeight, tvmode->xfbHeight);
@ -472,7 +472,7 @@ static void gxResetMode(GXRModeObj *tvmode)
GX_SetScissor(0, 0, tvmode->fbWidth, tvmode->efbHeight); GX_SetScissor(0, 0, tvmode->fbWidth, tvmode->efbHeight);
GX_SetDispCopySrc(0, 0, tvmode->fbWidth, tvmode->efbHeight); GX_SetDispCopySrc(0, 0, tvmode->fbWidth, tvmode->efbHeight);
GX_SetDispCopyDst(xfbWidth, xfbHeight); GX_SetDispCopyDst(xfbWidth, xfbHeight);
GX_SetCopyFilter(tvmode->aa, tvmode->sample_pattern, (tvmode->xfbMode == VI_XFBMODE_SF) ? GX_FALSE : GX_TRUE, tvmode->vfilter); GX_SetCopyFilter(tvmode->aa, tvmode->sample_pattern, (tvmode->xfbMode == VI_XFBMODE_SF) ? GX_FALSE : vfilter_enabled, tvmode->vfilter);
GX_SetFieldMode(tvmode->field_rendering, ((tvmode->viHeight == 2 * tvmode->xfbHeight) ? GX_ENABLE : GX_DISABLE)); GX_SetFieldMode(tvmode->field_rendering, ((tvmode->viHeight == 2 * tvmode->xfbHeight) ? GX_ENABLE : GX_DISABLE));
guOrtho(p, tvmode->efbHeight/2, -(tvmode->efbHeight/2), -(tvmode->fbWidth/2), tvmode->fbWidth/2, 100, 1000); guOrtho(p, tvmode->efbHeight/2, -(tvmode->efbHeight/2), -(tvmode->fbWidth/2), tvmode->fbWidth/2, 100, 1000);
GX_LoadProjectionMtx(p, GX_ORTHOGRAPHIC); GX_LoadProjectionMtx(p, GX_ORTHOGRAPHIC);
@ -666,6 +666,9 @@ static void gxDrawCrosshair(gx_texture *texture, int x, int y)
int w = (texture->width * rmode->fbWidth) / (rmode->viWidth); int w = (texture->width * rmode->fbWidth) / (rmode->viWidth);
int h = (texture->height * rmode->efbHeight) / (rmode->viHeight); int h = (texture->height * rmode->efbHeight) / (rmode->viHeight);
/* Aspect correction for widescreen TV */
if (config.aspect & 2) w = (w * 3) / 4;
/* EFB scale & shift */ /* EFB scale & shift */
int xwidth = square[3] - square[9]; int xwidth = square[3] - square[9];
int ywidth = square[4] - square[10]; int ywidth = square[4] - square[10];
@ -718,15 +721,18 @@ static void gxDrawCdLeds(gx_texture *texture_l, gx_texture *texture_r)
{ {
/* adjust texture dimensions to XFB->VI scaling */ /* adjust texture dimensions to XFB->VI scaling */
int w = (texture_l->width * rmode->fbWidth) / (rmode->viWidth); int w = (texture_l->width * rmode->fbWidth) / (rmode->viWidth);
int h = (texture_r->height * rmode->efbHeight) / (rmode->viHeight); int h = (texture_l->height * rmode->efbHeight) / (rmode->viHeight);
/* Aspect correction for widescreen TV */
if (config.aspect & 2) w = (w * 3) / 4;
/* EFB scale & shift */ /* EFB scale & shift */
int xwidth = square[3] - square[9]; int xwidth = square[3] - square[9];
int ywidth = square[4] - square[10]; int ywidth = square[4] - square[10];
/* adjust texture coordinates to EFB */ /* adjust texture coordinates to EFB */
int xl = (((bitmap.viewport.x + 4) * xwidth) / (bitmap.viewport.w + 2*bitmap.viewport.x)) + square[9]; int xl = ((bitmap.viewport.x * xwidth) / vwidth) + square[9] + 8;
int xr = xwidth - xl + 2*square[9] - w; int xr = (((bitmap.viewport.x + bitmap.viewport.w) * xwidth) / vwidth) + square[9] - 8 - w;
int y = (((bitmap.viewport.y + bitmap.viewport.h - 4) * ywidth) / vheight) + square[10] - h; int y = (((bitmap.viewport.y + bitmap.viewport.h - 4) * ywidth) / vheight) + square[10] - h;
/* reset GX rendering */ /* reset GX rendering */
@ -1466,7 +1472,7 @@ void gx_video_Stop(void)
/* GX menu rendering */ /* GX menu rendering */
gxResetRendering(1); gxResetRendering(1);
gxResetMode(vmode); gxResetMode(vmode, GX_TRUE);
/* render game snapshot */ /* render game snapshot */
gxClearScreen((GXColor)BLACK); gxClearScreen((GXColor)BLACK);
@ -1625,15 +1631,16 @@ void gx_video_Start(void)
gxResetRendering(0); gxResetRendering(0);
/* resynchronize emulation with VSYNC */ /* resynchronize emulation with VSYNC */
video_sync = 0;
VIDEO_WaitVSync(); VIDEO_WaitVSync();
} }
/* GX render update */ /* GX render update */
int gx_video_Update(void) int gx_video_Update(void)
{ {
if (!video_sync && config.vsync && (gc_pal == vdp_pal)) return NO_SYNC; if (video_sync) return NO_SYNC;
video_sync = 0; video_sync = config.vsync && (gc_pal == vdp_pal);
/* check if display has changed during frame */ /* check if display has changed during frame */
if (bitmap.viewport.changed & 1) if (bitmap.viewport.changed & 1)
@ -1684,7 +1691,7 @@ int gx_video_Update(void)
gxResetScaler(vwidth); gxResetScaler(vwidth);
/* update GX rendering mode */ /* update GX rendering mode */
gxResetMode(rmode); gxResetMode(rmode, config.vfilter);
/* update VI mode */ /* update VI mode */
VIDEO_Configure(rmode); VIDEO_Configure(rmode);
@ -1829,7 +1836,7 @@ void gx_video_Init(void)
/* Initialize GX */ /* Initialize GX */
gxStart(); gxStart();
gxResetRendering(1); gxResetRendering(1);
gxResetMode(vmode); gxResetMode(vmode, GX_TRUE);
/* initialize FONT */ /* initialize FONT */
FONT_Init(); FONT_Init();

View File

@ -53,7 +53,7 @@ int16 SVP_cycles = 800;
static uint8 pause_b; static uint8 pause_b;
static EQSTATE eq; static EQSTATE eq;
static int32 llp,rrp; static int16 llp,rrp;
/******************************************************************************************/ /******************************************************************************************/
/* Audio subsystem */ /* Audio subsystem */
@ -239,46 +239,47 @@ int audio_update(int16 *buffer)
/* Audio filtering */ /* Audio filtering */
if (config.filter) if (config.filter)
{ {
int32 i, l, r; int samples = size;
int16 *out = buffer;
int32 l, r;
if (config.filter & 1) if (config.filter & 1)
{ {
/* single-pole low-pass filter (6 dB/octave) */ /* single-pole low-pass filter (6 dB/octave) */
uint32 factora = (config.lp_range << 16) / 100; uint32 factora = config.lp_range;
uint32 factorb = 0x10000 - factora; uint32 factorb = 0x10000 - factora;
int32 ll = llp;
int32 rr = rrp;
for (i = 0; i < size; i ++) /* restore previous sample */
l = llp;
r = rrp;
do
{ {
/* apply low-pass filter */ /* apply low-pass filter */
ll = (ll>>16)*factora + buffer[0]*factorb; l = l*factora + out[0]*factorb;
rr = (rr>>16)*factora + buffer[1]*factorb; r = r*factora + out[1]*factorb;
l = ll >> 16;
r = rr >> 16;
/* clipping (16-bit samples) */ /* 16.16 fixed point */
if (l > 32767) l = 32767; l >>= 16;
else if (l < -32768) l = -32768; r >>= 16;
if (r > 32767) r = 32767;
else if (r < -32768) r = -32768;
/* update sound buffer */ /* update sound buffer */
*buffer++ = l; *out++ = l;
*buffer++ = r; *out++ = r;
} }
while (--samples);
/* save last samples for next frame */ /* save last samples for next frame */
llp = ll; llp = l;
rrp = rr; rrp = r;
} }
else if (config.filter & 2) else if (config.filter & 2)
{ {
for (i = 0; i < size; i ++) do
{ {
/* 3 Band EQ */ /* 3 Band EQ */
l = do_3band(&eq,buffer[0]); l = do_3band(&eq,out[0]);
r = do_3band(&eq,buffer[1]); r = do_3band(&eq,out[1]);
/* clipping (16-bit samples) */ /* clipping (16-bit samples) */
if (l > 32767) l = 32767; if (l > 32767) l = 32767;
@ -287,12 +288,27 @@ int audio_update(int16 *buffer)
else if (r < -32768) r = -32768; else if (r < -32768) r = -32768;
/* update sound buffer */ /* update sound buffer */
*buffer++ = l; *out++ = l;
*buffer++ = r; *out++ = r;
} }
while (--samples);
} }
} }
/* Mono output mixing */
if (config.mono)
{
int16 out;
int samples = size;
do
{
out = (buffer[0] + buffer[1]) / 2;
*buffer++ = out;
*buffer++ = out;
}
while (--samples);
}
#ifdef LOGSOUND #ifdef LOGSOUND
error("%d samples returned\n\n",size); error("%d samples returned\n\n",size);
#endif #endif

View File

@ -13,15 +13,16 @@ void set_config_defaults(void)
config.fm_preamp = 100; config.fm_preamp = 100;
config.hq_fm = 1; config.hq_fm = 1;
config.psgBoostNoise = 1; config.psgBoostNoise = 1;
config.filter = 0; config.filter = 1;
config.low_freq = 200; config.low_freq = 200;
config.high_freq = 8000; config.high_freq = 8000;
config.lg = 1.0; config.lg = 1.0;
config.mg = 1.0; config.mg = 1.0;
config.hg = 1.0; config.hg = 1.0;
config.lp_range = 60; config.lp_range = 0x9999; /* 0.6 in 16.16 fixed point */
config.dac_bits = 14; config.dac_bits = 14;
config.ym2413 = 2; /* = AUTO (0 = always OFF, 1 = always ON) */ config.ym2413 = 2; /* = AUTO (0 = always OFF, 1 = always ON) */
config.mono = 0;
/* system options */ /* system options */
config.system = 0; /* = AUTO (or SYSTEM_SG, SYSTEM_MARKIII, SYSTEM_SMS, SYSTEM_SMS2, SYSTEM_GG, SYSTEM_MD) */ config.system = 0; /* = AUTO (or SYSTEM_SG, SYSTEM_MARKIII, SYSTEM_SMS, SYSTEM_SMS2, SYSTEM_GG, SYSTEM_MD) */

View File

@ -20,19 +20,19 @@ typedef struct
uint8 ym2413; uint8 ym2413;
int16 psg_preamp; int16 psg_preamp;
int16 fm_preamp; int16 fm_preamp;
int16 lp_range; uint32 lp_range;
int16 low_freq; int16 low_freq;
int16 high_freq; int16 high_freq;
int16 lg; int16 lg;
int16 mg; int16 mg;
int16 hg; int16 hg;
uint8 mono;
uint8 system; uint8 system;
uint8 region_detect; uint8 region_detect;
uint8 vdp_mode; uint8 vdp_mode;
uint8 master_clock; uint8 master_clock;
uint8 force_dtack; uint8 force_dtack;
uint8 addr_error; uint8 addr_error;
uint8 tmss;
uint8 bios; uint8 bios;
uint8 lock_on; uint8 lock_on;
uint8 hot_swap; uint8 hot_swap;