mirror of
https://github.com/ekeeke/Genesis-Plus-GX.git
synced 2024-12-28 12:11:50 +01:00
fixed YM2612 output limiter
modified resampler frame length calculation
This commit is contained in:
parent
cfa4a08211
commit
c0179e7ed4
@ -71,8 +71,8 @@ void config_default(void)
|
|||||||
config.hq_fm = 1;
|
config.hq_fm = 1;
|
||||||
config.psgBoostNoise = 0;
|
config.psgBoostNoise = 0;
|
||||||
config.filter = 1;
|
config.filter = 1;
|
||||||
config.low_freq = 200;
|
config.low_freq = 880;
|
||||||
config.high_freq = 8000;
|
config.high_freq = 5000;
|
||||||
config.lg = 1.0;
|
config.lg = 1.0;
|
||||||
config.mg = 1.0;
|
config.mg = 1.0;
|
||||||
config.hg = 1.0;
|
config.hg = 1.0;
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/* Game_Music_Emu 0.5.2. http://www.slack.net/~ant/ */
|
/* Game_Music_Emu 0.5.2. http://www.slack.net/~ant/ */
|
||||||
/* Copyright (C) 2004-2006 Shay Green. */
|
/* Copyright (C) 2004-2006 Shay Green. */
|
||||||
/* Modified by Eke-Eke for use in Genesis Plus (2009). */
|
/* C Conversion by Eke-Eke for use in Genesis Plus (2009). */
|
||||||
|
|
||||||
#include "Fir_Resampler.h"
|
#include "Fir_Resampler.h"
|
||||||
|
|
||||||
@ -23,7 +23,7 @@ static int step = STEREO;
|
|||||||
static int input_per_cycle;
|
static int input_per_cycle;
|
||||||
static double ratio = 1.0;
|
static double ratio = 1.0;
|
||||||
|
|
||||||
static void gen_sinc(double rolloff, int width, double offset, double spacing, double scale, int count, sample_t *out )
|
static void gen_sinc(double rolloff, int width, double offset, double spacing, double scale, int count, short *out )
|
||||||
{
|
{
|
||||||
double const maxh = 256;
|
double const maxh = 256;
|
||||||
double const fstep = M_PI / maxh * spacing;
|
double const fstep = M_PI / maxh * spacing;
|
||||||
@ -38,11 +38,11 @@ static void gen_sinc(double rolloff, int width, double offset, double spacing, d
|
|||||||
double w = angle * to_w;
|
double w = angle * to_w;
|
||||||
if ( fabs( w ) < M_PI )
|
if ( fabs( w ) < M_PI )
|
||||||
{
|
{
|
||||||
double rolloff_cos_a = ROLLOFF * cos( angle );
|
double rolloff_cos_a = rolloff * cos( angle );
|
||||||
double num = 1 - rolloff_cos_a -
|
double num = 1 - rolloff_cos_a -
|
||||||
pow_a_n * cos( maxh * angle ) +
|
pow_a_n * cos( maxh * angle ) +
|
||||||
pow_a_n * ROLLOFF * cos( (maxh - 1) * angle );
|
pow_a_n * rolloff * cos( (maxh - 1) * angle );
|
||||||
double den = 1 - rolloff_cos_a - rolloff_cos_a + ROLLOFF * ROLLOFF;
|
double den = 1 - rolloff_cos_a - rolloff_cos_a + rolloff * rolloff;
|
||||||
double sinc = scale * num / den - scale;
|
double sinc = scale * num / den - scale;
|
||||||
|
|
||||||
out [-1] = (short) (cos( w ) * sinc + sinc);
|
out [-1] = (short) (cos( w ) * sinc + sinc);
|
||||||
@ -78,6 +78,12 @@ int Fir_Resampler_initialize( int new_size )
|
|||||||
buffer = (sample_t *) realloc( buffer, (new_size + WRITE_OFFSET) * sizeof (sample_t) );
|
buffer = (sample_t *) realloc( buffer, (new_size + WRITE_OFFSET) * sizeof (sample_t) );
|
||||||
if ( !buffer && new_size ) return 0;
|
if ( !buffer && new_size ) return 0;
|
||||||
buffer_size = new_size + WRITE_OFFSET;
|
buffer_size = new_size + WRITE_OFFSET;
|
||||||
|
write_pos = 0;
|
||||||
|
res = 1;
|
||||||
|
imp_phase = 0;
|
||||||
|
skip_bits = 0;
|
||||||
|
step = STEREO;
|
||||||
|
ratio = 1.0;
|
||||||
Fir_Resampler_clear();
|
Fir_Resampler_clear();
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -265,7 +271,7 @@ int Fir_Resampler_input_needed( unsigned long output_count )
|
|||||||
|
|
||||||
unsigned long skip = skip_bits >> imp_phase;
|
unsigned long skip = skip_bits >> imp_phase;
|
||||||
int remain = res - imp_phase;
|
int remain = res - imp_phase;
|
||||||
while ( (output_count -= 2) > 0 )
|
while ( (output_count) > 0 ) /* fixed (Eke_Eke) */
|
||||||
{
|
{
|
||||||
input_count += step + (skip & 1) * STEREO;
|
input_count += step + (skip & 1) * STEREO;
|
||||||
skip >>= 1;
|
skip >>= 1;
|
||||||
|
@ -137,9 +137,6 @@
|
|||||||
|
|
||||||
#define FREQ_MASK ((1<<FREQ_SH)-1)
|
#define FREQ_MASK ((1<<FREQ_SH)-1)
|
||||||
|
|
||||||
#define MAXOUT (+32767)
|
|
||||||
#define MINOUT (-32768)
|
|
||||||
|
|
||||||
|
|
||||||
/* envelope generator */
|
/* envelope generator */
|
||||||
#define ENV_BITS 10
|
#define ENV_BITS 10
|
||||||
@ -162,6 +159,11 @@
|
|||||||
|
|
||||||
#define TL_RES_LEN (256) /* 8 bits addressing (real chip) */
|
#define TL_RES_LEN (256) /* 8 bits addressing (real chip) */
|
||||||
|
|
||||||
|
|
||||||
|
#define MAXOUT (+16383)
|
||||||
|
#define MINOUT (-16384)
|
||||||
|
|
||||||
|
|
||||||
/* TL_TAB_LEN is calculated as:
|
/* TL_TAB_LEN is calculated as:
|
||||||
* 13 - sinus amplitude bits (Y axis)
|
* 13 - sinus amplitude bits (Y axis)
|
||||||
* 2 - sinus sign bit (Y axis)
|
* 2 - sinus sign bit (Y axis)
|
||||||
@ -1913,7 +1915,8 @@ void YM2612Update(int length)
|
|||||||
|
|
||||||
/* Output samples buffers */
|
/* Output samples buffers */
|
||||||
int16 *bufFIR = Fir_Resampler_buffer();
|
int16 *bufFIR = Fir_Resampler_buffer();
|
||||||
if (!bufFIR)
|
if (bufFIR) bufFIR += snd.fm.pos*2;
|
||||||
|
else
|
||||||
{
|
{
|
||||||
bufL = snd.fm.buffer[0] + snd.fm.pos;
|
bufL = snd.fm.buffer[0] + snd.fm.pos;
|
||||||
bufR = snd.fm.buffer[1] + snd.fm.pos;
|
bufR = snd.fm.buffer[1] + snd.fm.pos;
|
||||||
@ -2041,10 +2044,6 @@ void YM2612Update(int length)
|
|||||||
|
|
||||||
/* timer B control */
|
/* timer B control */
|
||||||
INTERNAL_TIMER_B(length);
|
INTERNAL_TIMER_B(length);
|
||||||
|
|
||||||
/* update FIR resampler */
|
|
||||||
if (bufFIR)
|
|
||||||
Fir_Resampler_write(length * 2);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* initialize ym2612 emulator(s) */
|
/* initialize ym2612 emulator(s) */
|
||||||
|
@ -73,8 +73,9 @@ void audio_update (int size)
|
|||||||
/* resampling */
|
/* resampling */
|
||||||
if (config.hq_fm)
|
if (config.hq_fm)
|
||||||
{
|
{
|
||||||
int fm_len = (int) ((double)size * Fir_Resampler_ratio() + 0.5) ;
|
int len = Fir_Resampler_input_needed(size * 2);
|
||||||
sound_update(fm_len,size);
|
sound_update(len/2,size);
|
||||||
|
Fir_Resampler_write(len);
|
||||||
Fir_Resampler_read(fm,size);
|
Fir_Resampler_read(fm,size);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -96,10 +97,10 @@ void audio_update (int size)
|
|||||||
if (filter & 1)
|
if (filter & 1)
|
||||||
{
|
{
|
||||||
/* single-pole low-pass filter (6 dB/octave) */
|
/* single-pole low-pass filter (6 dB/octave) */
|
||||||
ll = (ll + l) >> 1;
|
l = (ll + l) >> 1;
|
||||||
rr = (rr + r) >> 1;
|
r = (rr + r) >> 1;
|
||||||
l = ll;
|
ll = l;
|
||||||
r = rr;
|
rr = r;
|
||||||
}
|
}
|
||||||
else if (filter & 2)
|
else if (filter & 2)
|
||||||
{
|
{
|
||||||
@ -141,7 +142,7 @@ int audio_init (int rate)
|
|||||||
snd.sample_rate = rate;
|
snd.sample_rate = rate;
|
||||||
|
|
||||||
/* Calculate the sound buffer size (for one frame) */
|
/* Calculate the sound buffer size (for one frame) */
|
||||||
snd.buffer_size = (rate / vdp_rate) + 8;
|
snd.buffer_size = (rate / vdp_rate) + 32;
|
||||||
|
|
||||||
#ifndef NGC
|
#ifndef NGC
|
||||||
/* Output buffers */
|
/* Output buffers */
|
||||||
|
Loading…
Reference in New Issue
Block a user