aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/frontend/Util_Audio.cpp33
1 files changed, 20 insertions, 13 deletions
diff --git a/src/frontend/Util_Audio.cpp b/src/frontend/Util_Audio.cpp
index 02b3026..25e04db 100644
--- a/src/frontend/Util_Audio.cpp
+++ b/src/frontend/Util_Audio.cpp
@@ -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;
}
}