Util_Audio: use basic linear interpolation
Should remove the artifacts caused by the previous nearest resampling. May be worth replacing with something better in the future, but this is an improvement for now.
This commit is contained in:
parent
67ca4997e2
commit
e227902cec
|
@ -63,21 +63,28 @@ int AudioOut_GetNumSamples(int outlen)
|
||||||
|
|
||||||
void AudioOut_Resample(s16* inbuf, int inlen, s16* outbuf, int outlen, int volume)
|
void AudioOut_Resample(s16* inbuf, int inlen, s16* outbuf, int outlen, int volume)
|
||||||
{
|
{
|
||||||
float res_incr = inlen / (float)outlen;
|
double factor = (double) inlen / (double) outlen;
|
||||||
float res_timer = 0;
|
double inpos = -(factor / 2);
|
||||||
int res_pos = 0;
|
double vol = (double) volume / 256.f;
|
||||||
|
|
||||||
for (int i = 0; i < outlen; i++)
|
for (int i = 0; i < outlen * 2; i += 2)
|
||||||
{
|
{
|
||||||
outbuf[i*2 ] = (inbuf[res_pos*2 ] * volume) >> 8;
|
double intpart_d;
|
||||||
outbuf[i*2+1] = (inbuf[res_pos*2+1] * volume) >> 8;
|
double frac = modf(inpos, &intpart_d);
|
||||||
|
int intpart = (int) intpart_d;
|
||||||
|
|
||||||
res_timer += res_incr;
|
double l1 = inbuf[ intpart * 2];
|
||||||
while (res_timer >= 1.0)
|
double l2 = inbuf[(intpart * 2) + 2];
|
||||||
{
|
double r1 = inbuf[(intpart * 2) + 1];
|
||||||
res_timer -= 1.0;
|
double r2 = inbuf[(intpart * 2) + 3];
|
||||||
res_pos++;
|
|
||||||
}
|
double ldiff = l2 - l1;
|
||||||
|
double rdiff = r2 - r1;
|
||||||
|
|
||||||
|
outbuf[i] = (s16) round((l1 + ldiff * frac) * vol);
|
||||||
|
outbuf[i+1] = (s16) round((r1 + rdiff * frac) * vol);
|
||||||
|
|
||||||
|
inpos += factor;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue