EXPORT int speex_resampler_set_rate_frac()

in subprojects/speex/resample.c [1108:1146]


EXPORT int speex_resampler_set_rate_frac(SpeexResamplerState *st, spx_uint32_t ratio_num, spx_uint32_t ratio_den, spx_uint32_t in_rate, spx_uint32_t out_rate)
{
   spx_uint32_t fact;
   spx_uint32_t old_den;
   spx_uint32_t i;

   if (ratio_num == 0 || ratio_den == 0)
      return RESAMPLER_ERR_INVALID_ARG;

   if (st->in_rate == in_rate && st->out_rate == out_rate && st->num_rate == ratio_num && st->den_rate == ratio_den)
      return RESAMPLER_ERR_SUCCESS;

   old_den = st->den_rate;
   st->in_rate = in_rate;
   st->out_rate = out_rate;
   st->num_rate = ratio_num;
   st->den_rate = ratio_den;

   fact = _gcd (st->num_rate, st->den_rate);

   st->num_rate /= fact;
   st->den_rate /= fact;

   if (old_den > 0)
   {
      for (i=0;i<st->nb_channels;i++)
      {
         if (_muldiv(&st->samp_frac_num[i],st->samp_frac_num[i],st->den_rate,old_den) != RESAMPLER_ERR_SUCCESS)
            return RESAMPLER_ERR_OVERFLOW;
         /* Safety net */
         if (st->samp_frac_num[i] >= st->den_rate)
            st->samp_frac_num[i] = st->den_rate-1;
      }
   }

   if (st->initialised)
      return update_filter(st);
   return RESAMPLER_ERR_SUCCESS;
}