Skip to content

Commit

Permalink
Util_Audio: use basic linear interpolation
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
nadiaholmquist committed Mar 3, 2024
1 parent 67ca499 commit e227902
Showing 1 changed file with 20 additions and 13 deletions.
33 changes: 20 additions & 13 deletions src/frontend/Util_Audio.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -63,21 +63,28 @@ int AudioOut_GetNumSamples(int outlen)

void AudioOut_Resample(s16* inbuf, int inlen, s16* outbuf, int outlen, int volume)
{
float res_incr = inlen / (float)outlen;
float res_timer = 0;
int res_pos = 0;
double factor = (double) inlen / (double) outlen;
double inpos = -(factor / 2);
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;
outbuf[i*2+1] = (inbuf[res_pos*2+1] * volume) >> 8;

res_timer += res_incr;
while (res_timer >= 1.0)
{
res_timer -= 1.0;
res_pos++;
}
double intpart_d;
double frac = modf(inpos, &intpart_d);
int intpart = (int) intpart_d;

double l1 = inbuf[ intpart * 2];
double l2 = inbuf[(intpart * 2) + 2];
double r1 = inbuf[(intpart * 2) + 1];
double r2 = inbuf[(intpart * 2) + 3];

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;
}
}

Expand Down

0 comments on commit e227902

Please sign in to comment.