mirror of
https://github.com/Shpoike/Quakespasm.git
synced 2025-03-13 14:28:01 +00:00
fix filter glitchy output. add more quality levels
This commit is contained in:
parent
cb238f7ed3
commit
78bc37751f
2 changed files with 23 additions and 24 deletions
Binary file not shown.
|
@ -213,10 +213,8 @@ static void S_UpdateFilter(filter_t *filter, int M, float f_c)
|
||||||
filter->f_c = f_c;
|
filter->f_c = f_c;
|
||||||
|
|
||||||
filter->parity = 0;
|
filter->parity = 0;
|
||||||
if ((M + 1) % 16 == 0)
|
// M + 1 rounded up to the next multiple of 16
|
||||||
filter->kernelsize = (M + 1);
|
filter->kernelsize = (M + 1) + 16 - ((M + 1) % 16);
|
||||||
else
|
|
||||||
filter->kernelsize = (M + 1) + 16 - ((M + 1) % 16);
|
|
||||||
filter->memory = calloc(filter->kernelsize, sizeof(float));
|
filter->memory = calloc(filter->kernelsize, sizeof(float));
|
||||||
filter->kernel = calloc(filter->kernelsize, sizeof(float));
|
filter->kernel = calloc(filter->kernelsize, sizeof(float));
|
||||||
|
|
||||||
|
@ -230,7 +228,7 @@ static void S_ApplyFilter(filter_t *filter, int *data, int stride, int count)
|
||||||
float *input;
|
float *input;
|
||||||
const int kernelsize = filter->kernelsize;
|
const int kernelsize = filter->kernelsize;
|
||||||
const float *kernel = filter->kernel;
|
const float *kernel = filter->kernel;
|
||||||
int parity = 0;
|
int parity;
|
||||||
|
|
||||||
input = malloc(sizeof(float) * (filter->kernelsize + count));
|
input = malloc(sizeof(float) * (filter->kernelsize + count));
|
||||||
|
|
||||||
|
@ -250,25 +248,22 @@ static void S_ApplyFilter(filter_t *filter, int *data, int stride, int count)
|
||||||
|
|
||||||
// apply the filter
|
// apply the filter
|
||||||
|
|
||||||
|
parity = filter->parity;
|
||||||
|
|
||||||
for (i=0; i<count; i++)
|
for (i=0; i<count; i++)
|
||||||
{
|
{
|
||||||
float val[4] = {0, 0, 0, 0};
|
float val = 0;
|
||||||
const float *inputptr = input + i;
|
|
||||||
|
|
||||||
parity = i % 4;
|
for (j = 4 - parity; j < kernelsize; j+=4)
|
||||||
|
|
||||||
for (j = parity; j < kernelsize; j+=16)
|
|
||||||
{
|
{
|
||||||
val[0] += kernel[j] * inputptr[j];
|
val += kernel[j] * input[i+j];
|
||||||
val[1] += kernel[j + 4] * inputptr[j + 4];
|
|
||||||
val[2] += kernel[j + 8] * inputptr[j + 8];
|
|
||||||
val[3] += kernel[j + 12] * inputptr[j + 12];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 4.0 is to increase volume by 12 dB; this is to make up the
|
// 4.0 is to increase volume by 12 dB; this is to make up the
|
||||||
// volume drop caused by the zero-filling this filter does.
|
// volume drop caused by the zero-filling this filter does.
|
||||||
data[i * stride] = (val[0] + val[1] + val[2] + val[3])
|
data[i * stride] = val * (32768.0 * 256.0 * 4.0);
|
||||||
* (32768.0 * 256.0 * 4.0);
|
|
||||||
|
parity = (parity + 1) % 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
filter->parity = parity;
|
filter->parity = parity;
|
||||||
|
@ -290,15 +285,19 @@ static void S_LowpassFilter(int *data, int stride, int count,
|
||||||
int M;
|
int M;
|
||||||
float bw;
|
float bw;
|
||||||
|
|
||||||
if (snd_filterquality.value == 0)
|
switch ((int)snd_filterquality.value)
|
||||||
{
|
{
|
||||||
M = 126;
|
case 1:
|
||||||
bw = 0.90;
|
M = 126; bw = 0.900; break;
|
||||||
}
|
case 2:
|
||||||
else
|
M = 150; bw = 0.915; break;
|
||||||
{
|
case 3:
|
||||||
M = 222;
|
M = 174; bw = 0.930; break;
|
||||||
bw = 0.96;
|
case 4:
|
||||||
|
M = 198; bw = 0.945; break;
|
||||||
|
case 5:
|
||||||
|
default:
|
||||||
|
M = 222; bw = 0.960; break;
|
||||||
}
|
}
|
||||||
|
|
||||||
float f_c = (bw * 11025 / 2.0) / 44100.0;
|
float f_c = (bw * 11025 / 2.0) / 44100.0;
|
||||||
|
|
Loading…
Reference in a new issue