audio: Several fixes to "simple" resampler (thanks, Vitaly!). Fixes Bugzilla #3551.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
diff --git a/src/audio/SDL_audiocvt.c b/src/audio/SDL_audiocvt.c
index 3b7faff..72fe2b5 100644
--- a/src/audio/SDL_audiocvt.c
+++ b/src/audio/SDL_audiocvt.c
@@ -196,31 +196,31 @@ SDL_ResampleAudioSimple(const int chans, const double rate_incr,
float *last_sample, const float *inbuf,
const int inbuflen, float *outbuf, const int outbuflen)
{
- const int framelen = chans * sizeof (float);
+ const int framelen = chans * (int)sizeof (float);
const int total = (inbuflen / framelen);
- const int finalpos = total - chans;
+ const int finalpos = (total * chans) - chans;
+ const int dest_samples = (int)(((double)total) * rate_incr);
const double src_incr = 1.0 / rate_incr;
- double idx = 0.0;
float *dst = outbuf;
- int consumed = 0;
+ float *target = (dst + (dest_samples * chans));
+ double idx = 0.0;
int i;
+ SDL_assert((dest_samples * framelen) <= outbuflen);
SDL_assert((inbuflen % framelen) == 0);
- while (consumed < total) {
+ while(dst < target) {
const int pos = ((int)idx) * chans;
const float *src = &inbuf[(pos >= finalpos) ? finalpos : pos];
- SDL_assert(dst < (outbuf + (outbuflen / framelen)));
for (i = 0; i < chans; i++) {
const float val = *(src++);
*(dst++) = (val + last_sample[i]) * 0.5f;
last_sample[i] = val;
}
- consumed = pos + chans;
idx += src_incr;
}
- return (int) ((dst - outbuf) * sizeof (float));
+ return (int) ((dst - outbuf) * (int)sizeof(float));
}