resample: avoid overflows

Avoid overflow in rate calculation. This can cause the resampler to
start on the wrong phase after a rate change.
Avoid overflow in cubic fraction calculation. This can cause noise when
dealing with higher samplerates.
This commit is contained in:
Wim Taymans 2016-02-11 19:47:04 +01:00
parent 188c0811de
commit 9d66b7cdd2

View file

@ -598,8 +598,8 @@ resampler_basic_interpolate_single (SpeexResamplerState * st,
const int offset = samp_frac_num * st->oversample / st->den_rate; const int offset = samp_frac_num * st->oversample / st->den_rate;
#ifdef FIXED_POINT #ifdef FIXED_POINT
const spx_word16_t frac = const spx_word16_t frac =
PDIV32 (SHL32 ((samp_frac_num * st->oversample) % st->den_rate, 15), ((((gint64) samp_frac_num * (gint64) st->oversample) % st->den_rate)
st->den_rate); << 15) / st->den_rate;
#else #else
const spx_word16_t frac = const spx_word16_t frac =
((float) ((samp_frac_num * st->oversample) % st->den_rate)) / ((float) ((samp_frac_num * st->oversample) % st->den_rate)) /
@ -1386,7 +1386,8 @@ speex_resampler_set_rate_frac (SpeexResamplerState * st, spx_uint32_t ratio_num,
if (old_den > 0) { if (old_den > 0) {
for (i = 0; i < st->nb_channels; i++) { for (i = 0; i < st->nb_channels; i++) {
st->samp_frac_num[i] = st->samp_frac_num[i] * st->den_rate / old_den; st->samp_frac_num[i] =
(gint64) st->samp_frac_num[i] * (gint64) st->den_rate / old_den;
/* Safety net */ /* Safety net */
if (st->samp_frac_num[i] >= st->den_rate) if (st->samp_frac_num[i] >= st->den_rate)
st->samp_frac_num[i] = st->den_rate - 1; st->samp_frac_num[i] = st->den_rate - 1;