mirror of
https://github.com/ekeeke/Genesis-Plus-GX.git
synced 2025-01-14 12:19:06 +01:00
+ added 3-Band Audio Equalizer support
This commit is contained in:
parent
05014756ca
commit
adcd65f2f4
@ -68,9 +68,11 @@ void config_default(void)
|
|||||||
/* sound options */
|
/* sound options */
|
||||||
config.psg_preamp = 150;
|
config.psg_preamp = 150;
|
||||||
config.fm_preamp = 100;
|
config.fm_preamp = 100;
|
||||||
config.boost = 1;
|
|
||||||
config.hq_fm = 1;
|
config.hq_fm = 1;
|
||||||
config.filter = 1;
|
config.filter = 1;
|
||||||
|
config.lg = 1.0;
|
||||||
|
config.mg = 1.0;
|
||||||
|
config.hg = 1.0;
|
||||||
|
|
||||||
/* system options */
|
/* system options */
|
||||||
config.region_detect = 0;
|
config.region_detect = 0;
|
||||||
@ -84,30 +86,34 @@ void config_default(void)
|
|||||||
config.yscale = 0;
|
config.yscale = 0;
|
||||||
config.aspect = 1;
|
config.aspect = 1;
|
||||||
config.overscan = 1;
|
config.overscan = 1;
|
||||||
config.render = VIDEO_HaveComponentCable() ? 2 : 0;
|
if (VIDEO_HaveComponentCable())
|
||||||
|
config.render = 2;
|
||||||
|
else
|
||||||
|
config.render = 0;
|
||||||
config.ntsc = 0;
|
config.ntsc = 0;
|
||||||
config.bilinear = 1;
|
config.bilinear = 1;
|
||||||
|
|
||||||
/* controllers options */
|
/* controllers options */
|
||||||
input.system[0] = SYSTEM_GAMEPAD;
|
input.system[0] = SYSTEM_GAMEPAD;
|
||||||
input.system[1] = SYSTEM_GAMEPAD;
|
input.system[1] = SYSTEM_GAMEPAD;
|
||||||
|
config.gun_cursor[0] = 1;
|
||||||
|
config.gun_cursor[1] = 1;
|
||||||
|
config.invert_mouse = 0;
|
||||||
gx_input_SetDefault();
|
gx_input_SetDefault();
|
||||||
config.gun_cursor[0] = 1;
|
|
||||||
config.gun_cursor[1] = 1;
|
|
||||||
config.invert_mouse = 0;
|
|
||||||
|
|
||||||
/* menu options */
|
/* menu options */
|
||||||
#ifdef HW_RVL
|
#ifdef HW_RVL
|
||||||
config.sram_auto = 0; /* let's assume we always have a FAT device by default */
|
/* let's assume we always have a FAT device by default */
|
||||||
|
config.sram_auto = 0;
|
||||||
#else
|
#else
|
||||||
config.sram_auto = -1;
|
config.sram_auto = -1;
|
||||||
#endif
|
#endif
|
||||||
config.state_auto = -1;
|
config.state_auto = -1;
|
||||||
config.bg_color = 0;
|
config.bg_color = 0;
|
||||||
config.bgm_volume = 100.0;
|
config.screen_w = 658;
|
||||||
config.sfx_volume = 100.0;
|
config.ask_confirm = 0;
|
||||||
config.screen_w = 658;
|
config.bgm_volume = 100.0;
|
||||||
config.ask_confirm = 0;
|
config.sfx_volume = 100.0;
|
||||||
|
|
||||||
/* restore saved configuration */
|
/* restore saved configuration */
|
||||||
config_load();
|
config_load();
|
||||||
|
@ -31,11 +31,13 @@
|
|||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
char version[16];
|
char version[16];
|
||||||
|
uint8 hq_fm;
|
||||||
int32 psg_preamp;
|
int32 psg_preamp;
|
||||||
int32 fm_preamp;
|
int32 fm_preamp;
|
||||||
uint8 boost;
|
|
||||||
uint8 filter;
|
uint8 filter;
|
||||||
uint8 hq_fm;
|
float lg;
|
||||||
|
float mg;
|
||||||
|
float hg;
|
||||||
uint8 region_detect;
|
uint8 region_detect;
|
||||||
uint8 force_dtack;
|
uint8 force_dtack;
|
||||||
uint8 bios_enabled;
|
uint8 bios_enabled;
|
||||||
@ -54,13 +56,13 @@ typedef struct
|
|||||||
uint16 pad_keymap[4][MAX_KEYS];
|
uint16 pad_keymap[4][MAX_KEYS];
|
||||||
uint32 wpad_keymap[4*3][MAX_KEYS];
|
uint32 wpad_keymap[4*3][MAX_KEYS];
|
||||||
t_input_config input[MAX_INPUTS];
|
t_input_config input[MAX_INPUTS];
|
||||||
int8 bg_color;
|
|
||||||
float bgm_volume;
|
|
||||||
float sfx_volume;
|
|
||||||
int8 sram_auto;
|
int8 sram_auto;
|
||||||
int8 state_auto;
|
int8 state_auto;
|
||||||
|
int8 bg_color;
|
||||||
int16 screen_w;
|
int16 screen_w;
|
||||||
uint8 ask_confirm;
|
uint8 ask_confirm;
|
||||||
|
float bgm_volume;
|
||||||
|
float sfx_volume;
|
||||||
} t_config;
|
} t_config;
|
||||||
|
|
||||||
/* Global data */
|
/* Global data */
|
||||||
|
@ -217,13 +217,15 @@ static gui_item items_options[5] =
|
|||||||
};
|
};
|
||||||
|
|
||||||
/* Audio options menu */
|
/* Audio options menu */
|
||||||
static gui_item items_audio[5] =
|
static gui_item items_audio[7] =
|
||||||
{
|
{
|
||||||
{NULL,NULL,"PSG Volume: 2.50", "Adjust PSG output level", 52,132,276,48},
|
{NULL,NULL,"High-Quality FM: LINEAR", "Setup YM2612 resampling", 52,132,276,48},
|
||||||
{NULL,NULL,"FM Volume: 1.00", "Adjust FM output level", 52,132,276,48},
|
{NULL,NULL,"PSG Volume: 2.50", "Adjust SN76489 output level", 52,132,276,48},
|
||||||
{NULL,NULL,"Volume Boost: 1x", "Adjust general output level", 52,132,276,48},
|
{NULL,NULL,"FM Volume: 1.00", "Adjust YM2612 output level", 52,132,276,48},
|
||||||
{NULL,NULL,"LowPass Filter: OFF","Enable/disable sound filtering", 52,132,276,48},
|
{NULL,NULL,"Filtering: 3-BAND EQ", "Setup Audio filtering", 52,132,276,48},
|
||||||
{NULL,NULL,"HQ YM2612: LINEAR", "Enable/disable FM chip interpolation",52,132,276,48}
|
{NULL,NULL,"Low Gain: 1.00", "Adjust EQ Low Gain", 52,132,276,48},
|
||||||
|
{NULL,NULL,"Middle Gain: 1.00", "Adjust EQ Middle Gain", 52,132,276,48},
|
||||||
|
{NULL,NULL,"High Gain: 1.00", "Adjust EQ High Gain", 52,132,276,48},
|
||||||
};
|
};
|
||||||
|
|
||||||
/* System options menu */
|
/* System options menu */
|
||||||
@ -434,7 +436,7 @@ static gui_menu menu_audio =
|
|||||||
{
|
{
|
||||||
"Audio Settings",
|
"Audio Settings",
|
||||||
0,0,
|
0,0,
|
||||||
5,4,6,
|
7,4,6,
|
||||||
items_audio,
|
items_audio,
|
||||||
buttons_list,
|
buttons_list,
|
||||||
bg_list,
|
bg_list,
|
||||||
@ -696,15 +698,25 @@ static void soundmenu ()
|
|||||||
float psg_volume = (double)config.psg_preamp/100.0;
|
float psg_volume = (double)config.psg_preamp/100.0;
|
||||||
float fm_volume = (double)config.fm_preamp/100.0;
|
float fm_volume = (double)config.fm_preamp/100.0;
|
||||||
|
|
||||||
sprintf (items[0].text, "PSG Volume: %1.2f", psg_volume);
|
if (config.hq_fm == 0) sprintf (items[0].text, "High-Quality FM: OFF");
|
||||||
sprintf (items[1].text, "FM Volume: %1.2f", fm_volume);
|
else if (config.hq_fm == 1) sprintf (items[0].text, "High-Quality FM: LINEAR");
|
||||||
sprintf (items[2].text, "Volume Boost: %dX", config.boost);
|
else sprintf (items[0].text, "High-Quality FM: SINC");
|
||||||
sprintf (items[3].text, "LowPass Filter: %s", config.filter ? " ON":"OFF");
|
sprintf (items[1].text, "PSG Volume: %1.2f", psg_volume);
|
||||||
if (config.hq_fm == 0) sprintf (items[4].text, "HQ YM2612: OFF");
|
sprintf (items[2].text, "FM Volume: %1.2f", (double)config.fm_preamp/100.0);
|
||||||
else if (config.hq_fm == 1) sprintf (items[4].text, "HQ YM2612: LINEAR");
|
if (config.filter == 2) sprintf (items[3].text, "Filtering: 3-BAND EQ");
|
||||||
else sprintf (items[4].text, "HQ YM2612: SINC");
|
else if (config.filter == 1) sprintf (items[3].text, "Filtering: LOW PASS");
|
||||||
|
else sprintf (items[3].text, "Filtering: OFF");
|
||||||
|
sprintf (items[4].text, "Low Gain: %1.2f", config.lg);
|
||||||
|
sprintf (items[5].text, "Low Gain: %1.2f", config.mg);
|
||||||
|
sprintf (items[6].text, "Low Gain: %1.2f", config.hg);
|
||||||
|
|
||||||
GUI_InitMenu(m);
|
GUI_InitMenu(m);
|
||||||
|
|
||||||
|
if (config.filter < 2)
|
||||||
|
m->max_items = 4;
|
||||||
|
else
|
||||||
|
m->max_items = 7;
|
||||||
|
|
||||||
GUI_SlideMenuTitle(m,strlen("Audio "));
|
GUI_SlideMenuTitle(m,strlen("Audio "));
|
||||||
|
|
||||||
while (quit == 0)
|
while (quit == 0)
|
||||||
@ -714,34 +726,11 @@ static void soundmenu ()
|
|||||||
switch (ret)
|
switch (ret)
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
GUI_OptionBox(m,0,"PSG Volume",(void *)&psg_volume,0.01,0.0,5.0,0);
|
|
||||||
sprintf (items[0].text, "PSG Volume: %1.2f", psg_volume);
|
|
||||||
config.psg_preamp = (int)(psg_volume * 100.0);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 1:
|
|
||||||
GUI_OptionBox(m,0,"FM Volume",(void *)&fm_volume,0.01,0.0,5.0,0);
|
|
||||||
sprintf (items[1].text, "FM Volume: %1.2f", (double)config.fm_preamp/100.0);
|
|
||||||
config.fm_preamp = (int)(fm_volume * 100.0);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 2:
|
|
||||||
config.boost ++;
|
|
||||||
if (config.boost > 4) config.boost = 0;
|
|
||||||
sprintf (items[2].text, "Volume Boost: %dX", config.boost);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 3:
|
|
||||||
config.filter ^= 1;
|
|
||||||
sprintf (items[3].text, "LowPass Filter: %s", config.filter ? " ON":"OFF");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 4:
|
|
||||||
config.hq_fm ++;
|
config.hq_fm ++;
|
||||||
if (config.hq_fm>2) config.hq_fm = 0;
|
if (config.hq_fm > 2) config.hq_fm = 0;
|
||||||
if (config.hq_fm == 0) sprintf (items[4].text, "HQ YM2612: OFF");
|
if (config.hq_fm == 0) sprintf (items[0].text, "High-Quality FM: OFF");
|
||||||
else if (config.hq_fm == 1) sprintf (items[4].text, "HQ YM2612: LINEAR");
|
else if (config.hq_fm == 1) sprintf (items[0].text, "High-Quality FM: LINEAR");
|
||||||
else sprintf (items[4].text, "HQ YM2612: SINC");
|
else sprintf (items[0].text, "High-Quality FM: SINC");
|
||||||
if (genromsize)
|
if (genromsize)
|
||||||
{
|
{
|
||||||
unsigned char *temp = memalign(32,YM2612GetContextSize());
|
unsigned char *temp = memalign(32,YM2612GetContextSize());
|
||||||
@ -755,12 +744,70 @@ static void soundmenu ()
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 1:
|
||||||
|
GUI_OptionBox(m,0,"PSG Volume",(void *)&psg_volume,0.01,0.0,5.0,0);
|
||||||
|
sprintf (items[1].text, "PSG Volume: %1.2f", psg_volume);
|
||||||
|
config.psg_preamp = (int)(psg_volume * 100.0);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
GUI_OptionBox(m,0,"FM Volume",(void *)&fm_volume,0.01,0.0,5.0,0);
|
||||||
|
sprintf (items[2].text, "FM Volume: %1.2f", (double)config.fm_preamp/100.0);
|
||||||
|
config.fm_preamp = (int)(fm_volume * 100.0);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 3:
|
||||||
|
config.filter ++;
|
||||||
|
if (config.filter > 2) config.filter = 0;
|
||||||
|
if (config.filter == 2)
|
||||||
|
sprintf (items[3].text, "Filtering: 3-BAND EQ");
|
||||||
|
else if (config.filter == 1)
|
||||||
|
sprintf (items[3].text, "Filtering: LOW PASS");
|
||||||
|
else
|
||||||
|
sprintf (items[3].text, "Filtering: OFF");
|
||||||
|
|
||||||
|
if (config.filter < 2)
|
||||||
|
{
|
||||||
|
/* reset menu selection */
|
||||||
|
m->offset = 0;
|
||||||
|
m->selected = 3;
|
||||||
|
m->max_items = 4;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* enable items */
|
||||||
|
m->max_items = 7;
|
||||||
|
|
||||||
|
/* intialize EQ */
|
||||||
|
audio_init_equalizer();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 4:
|
||||||
|
GUI_OptionBox(m,0,"Low Gain",(void *)&config.lg,0.01,0.0,2.0,0);
|
||||||
|
sprintf (items[4].text, "Low Gain: %1.2f", config.lg);
|
||||||
|
audio_set_equalizer();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 5:
|
||||||
|
GUI_OptionBox(m,0,"Middle Gain",(void *)&config.mg,0.01,0.0,2.0,0);
|
||||||
|
sprintf (items[5].text, "Low Gain: %1.2f", config.mg);
|
||||||
|
audio_set_equalizer();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 6:
|
||||||
|
GUI_OptionBox(m,0,"High Gain",(void *)&config.hg,0.01,0.0,2.0,0);
|
||||||
|
sprintf (items[6].text, "Low Gain: %1.2f", config.hg);
|
||||||
|
audio_set_equalizer();
|
||||||
|
break;
|
||||||
|
|
||||||
case -1:
|
case -1:
|
||||||
quit = 1;
|
quit = 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m->max_items = 7;
|
||||||
GUI_DeleteMenu(m);
|
GUI_DeleteMenu(m);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -881,6 +928,12 @@ static void videomenu ()
|
|||||||
else sprintf (items[5].text, "Aspect: FIT SCREEN");
|
else sprintf (items[5].text, "Aspect: FIT SCREEN");
|
||||||
|
|
||||||
GUI_InitMenu(m);
|
GUI_InitMenu(m);
|
||||||
|
|
||||||
|
if (config.aspect)
|
||||||
|
m->max_items = 7;
|
||||||
|
else
|
||||||
|
m->max_items = 8;
|
||||||
|
|
||||||
GUI_SlideMenuTitle(m,strlen("Video "));
|
GUI_SlideMenuTitle(m,strlen("Video "));
|
||||||
|
|
||||||
while (quit == 0)
|
while (quit == 0)
|
||||||
@ -944,40 +997,40 @@ static void videomenu ()
|
|||||||
if (config.aspect == 1) sprintf (items[5].text,"Aspect: ORIGINAL (4:3)");
|
if (config.aspect == 1) sprintf (items[5].text,"Aspect: ORIGINAL (4:3)");
|
||||||
else if (config.aspect == 2) sprintf (items[5].text, "Aspect: ORIGINAL (16:9)");
|
else if (config.aspect == 2) sprintf (items[5].text, "Aspect: ORIGINAL (16:9)");
|
||||||
else sprintf (items[5].text, "Aspect: FIT SCREEN");
|
else sprintf (items[5].text, "Aspect: FIT SCREEN");
|
||||||
|
|
||||||
|
if (config.aspect)
|
||||||
|
{
|
||||||
|
/* disable items */
|
||||||
|
m->max_items = 7;
|
||||||
|
|
||||||
|
/* reset menu selection */
|
||||||
|
if (m->offset > 3)
|
||||||
|
{
|
||||||
|
m->offset = 3;
|
||||||
|
m->selected = 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* enable items */
|
||||||
|
m->max_items = 8;
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* case 6:
|
case 6:
|
||||||
case -8:
|
|
||||||
if (ret<0) config.xshift --;
|
|
||||||
else config.xshift ++;
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 7:
|
case 7:
|
||||||
case -9:
|
|
||||||
if (ret<0) config.yshift --;
|
|
||||||
else config.yshift ++;
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 8:
|
|
||||||
case -10:
|
|
||||||
if (config.aspect) break;
|
|
||||||
if (ret<0) config.xscale --;
|
|
||||||
else config.xscale ++;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 9:
|
|
||||||
case -11:
|
|
||||||
if (config.aspect) break;
|
|
||||||
if (ret<0) config.yscale --;
|
|
||||||
else config.yscale ++;
|
|
||||||
break;
|
|
||||||
*/
|
|
||||||
case -1:
|
case -1:
|
||||||
quit = 1;
|
quit = 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m->max_items = 8;
|
||||||
GUI_DeleteMenu(m);
|
GUI_DeleteMenu(m);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
129
source/sound/eq.c
Normal file
129
source/sound/eq.c
Normal file
@ -0,0 +1,129 @@
|
|||||||
|
//----------------------------------------------------------------------------
|
||||||
|
//
|
||||||
|
// 3 Band EQ :)
|
||||||
|
//
|
||||||
|
// EQ.C - Main Source file for 3 band EQ
|
||||||
|
//
|
||||||
|
// (c) Neil C / Etanza Systems / 2K6
|
||||||
|
//
|
||||||
|
// Shouts / Loves / Moans = etanza at lycos dot co dot uk
|
||||||
|
//
|
||||||
|
// This work is hereby placed in the public domain for all purposes, including
|
||||||
|
// use in commercial applications.
|
||||||
|
//
|
||||||
|
// The author assumes NO RESPONSIBILITY for any problems caused by the use of
|
||||||
|
// this software.
|
||||||
|
//
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// NOTES :
|
||||||
|
//
|
||||||
|
// - Original filter code by Paul Kellet (musicdsp.pdf)
|
||||||
|
//
|
||||||
|
// - Uses 4 first order filters in series, should give 24dB per octave
|
||||||
|
//
|
||||||
|
// - Now with P4 Denormal fix :)
|
||||||
|
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// ----------
|
||||||
|
//| Includes |
|
||||||
|
// ----------
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <math.h>
|
||||||
|
#include "eq.h"
|
||||||
|
|
||||||
|
|
||||||
|
// -----------
|
||||||
|
//| Constants |
|
||||||
|
// -----------
|
||||||
|
|
||||||
|
static double vsa = (1.0 / 4294967295.0); // Very small amount (Denormal Fix)
|
||||||
|
|
||||||
|
|
||||||
|
// ---------------
|
||||||
|
//| Initialise EQ |
|
||||||
|
// ---------------
|
||||||
|
|
||||||
|
// Recommended frequencies are ...
|
||||||
|
//
|
||||||
|
// lowfreq = 880 Hz
|
||||||
|
// highfreq = 5000 Hz
|
||||||
|
//
|
||||||
|
// Set mixfreq to whatever rate your system is using (eg 48Khz)
|
||||||
|
|
||||||
|
void init_3band_state(EQSTATE * es, int lowfreq, int highfreq, int mixfreq)
|
||||||
|
{
|
||||||
|
// Clear state
|
||||||
|
|
||||||
|
memset(es, 0, sizeof(EQSTATE));
|
||||||
|
|
||||||
|
// Set Low/Mid/High gains to unity
|
||||||
|
|
||||||
|
es->lg = 1.0;
|
||||||
|
es->mg = 1.0;
|
||||||
|
es->hg = 1.0;
|
||||||
|
|
||||||
|
// Calculate filter cutoff frequencies
|
||||||
|
|
||||||
|
es->lf = 2 * sin(M_PI * ((double) lowfreq / (double) mixfreq));
|
||||||
|
es->hf = 2 * sin(M_PI * ((double) highfreq / (double) mixfreq));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ---------------
|
||||||
|
//| EQ one sample |
|
||||||
|
// ---------------
|
||||||
|
|
||||||
|
// - sample can be any range you like :)
|
||||||
|
//
|
||||||
|
// Note that the output will depend on the gain settings for each band
|
||||||
|
// (especially the bass) so may require clipping before output, but you
|
||||||
|
// knew that anyway :)
|
||||||
|
|
||||||
|
double do_3band(EQSTATE * es, int sample)
|
||||||
|
{
|
||||||
|
// Locals
|
||||||
|
|
||||||
|
double l, m, h; // Low / Mid / High - Sample Values
|
||||||
|
|
||||||
|
// Filter #1 (lowpass)
|
||||||
|
|
||||||
|
es->f1p0 += (es->lf * ((double) sample - es->f1p0)) + vsa;
|
||||||
|
es->f1p1 += (es->lf * (es->f1p0 - es->f1p1));
|
||||||
|
es->f1p2 += (es->lf * (es->f1p1 - es->f1p2));
|
||||||
|
es->f1p3 += (es->lf * (es->f1p2 - es->f1p3));
|
||||||
|
|
||||||
|
l = es->f1p3;
|
||||||
|
|
||||||
|
// Filter #2 (highpass)
|
||||||
|
|
||||||
|
es->f2p0 += (es->hf * ((double) sample - es->f2p0)) + vsa;
|
||||||
|
es->f2p1 += (es->hf * (es->f2p0 - es->f2p1));
|
||||||
|
es->f2p2 += (es->hf * (es->f2p1 - es->f2p2));
|
||||||
|
es->f2p3 += (es->hf * (es->f2p2 - es->f2p3));
|
||||||
|
|
||||||
|
h = es->sdm3 - es->f2p3;
|
||||||
|
|
||||||
|
// Calculate midrange (signal - (low + high))
|
||||||
|
|
||||||
|
m = es->sdm3 - (h + l);
|
||||||
|
|
||||||
|
// Scale, Combine and store
|
||||||
|
|
||||||
|
l *= es->lg;
|
||||||
|
m *= es->mg;
|
||||||
|
h *= es->hg;
|
||||||
|
|
||||||
|
// Shuffle history buffer
|
||||||
|
|
||||||
|
es->sdm3 = es->sdm2;
|
||||||
|
es->sdm2 = es->sdm1;
|
||||||
|
es->sdm1 = sample;
|
||||||
|
|
||||||
|
// Return result
|
||||||
|
|
||||||
|
return (int) (l + m + h);
|
||||||
|
}
|
67
source/sound/eq.h
Normal file
67
source/sound/eq.h
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
//---------------------------------------------------------------------------
|
||||||
|
//
|
||||||
|
// 3 Band EQ :)
|
||||||
|
//
|
||||||
|
// EQ.H - Header file for 3 band EQ
|
||||||
|
//
|
||||||
|
// (c) Neil C / Etanza Systems / 2K6
|
||||||
|
//
|
||||||
|
// Shouts / Loves / Moans = etanza at lycos dot co dot uk
|
||||||
|
//
|
||||||
|
// This work is hereby placed in the public domain for all purposes, including
|
||||||
|
// use in commercial applications.
|
||||||
|
//
|
||||||
|
// The author assumes NO RESPONSIBILITY for any problems caused by the use of
|
||||||
|
// this software.
|
||||||
|
//
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#ifndef __EQ3BAND__
|
||||||
|
#define __EQ3BAND__
|
||||||
|
|
||||||
|
// ------------
|
||||||
|
//| Structures |
|
||||||
|
// ------------
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
// Filter #1 (Low band)
|
||||||
|
|
||||||
|
double lf; // Frequency
|
||||||
|
double f1p0; // Poles ...
|
||||||
|
double f1p1;
|
||||||
|
double f1p2;
|
||||||
|
double f1p3;
|
||||||
|
|
||||||
|
// Filter #2 (High band)
|
||||||
|
|
||||||
|
double hf; // Frequency
|
||||||
|
double f2p0; // Poles ...
|
||||||
|
double f2p1;
|
||||||
|
double f2p2;
|
||||||
|
double f2p3;
|
||||||
|
|
||||||
|
// Sample history buffer
|
||||||
|
|
||||||
|
double sdm1; // Sample data minus 1
|
||||||
|
double sdm2; // 2
|
||||||
|
double sdm3; // 3
|
||||||
|
|
||||||
|
// Gain Controls
|
||||||
|
|
||||||
|
double lg; // low gain
|
||||||
|
double mg; // mid gain
|
||||||
|
double hg; // high gain
|
||||||
|
|
||||||
|
} EQSTATE;
|
||||||
|
|
||||||
|
|
||||||
|
// ---------
|
||||||
|
//| Exports |
|
||||||
|
// ---------
|
||||||
|
|
||||||
|
extern void init_3band_state(EQSTATE * es, int lowfreq, int highfreq,
|
||||||
|
int mixfreq);
|
||||||
|
extern double do_3band(EQSTATE * es, int sample);
|
||||||
|
|
||||||
|
|
||||||
|
#endif // #ifndef __EQ3BAND__
|
@ -23,6 +23,7 @@
|
|||||||
|
|
||||||
#include "shared.h"
|
#include "shared.h"
|
||||||
#include "samplerate.h"
|
#include "samplerate.h"
|
||||||
|
#include "eq.h"
|
||||||
|
|
||||||
#define SND_SIZE (snd.buffer_size * sizeof(int16))
|
#define SND_SIZE (snd.buffer_size * sizeof(int16))
|
||||||
|
|
||||||
@ -37,21 +38,36 @@ uint32 line_z80;
|
|||||||
int32 current_z80;
|
int32 current_z80;
|
||||||
uint8 system_hw;
|
uint8 system_hw;
|
||||||
|
|
||||||
/* SRC */
|
/****************************************************************
|
||||||
static SRC_DATA src_data;
|
* AUDIO equalizer
|
||||||
|
****************************************************************/
|
||||||
|
static EQSTATE eq;
|
||||||
|
|
||||||
static int ll, rr;
|
void audio_init_equalizer(void)
|
||||||
|
{
|
||||||
|
init_3band_state(&eq,880,5000,snd.sample_rate);
|
||||||
|
audio_set_equalizer();
|
||||||
|
}
|
||||||
|
|
||||||
|
void audio_set_equalizer(void)
|
||||||
|
{
|
||||||
|
eq.lg = (double)(config.lg);
|
||||||
|
eq.mg = (double)(config.mg);
|
||||||
|
eq.hg = (double)(config.hg);
|
||||||
|
}
|
||||||
|
|
||||||
/****************************************************************
|
/****************************************************************
|
||||||
* AUDIO stream update
|
* AUDIO stream update
|
||||||
****************************************************************/
|
****************************************************************/
|
||||||
|
static int ll, rr;
|
||||||
|
static SRC_DATA src_data;
|
||||||
|
|
||||||
void audio_update (int size)
|
void audio_update (int size)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
int l, r;
|
int l, r;
|
||||||
int psg_preamp = config.psg_preamp;
|
int psg_preamp = config.psg_preamp;
|
||||||
int fm_preamp = config.fm_preamp;
|
int fm_preamp = config.fm_preamp;
|
||||||
int boost = config.boost;
|
|
||||||
int filter = config.filter;
|
int filter = config.filter;
|
||||||
|
|
||||||
#ifndef DOS
|
#ifndef DOS
|
||||||
@ -109,18 +125,21 @@ void audio_update (int size)
|
|||||||
*fm_r++ = 0;
|
*fm_r++ = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* single-pole low-pass filter (6 dB/octave) */
|
/* filtering */
|
||||||
if (filter)
|
if (filter & 1)
|
||||||
{
|
{
|
||||||
|
/* single-pole low-pass filter (6 dB/octave) */
|
||||||
l = (ll + l) >> 1;
|
l = (ll + l) >> 1;
|
||||||
r = (rr + r) >> 1;
|
r = (rr + r) >> 1;
|
||||||
ll = l;
|
ll = l;
|
||||||
rr = r;
|
rr = r;
|
||||||
}
|
}
|
||||||
|
else if (filter & 2)
|
||||||
/* boost volume if asked*/
|
{
|
||||||
l = l * boost;
|
/* 3 Band EQ */
|
||||||
r = r * boost;
|
l = do_3band(&eq,l);
|
||||||
|
r = do_3band(&eq,r);
|
||||||
|
}
|
||||||
|
|
||||||
/* clipping */
|
/* clipping */
|
||||||
if (l > 32767) l = 32767;
|
if (l > 32767) l = 32767;
|
||||||
@ -200,6 +219,9 @@ int audio_init (int rate)
|
|||||||
snd.psg.buffer = (int16 *)malloc (SND_SIZE);
|
snd.psg.buffer = (int16 *)malloc (SND_SIZE);
|
||||||
if (!snd.psg.buffer) return (-1);
|
if (!snd.psg.buffer) return (-1);
|
||||||
|
|
||||||
|
/* 3 band EQ */
|
||||||
|
audio_init_equalizer();
|
||||||
|
|
||||||
/* Set audio enable flag */
|
/* Set audio enable flag */
|
||||||
snd.enabled = 1;
|
snd.enabled = 1;
|
||||||
|
|
||||||
|
@ -91,13 +91,15 @@ extern int32 current_z80;
|
|||||||
extern uint8 system_hw;
|
extern uint8 system_hw;
|
||||||
|
|
||||||
/* Function prototypes */
|
/* Function prototypes */
|
||||||
|
extern void audio_init_equalizer(void);
|
||||||
|
extern void audio_set_equalizer(void);
|
||||||
|
extern int audio_init (int rate);
|
||||||
|
extern void audio_shutdown (void);
|
||||||
|
extern void audio_update (int len);
|
||||||
extern void system_init (void);
|
extern void system_init (void);
|
||||||
extern void system_reset (void);
|
extern void system_reset (void);
|
||||||
extern void system_shutdown (void);
|
extern void system_shutdown (void);
|
||||||
extern int system_frame(int skip);
|
extern int system_frame(int skip);
|
||||||
extern int audio_init (int rate);
|
|
||||||
extern void audio_shutdown (void);
|
|
||||||
extern void audio_update (int len);
|
|
||||||
|
|
||||||
#endif /* _SYSTEM_H_ */
|
#endif /* _SYSTEM_H_ */
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user