mirror of
https://github.com/dborth/snes9xgx.git
synced 2024-11-24 03:29:22 +01:00
refactoring. we only use the HermiteResampler
This commit is contained in:
parent
cacc596722
commit
f69cd5baee
@ -185,7 +185,6 @@
|
|||||||
#include "../msu1.h"
|
#include "../msu1.h"
|
||||||
#include "../snapshot.h"
|
#include "../snapshot.h"
|
||||||
#include "../display.h"
|
#include "../display.h"
|
||||||
#include "linear_resampler.h"
|
|
||||||
#include "hermite_resampler.h"
|
#include "hermite_resampler.h"
|
||||||
|
|
||||||
#define APU_DEFAULT_INPUT_RATE 32040
|
#define APU_DEFAULT_INPUT_RATE 32040
|
||||||
@ -195,7 +194,6 @@
|
|||||||
#define APU_DENOMINATOR_NTSC 328125
|
#define APU_DENOMINATOR_NTSC 328125
|
||||||
#define APU_NUMERATOR_PAL 34176
|
#define APU_NUMERATOR_PAL 34176
|
||||||
#define APU_DENOMINATOR_PAL 709379
|
#define APU_DENOMINATOR_PAL 709379
|
||||||
#define APU_DEFAULT_RESAMPLER HermiteResampler
|
|
||||||
|
|
||||||
SNES_SPC *spc_core = NULL;
|
SNES_SPC *spc_core = NULL;
|
||||||
|
|
||||||
@ -557,7 +555,7 @@ bool8 S9xInitSound (int buffer_ms, int lag_ms)
|
|||||||
arguments. Use 2x in the resampler for buffer leveling with SoundSync */
|
arguments. Use 2x in the resampler for buffer leveling with SoundSync */
|
||||||
if (!spc::resampler)
|
if (!spc::resampler)
|
||||||
{
|
{
|
||||||
spc::resampler = new APU_DEFAULT_RESAMPLER(spc::buffer_size >> (Settings.SoundSync ? 0 : 1));
|
spc::resampler = new HermiteResampler(spc::buffer_size >> (Settings.SoundSync ? 0 : 1));
|
||||||
if (!spc::resampler)
|
if (!spc::resampler)
|
||||||
{
|
{
|
||||||
delete[] spc::landing_buffer;
|
delete[] spc::landing_buffer;
|
||||||
@ -570,7 +568,7 @@ bool8 S9xInitSound (int buffer_ms, int lag_ms)
|
|||||||
|
|
||||||
if (!msu::resampler)
|
if (!msu::resampler)
|
||||||
{
|
{
|
||||||
msu::resampler = new APU_DEFAULT_RESAMPLER(msu::buffer_size >> (Settings.SoundSync ? 0 : 1));
|
msu::resampler = new HermiteResampler(msu::buffer_size >> (Settings.SoundSync ? 0 : 1));
|
||||||
if (!msu::resampler)
|
if (!msu::resampler)
|
||||||
{
|
{
|
||||||
delete[] msu::landing_buffer;
|
delete[] msu::landing_buffer;
|
||||||
|
@ -1,115 +0,0 @@
|
|||||||
/* Simple fixed-point linear resampler by BearOso*/
|
|
||||||
|
|
||||||
#ifndef __LINEAR_RESAMPLER_H
|
|
||||||
#define __LINEAR_RESAMPLER_H
|
|
||||||
|
|
||||||
#include "resampler.h"
|
|
||||||
#include "../snes9x.h"
|
|
||||||
|
|
||||||
static const int f_prec = 15;
|
|
||||||
static const uint32 f__one = (1 << f_prec);
|
|
||||||
|
|
||||||
#define lerp(t, a, b) (((((b) - (a)) * (t)) >> f_prec) + (a))
|
|
||||||
|
|
||||||
class LinearResampler : public Resampler
|
|
||||||
{
|
|
||||||
protected:
|
|
||||||
uint32 f__r_step;
|
|
||||||
uint32 f__inv_r_step;
|
|
||||||
uint32 f__r_frac;
|
|
||||||
int r_left, r_right;
|
|
||||||
|
|
||||||
public:
|
|
||||||
LinearResampler (int num_samples) : Resampler (num_samples)
|
|
||||||
{
|
|
||||||
f__r_frac = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
~LinearResampler ()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
time_ratio (double ratio)
|
|
||||||
{
|
|
||||||
if (ratio == 0.0)
|
|
||||||
ratio = 1.0;
|
|
||||||
f__r_step = (uint32) (ratio * f__one);
|
|
||||||
f__inv_r_step = (uint32) (f__one / ratio);
|
|
||||||
clear ();
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
clear (void)
|
|
||||||
{
|
|
||||||
ring_buffer::clear ();
|
|
||||||
f__r_frac = 0;
|
|
||||||
r_left = 0;
|
|
||||||
r_right = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
read (short *data, int num_samples)
|
|
||||||
{
|
|
||||||
int i_position = start >> 1;
|
|
||||||
short *internal_buffer = (short *) buffer;
|
|
||||||
int o_position = 0;
|
|
||||||
int consumed = 0;
|
|
||||||
int max_samples = (buffer_size >> 1);
|
|
||||||
|
|
||||||
while (o_position < num_samples && consumed < buffer_size)
|
|
||||||
{
|
|
||||||
if (f__r_step == f__one)
|
|
||||||
{
|
|
||||||
data[o_position] = internal_buffer[i_position];
|
|
||||||
data[o_position + 1] = internal_buffer[i_position + 1];
|
|
||||||
|
|
||||||
o_position += 2;
|
|
||||||
i_position += 2;
|
|
||||||
if (i_position >= max_samples)
|
|
||||||
i_position -= max_samples;
|
|
||||||
consumed += 2;
|
|
||||||
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
while (f__r_frac <= f__one && o_position < num_samples)
|
|
||||||
{
|
|
||||||
data[o_position] = lerp (f__r_frac,
|
|
||||||
r_left,
|
|
||||||
internal_buffer[i_position]);
|
|
||||||
data[o_position + 1] = lerp (f__r_frac,
|
|
||||||
r_right,
|
|
||||||
internal_buffer[i_position + 1]);
|
|
||||||
|
|
||||||
o_position += 2;
|
|
||||||
|
|
||||||
f__r_frac += f__r_step;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (f__r_frac > f__one)
|
|
||||||
{
|
|
||||||
f__r_frac -= f__one;
|
|
||||||
r_left = internal_buffer[i_position];
|
|
||||||
r_right = internal_buffer[i_position + 1];
|
|
||||||
i_position += 2;
|
|
||||||
if (i_position >= max_samples)
|
|
||||||
i_position -= max_samples;
|
|
||||||
consumed += 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
size -= consumed << 1;
|
|
||||||
start += consumed << 1;
|
|
||||||
if (start >= buffer_size)
|
|
||||||
start -= buffer_size;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline int
|
|
||||||
avail (void)
|
|
||||||
{
|
|
||||||
return (((size >> 2) * f__inv_r_step) - ((f__r_frac * f__inv_r_step) >> f_prec)) >> (f_prec - 1);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif /* __LINEAR_RESAMPLER_H */
|
|
Loading…
Reference in New Issue
Block a user