/* Copyright (C) 2007-2008 Jean-Marc Valin
   Copyright (C) 2008      Thorvald Natvig
      
   File: resample.c
   Arbitrary resampling code

   Redistribution and use in source and binary forms, with or without
   modification, are permitted provided that the following conditions are
   met:

   1. Redistributions of source code must retain the above copyright notice,
   this list of conditions and the following disclaimer.

   2. Redistributions in binary form must reproduce the above copyright
   notice, this list of conditions and the following disclaimer in the
   documentation and/or other materials provided with the distribution.

   3. The name of the author may not be used to endorse or promote products
   derived from this software without specific prior written permission.

   THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
   IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
   INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
   (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
   SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
   STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
   ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
   POSSIBILITY OF SUCH DAMAGE.
*/

/*
   The design goals of this code are:
      - Very fast algorithm
      - SIMD-friendly algorithm
      - Low memory requirement
      - Good *perceptual* quality (and not best SNR)

   Warning: This resampler is relatively new. Although I think I got rid of 
   all the major bugs and I don't expect the API to change anymore, there
   may be something I've missed. So use with caution.

   This algorithm is based on this original resampling algorithm:
   Smith, Julius O. Digital Audio Resampling Home Page
   Center for Computer Research in Music and Acoustics (CCRMA), 
   Stanford University, 2007.
   Web published at http://www-ccrma.stanford.edu/~jos/resample/.

   There is one main difference, though. This resampler uses cubic 
   interpolation instead of linear interpolation in the above paper. This
   makes the table much smaller and makes it possible to compute that table
   on a per-stream basis. In turn, being able to tweak the table for each 
   stream makes it possible to both reduce complexity on simple ratios 
   (e.g. 2/3), and get rid of the rounding operations in the inner loop. 
   The latter both reduces CPU time and makes the algorithm more SIMD-friendly.
*/

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

#ifdef OUTSIDE_SPEEX
#include <stdlib.h>

#ifdef HAVE_STRING_H
#include <string.h>
#endif

#include <glib.h>

#ifdef HAVE_ORC
#include <orc/orc.h>
#endif

#define EXPORT G_GNUC_INTERNAL

#ifdef _USE_SSE
#if !defined(__SSE__) || !defined(HAVE_XMMINTRIN_H)
#undef _USE_SSE
#endif
#endif

#ifdef _USE_SSE2
#if !defined(__SSE2__) || !defined(HAVE_EMMINTRIN_H)
#undef _USE_SSE2
#endif
#endif

#ifdef _USE_NEON
#ifndef HAVE_ARM_NEON
#undef _USE_NEON
#endif
#endif

static inline void *
speex_alloc (int size)
{
  return g_malloc0 (size);
}

static inline void *
speex_realloc (void *ptr, int size)
{
  return g_realloc (ptr, size);
}

static inline void
speex_free (void *ptr)
{
  g_free (ptr);
}

#include "speex_resampler.h"
#include "arch.h"
#else /* OUTSIDE_SPEEX */

#include "../include/speex/speex_resampler.h"
#include "arch.h"
#include "os_support.h"
#endif /* OUTSIDE_SPEEX */

#include <math.h>

#ifdef FIXED_POINT
#define WORD2INT(x) ((x) < -32767 ? -32768 : ((x) > 32766 ? 32767 : (x)))
#else
#define WORD2INT(x) ((x) < -32767.5f ? -32768 : ((x) > 32766.5f ? 32767 : floor(.5+(x))))
#endif

#define IMAX(a,b) ((a) > (b) ? (a) : (b))
#define IMIN(a,b) ((a) < (b) ? (a) : (b))

#ifndef NULL
#define NULL 0
#endif

#if defined _USE_SSE || defined _USE_SSE2
#include "resample_sse.h"
#endif

#ifdef _USE_NEON
#include "resample_neon.h"
#endif

/* Numer of elements to allocate on the stack */
#ifdef VAR_ARRAYS
#define FIXED_STACK_ALLOC 8192
#else
#define FIXED_STACK_ALLOC 1024
#endif

/* Allow selecting SSE or not when compiled with SSE support */
#ifdef _USE_SSE
#define SSE_FALLBACK(macro) \
  if (st->use_sse) goto sse_##macro##_sse; {
#define SSE_IMPLEMENTATION(macro) \
  goto sse_##macro##_end; } sse_##macro##_sse: {
#define SSE_END(macro) sse_##macro##_end:; }
#else
#define SSE_FALLBACK(macro)
#endif

#ifdef _USE_SSE2
#define SSE2_FALLBACK(macro) \
  if (st->use_sse2) goto sse2_##macro##_sse2; {
#define SSE2_IMPLEMENTATION(macro) \
  goto sse2_##macro##_end; } sse2_##macro##_sse2: {
#define SSE2_END(macro) sse2_##macro##_end:; }
#else
#define SSE2_FALLBACK(macro)
#endif

#ifdef _USE_NEON
#define NEON_FALLBACK(macro) \
  if (st->use_neon) goto neon_##macro##_neon; {
#define NEON_IMPLEMENTATION(macro) \
  goto neon_##macro##_end; } neon_##macro##_neon: {
#define NEON_END(macro) neon_##macro##_end:; }
#else
#define NEON_FALLBACK(macro)
#endif


typedef int (*resampler_basic_func) (SpeexResamplerState *, spx_uint32_t,
    const spx_word16_t *, spx_uint32_t *, spx_word16_t *, spx_uint32_t *);

struct SpeexResamplerState_
{
  spx_uint32_t in_rate;
  spx_uint32_t out_rate;
  spx_uint32_t num_rate;
  spx_uint32_t den_rate;

  int quality;
  spx_uint32_t nb_channels;
  spx_uint32_t filt_len;
  spx_uint32_t mem_alloc_size;
  spx_uint32_t buffer_size;
  int int_advance;
  int frac_advance;
  float cutoff;
  spx_uint32_t oversample;
  int initialised;
  int started;
  int use_full_sinc_table;

  /* These are per-channel */
  spx_int32_t *last_sample;
  spx_uint32_t *samp_frac_num;
  spx_uint32_t *magic_samples;

  spx_word16_t *mem;
  spx_word16_t *sinc_table;
  spx_uint32_t sinc_table_length;
  resampler_basic_func resampler_ptr;

  int in_stride;
  int out_stride;

  int use_sse:1;
  int use_sse2:1;
  int use_neon:1;
};

static const double kaiser12_table[68] = {
  0.99859849, 1.00000000, 0.99859849, 0.99440475, 0.98745105, 0.97779076,
  0.96549770, 0.95066529, 0.93340547, 0.91384741, 0.89213598, 0.86843014,
  0.84290116, 0.81573067, 0.78710866, 0.75723148, 0.72629970, 0.69451601,
  0.66208321, 0.62920216, 0.59606986, 0.56287762, 0.52980938, 0.49704014,
  0.46473455, 0.43304576, 0.40211431, 0.37206735, 0.34301800, 0.31506490,
  0.28829195, 0.26276832, 0.23854851, 0.21567274, 0.19416736, 0.17404546,
  0.15530766, 0.13794294, 0.12192957, 0.10723616, 0.09382272, 0.08164178,
  0.07063950, 0.06075685, 0.05193064, 0.04409466, 0.03718069, 0.03111947,
  0.02584161, 0.02127838, 0.01736250, 0.01402878, 0.01121463, 0.00886058,
  0.00691064, 0.00531256, 0.00401805, 0.00298291, 0.00216702, 0.00153438,
  0.00105297, 0.00069463, 0.00043489, 0.00025272, 0.00013031, 0.0000527734,
  0.00001000, 0.00000000
};

/*
static const double kaiser12_table[36] = {
   0.99440475, 1.00000000, 0.99440475, 0.97779076, 0.95066529, 0.91384741,
   0.86843014, 0.81573067, 0.75723148, 0.69451601, 0.62920216, 0.56287762,
   0.49704014, 0.43304576, 0.37206735, 0.31506490, 0.26276832, 0.21567274,
   0.17404546, 0.13794294, 0.10723616, 0.08164178, 0.06075685, 0.04409466,
   0.03111947, 0.02127838, 0.01402878, 0.00886058, 0.00531256, 0.00298291,
   0.00153438, 0.00069463, 0.00025272, 0.0000527734, 0.00000500, 0.00000000};
*/
static const double kaiser10_table[36] = {
  0.99537781, 1.00000000, 0.99537781, 0.98162644, 0.95908712, 0.92831446,
  0.89005583, 0.84522401, 0.79486424, 0.74011713, 0.68217934, 0.62226347,
  0.56155915, 0.50119680, 0.44221549, 0.38553619, 0.33194107, 0.28205962,
  0.23636152, 0.19515633, 0.15859932, 0.12670280, 0.09935205, 0.07632451,
  0.05731132, 0.04193980, 0.02979584, 0.02044510, 0.01345224, 0.00839739,
  0.00488951, 0.00257636, 0.00115101, 0.00035515, 0.00000000, 0.00000000
};

static const double kaiser8_table[36] = {
  0.99635258, 1.00000000, 0.99635258, 0.98548012, 0.96759014, 0.94302200,
  0.91223751, 0.87580811, 0.83439927, 0.78875245, 0.73966538, 0.68797126,
  0.63451750, 0.58014482, 0.52566725, 0.47185369, 0.41941150, 0.36897272,
  0.32108304, 0.27619388, 0.23465776, 0.19672670, 0.16255380, 0.13219758,
  0.10562887, 0.08273982, 0.06335451, 0.04724088, 0.03412321, 0.02369490,
  0.01563093, 0.00959968, 0.00527363, 0.00233883, 0.00050000, 0.00000000
};

static const double kaiser6_table[36] = {
  0.99733006, 1.00000000, 0.99733006, 0.98935595, 0.97618418, 0.95799003,
  0.93501423, 0.90755855, 0.87598009, 0.84068475, 0.80211977, 0.76076565,
  0.71712752, 0.67172623, 0.62508937, 0.57774224, 0.53019925, 0.48295561,
  0.43647969, 0.39120616, 0.34752997, 0.30580127, 0.26632152, 0.22934058,
  0.19505503, 0.16360756, 0.13508755, 0.10953262, 0.08693120, 0.06722600,
  0.05031820, 0.03607231, 0.02432151, 0.01487334, 0.00752000, 0.00000000
};

struct FuncDef
{
  const double *table;
  int oversample;
};

static struct FuncDef _KAISER12 = { kaiser12_table, 64 };

#define KAISER12 (&_KAISER12)
/*static struct FuncDef _KAISER12 = {kaiser12_table, 32};
#define KAISER12 (&_KAISER12)*/
static struct FuncDef _KAISER10 = { kaiser10_table, 32 };

#define KAISER10 (&_KAISER10)
static struct FuncDef _KAISER8 = { kaiser8_table, 32 };

#define KAISER8 (&_KAISER8)
static struct FuncDef _KAISER6 = { kaiser6_table, 32 };

#define KAISER6 (&_KAISER6)

struct QualityMapping
{
  int base_length;
  int oversample;
  float downsample_bandwidth;
  float upsample_bandwidth;
  struct FuncDef *window_func;
};


/* This table maps conversion quality to internal parameters. There are two
   reasons that explain why the up-sampling bandwidth is larger than the 
   down-sampling bandwidth:
   1) When up-sampling, we can assume that the spectrum is already attenuated
      close to the Nyquist rate (from an A/D or a previous resampling filter)
   2) Any aliasing that occurs very close to the Nyquist rate will be masked
      by the sinusoids/noise just below the Nyquist rate (guaranteed only for
      up-sampling).
*/
static const struct QualityMapping quality_map[11] = {
  {8, 4, 0.830f, 0.860f, KAISER6},      /* Q0 */
  {16, 4, 0.850f, 0.880f, KAISER6},     /* Q1 */
  {32, 4, 0.882f, 0.910f, KAISER6},     /* Q2 *//* 82.3% cutoff ( ~60 dB stop) 6  */
  {48, 8, 0.895f, 0.917f, KAISER8},     /* Q3 *//* 84.9% cutoff ( ~80 dB stop) 8  */
  {64, 8, 0.921f, 0.940f, KAISER8},     /* Q4 *//* 88.7% cutoff ( ~80 dB stop) 8  */
  {80, 16, 0.922f, 0.940f, KAISER10},   /* Q5 *//* 89.1% cutoff (~100 dB stop) 10 */
  {96, 16, 0.940f, 0.945f, KAISER10},   /* Q6 *//* 91.5% cutoff (~100 dB stop) 10 */
  {128, 16, 0.950f, 0.950f, KAISER10},  /* Q7 *//* 93.1% cutoff (~100 dB stop) 10 */
  {160, 16, 0.960f, 0.960f, KAISER10},  /* Q8 *//* 94.5% cutoff (~100 dB stop) 10 */
  {192, 32, 0.968f, 0.968f, KAISER12},  /* Q9 *//* 95.5% cutoff (~100 dB stop) 10 */
  {256, 32, 0.975f, 0.975f, KAISER12},  /* Q10 *//* 96.6% cutoff (~100 dB stop) 10 */
};

/*8,24,40,56,80,104,128,160,200,256,320*/
#ifdef DOUBLE_PRECISION
static double
compute_func (double x, struct FuncDef *func)
{
  double y, frac;
#else
static double
compute_func (float x, struct FuncDef *func)
{
  float y, frac;
#endif
  double interp[4];
  int ind;
  y = x * func->oversample;
  ind = (int) floor (y);
  frac = (y - ind);
  /* CSE with handle the repeated powers */
  interp[3] = -0.1666666667 * frac + 0.1666666667 * (frac * frac * frac);
  interp[2] = frac + 0.5 * (frac * frac) - 0.5 * (frac * frac * frac);
  /*interp[2] = 1.f - 0.5f*frac - frac*frac + 0.5f*frac*frac*frac; */
  interp[0] =
      -0.3333333333 * frac + 0.5 * (frac * frac) -
      0.1666666667 * (frac * frac * frac);
  /* Just to make sure we don't have rounding problems */
  interp[1] = 1.f - interp[3] - interp[2] - interp[0];

  /*sum = frac*accum[1] + (1-frac)*accum[2]; */
  return interp[0] * func->table[ind] + interp[1] * func->table[ind + 1] +
      interp[2] * func->table[ind + 2] + interp[3] * func->table[ind + 3];
}

#if 0
#include <stdio.h>
int
main (int argc, char **argv)
{
  int i;
  for (i = 0; i < 256; i++) {
    printf ("%f\n", compute_func (i / 256., KAISER12));
  }
  return 0;
}
#endif

#ifdef FIXED_POINT
/* The slow way of computing a sinc for the table. Should improve that some day */
static spx_word16_t
sinc (float cutoff, float x, int N, struct FuncDef *window_func)
{
  /*fprintf (stderr, "%f ", x); */
  float xx = x * cutoff;
  if (fabs (x) < 1e-6f)
    return WORD2INT (32768. * cutoff);
  else if (fabs (x) > .5f * N)
    return 0;
  /*FIXME: Can it really be any slower than this? */
  return WORD2INT (32768. * cutoff * sin (G_PI * xx) / (G_PI * xx) *
      compute_func (fabs (2. * x / N), window_func));
}
#else
/* The slow way of computing a sinc for the table. Should improve that some day */
#ifdef DOUBLE_PRECISION
static spx_word16_t
sinc (double cutoff, double x, int N, struct FuncDef *window_func)
{
  /*fprintf (stderr, "%f ", x); */
  double xx = x * cutoff;
#else
static spx_word16_t
sinc (float cutoff, float x, int N, struct FuncDef *window_func)
{
  /*fprintf (stderr, "%f ", x); */
  float xx = x * cutoff;
#endif
  if (fabs (x) < 1e-6)
    return cutoff;
  else if (fabs (x) > .5 * N)
    return 0;
  /*FIXME: Can it really be any slower than this? */
  return cutoff * sin (G_PI * xx) / (G_PI * xx) * compute_func (fabs (2. * x /
          N), window_func);
}
#endif

#ifdef FIXED_POINT
static void
cubic_coef (spx_word16_t x, spx_word16_t interp[4])
{
  /* Compute interpolation coefficients. I'm not sure whether this corresponds to cubic interpolation
     but I know it's MMSE-optimal on a sinc */
  spx_word16_t x2, x3;
  x2 = MULT16_16_P15 (x, x);
  x3 = MULT16_16_P15 (x, x2);
  interp[0] =
      PSHR32 (MULT16_16 (QCONST16 (-0.16667f, 15),
          x) + MULT16_16 (QCONST16 (0.16667f, 15), x3), 15);
  interp[1] =
      EXTRACT16 (EXTEND32 (x) + SHR32 (SUB32 (EXTEND32 (x2), EXTEND32 (x3)),
          1));
  interp[3] =
      PSHR32 (MULT16_16 (QCONST16 (-0.33333f, 15),
          x) + MULT16_16 (QCONST16 (.5f, 15),
          x2) - MULT16_16 (QCONST16 (0.16667f, 15), x3), 15);
  /* Just to make sure we don't have rounding problems */
  interp[2] = Q15_ONE - interp[0] - interp[1] - interp[3];
  if (interp[2] < 32767)
    interp[2] += 1;
}
#else
static void
cubic_coef (spx_word16_t frac, spx_word16_t interp[4])
{
  /* Compute interpolation coefficients. I'm not sure whether this corresponds to cubic interpolation
     but I know it's MMSE-optimal on a sinc */
  interp[0] = -0.16667f * frac + 0.16667f * frac * frac * frac;
  interp[1] = frac + 0.5f * frac * frac - 0.5f * frac * frac * frac;
  /*interp[2] = 1.f - 0.5f*frac - frac*frac + 0.5f*frac*frac*frac; */
  interp[3] =
      -0.33333f * frac + 0.5f * frac * frac - 0.16667f * frac * frac * frac;
  /* Just to make sure we don't have rounding problems */
  interp[2] = 1. - interp[0] - interp[1] - interp[3];
}
#endif

#ifndef DOUBLE_PRECISION
static int
resampler_basic_direct_single (SpeexResamplerState * st,
    spx_uint32_t channel_index, const spx_word16_t * in, spx_uint32_t * in_len,
    spx_word16_t * out, spx_uint32_t * out_len)
{
  const int N = st->filt_len;
  int out_sample = 0;
  int last_sample = st->last_sample[channel_index];
  spx_uint32_t samp_frac_num = st->samp_frac_num[channel_index];
  const spx_word16_t *sinc_table = st->sinc_table;
  const int out_stride = st->out_stride;
  const int int_advance = st->int_advance;
  const int frac_advance = st->frac_advance;
  const spx_uint32_t den_rate = st->den_rate;
  spx_word32_t sum;
  int j;

  while (!(last_sample >= (spx_int32_t) * in_len
          || out_sample >= (spx_int32_t) * out_len)) {
    const spx_word16_t *sinc = &sinc_table[samp_frac_num * N];
    const spx_word16_t *iptr = &in[last_sample];

    SSE_FALLBACK (INNER_PRODUCT_SINGLE)
        NEON_FALLBACK (INNER_PRODUCT_SINGLE)
        sum = 0;
    for (j = 0; j < N; j++)
      sum += MULT16_16 (sinc[j], iptr[j]);

/*    This code is slower on most DSPs which have only 2 accumulators.
      Plus this forces truncation to 32 bits and you lose the HW guard bits.
      I think we can trust the compiler and let it vectorize and/or unroll itself.
      spx_word32_t accum[4] = {0,0,0,0};
      for(j=0;j<N;j+=4) {
        accum[0] += MULT16_16(sinc[j], iptr[j]);
        accum[1] += MULT16_16(sinc[j+1], iptr[j+1]);
        accum[2] += MULT16_16(sinc[j+2], iptr[j+2]);
        accum[3] += MULT16_16(sinc[j+3], iptr[j+3]);
      }
      sum = accum[0] + accum[1] + accum[2] + accum[3];
*/
#if defined(OVERRIDE_INNER_PRODUCT_SINGLE) && defined(_USE_NEON)
    NEON_IMPLEMENTATION (INNER_PRODUCT_SINGLE)
        sum = inner_product_single (sinc, iptr, N);
    NEON_END (INNER_PRODUCT_SINGLE)
#elif defined(OVERRIDE_INNER_PRODUCT_SINGLE) && defined(_USE_SSE)
    SSE_IMPLEMENTATION (INNER_PRODUCT_SINGLE)
        sum = inner_product_single (sinc, iptr, N);
    SSE_END (INNER_PRODUCT_SINGLE)
#endif
        out[out_stride * out_sample++] = SATURATE32PSHR (sum, 15, 32767);
    last_sample += int_advance;
    samp_frac_num += frac_advance;
    if (samp_frac_num >= den_rate) {
      samp_frac_num -= den_rate;
      last_sample++;
    }
  }

  st->last_sample[channel_index] = last_sample;
  st->samp_frac_num[channel_index] = samp_frac_num;
  return out_sample;
}
#endif

#ifdef FIXED_POINT
#else
/* This is the same as the previous function, except with a double-precision accumulator */
static int
resampler_basic_direct_double (SpeexResamplerState * st,
    spx_uint32_t channel_index, const spx_word16_t * in, spx_uint32_t * in_len,
    spx_word16_t * out, spx_uint32_t * out_len)
{
  const int N = st->filt_len;
  int out_sample = 0;
  int last_sample = st->last_sample[channel_index];
  spx_uint32_t samp_frac_num = st->samp_frac_num[channel_index];
  const spx_word16_t *sinc_table = st->sinc_table;
  const int out_stride = st->out_stride;
  const int int_advance = st->int_advance;
  const int frac_advance = st->frac_advance;
  const spx_uint32_t den_rate = st->den_rate;
  double sum;
  int j;

  while (!(last_sample >= (spx_int32_t) * in_len
          || out_sample >= (spx_int32_t) * out_len)) {
    const spx_word16_t *sinc = &sinc_table[samp_frac_num * N];
    const spx_word16_t *iptr = &in[last_sample];

    SSE2_FALLBACK (INNER_PRODUCT_DOUBLE)
    double accum[4] = { 0, 0, 0, 0 };

    for (j = 0; j < N; j += 4) {
      accum[0] += sinc[j] * iptr[j];
      accum[1] += sinc[j + 1] * iptr[j + 1];
      accum[2] += sinc[j + 2] * iptr[j + 2];
      accum[3] += sinc[j + 3] * iptr[j + 3];
    }
    sum = accum[0] + accum[1] + accum[2] + accum[3];
#if defined(OVERRIDE_INNER_PRODUCT_DOUBLE) && defined(_USE_SSE2)
    SSE2_IMPLEMENTATION (INNER_PRODUCT_DOUBLE)
        sum = inner_product_double (sinc, iptr, N);
    SSE2_END (INNER_PRODUCT_DOUBLE)
#endif
        out[out_stride * out_sample++] = PSHR32 (sum, 15);
    last_sample += int_advance;
    samp_frac_num += frac_advance;
    if (samp_frac_num >= den_rate) {
      samp_frac_num -= den_rate;
      last_sample++;
    }
  }

  st->last_sample[channel_index] = last_sample;
  st->samp_frac_num[channel_index] = samp_frac_num;
  return out_sample;
}
#endif

#ifndef DOUBLE_PRECISION
static int
resampler_basic_interpolate_single (SpeexResamplerState * st,
    spx_uint32_t channel_index, const spx_word16_t * in, spx_uint32_t * in_len,
    spx_word16_t * out, spx_uint32_t * out_len)
{
  const int N = st->filt_len;
  int out_sample = 0;
  int last_sample = st->last_sample[channel_index];
  spx_uint32_t samp_frac_num = st->samp_frac_num[channel_index];
  const int out_stride = st->out_stride;
  const int int_advance = st->int_advance;
  const int frac_advance = st->frac_advance;
  const spx_uint32_t den_rate = st->den_rate;
  int j;
  spx_word32_t sum;

  while (!(last_sample >= (spx_int32_t) * in_len
          || out_sample >= (spx_int32_t) * out_len)) {
    const spx_word16_t *iptr = &in[last_sample];

    const int offset = samp_frac_num * st->oversample / st->den_rate;
#ifdef FIXED_POINT
    const spx_word16_t frac =
        ((((gint64) samp_frac_num * (gint64) st->oversample) % st->den_rate)
        << 15) / st->den_rate;
#else
    const spx_word16_t frac =
        ((float) ((samp_frac_num * st->oversample) % st->den_rate)) /
        st->den_rate;
#endif
    spx_word16_t interp[4];


    SSE_FALLBACK (INTERPOLATE_PRODUCT_SINGLE)
    spx_word32_t accum[4] = { 0, 0, 0, 0 };

    for (j = 0; j < N; j++) {
      const spx_word16_t curr_in = iptr[j];
      accum[0] +=
          MULT16_16 (curr_in,
          st->sinc_table[4 + (j + 1) * st->oversample - offset - 2]);
      accum[1] +=
          MULT16_16 (curr_in,
          st->sinc_table[4 + (j + 1) * st->oversample - offset - 1]);
      accum[2] +=
          MULT16_16 (curr_in,
          st->sinc_table[4 + (j + 1) * st->oversample - offset]);
      accum[3] +=
          MULT16_16 (curr_in,
          st->sinc_table[4 + (j + 1) * st->oversample - offset + 1]);
    }

    cubic_coef (frac, interp);
    sum =
        MULT16_32_Q15 (interp[0], SHR32 (accum[0],
            1)) + MULT16_32_Q15 (interp[1], SHR32 (accum[1],
            1)) + MULT16_32_Q15 (interp[2], SHR32 (accum[2],
            1)) + MULT16_32_Q15 (interp[3], SHR32 (accum[3], 1));
#if defined(OVERRIDE_INTERPOLATE_PRODUCT_SINGLE) && defined(_USE_SSE)
    SSE_IMPLEMENTATION (INTERPOLATE_PRODUCT_SINGLE)
        cubic_coef (frac, interp);
    sum =
        interpolate_product_single (iptr,
        st->sinc_table + st->oversample + 4 - offset - 2, N, st->oversample,
        interp);
    SSE_END (INTERPOLATE_PRODUCT_SINGLE)
#endif
        out[out_stride * out_sample++] = SATURATE32PSHR (sum, 14, 32767);
    last_sample += int_advance;
    samp_frac_num += frac_advance;
    if (samp_frac_num >= den_rate) {
      samp_frac_num -= den_rate;
      last_sample++;
    }
  }

  st->last_sample[channel_index] = last_sample;
  st->samp_frac_num[channel_index] = samp_frac_num;
  return out_sample;
}
#endif

#ifdef FIXED_POINT
#else
/* This is the same as the previous function, except with a double-precision accumulator */
static int
resampler_basic_interpolate_double (SpeexResamplerState * st,
    spx_uint32_t channel_index, const spx_word16_t * in, spx_uint32_t * in_len,
    spx_word16_t * out, spx_uint32_t * out_len)
{
  const int N = st->filt_len;
  int out_sample = 0;
  int last_sample = st->last_sample[channel_index];
  spx_uint32_t samp_frac_num = st->samp_frac_num[channel_index];
  const int out_stride = st->out_stride;
  const int int_advance = st->int_advance;
  const int frac_advance = st->frac_advance;
  const spx_uint32_t den_rate = st->den_rate;
  int j;
  spx_word32_t sum;

  while (!(last_sample >= (spx_int32_t) * in_len
          || out_sample >= (spx_int32_t) * out_len)) {
    const spx_word16_t *iptr = &in[last_sample];

    const int offset = samp_frac_num * st->oversample / st->den_rate;
#ifdef FIXED_POINT
    const spx_word16_t frac =
        PDIV32 (SHL32 ((samp_frac_num * st->oversample) % st->den_rate, 15),
        st->den_rate);
#else
#ifdef DOUBLE_PRECISION
    const spx_word16_t frac =
        ((double) ((samp_frac_num * st->oversample) % st->den_rate)) /
        st->den_rate;
#else
    const spx_word16_t frac =
        ((float) ((samp_frac_num * st->oversample) % st->den_rate)) /
        st->den_rate;
#endif
#endif
    spx_word16_t interp[4];


    SSE2_FALLBACK (INTERPOLATE_PRODUCT_DOUBLE)
    double accum[4] = { 0, 0, 0, 0 };

    for (j = 0; j < N; j++) {
      const double curr_in = iptr[j];
      accum[0] +=
          MULT16_16 (curr_in,
          st->sinc_table[4 + (j + 1) * st->oversample - offset - 2]);
      accum[1] +=
          MULT16_16 (curr_in,
          st->sinc_table[4 + (j + 1) * st->oversample - offset - 1]);
      accum[2] +=
          MULT16_16 (curr_in,
          st->sinc_table[4 + (j + 1) * st->oversample - offset]);
      accum[3] +=
          MULT16_16 (curr_in,
          st->sinc_table[4 + (j + 1) * st->oversample - offset + 1]);
    }

    cubic_coef (frac, interp);
    sum =
        MULT16_32_Q15 (interp[0], accum[0]) + MULT16_32_Q15 (interp[1],
        accum[1]) + MULT16_32_Q15 (interp[2],
        accum[2]) + MULT16_32_Q15 (interp[3], accum[3]);
#if defined(OVERRIDE_INTERPOLATE_PRODUCT_DOUBLE) && defined(_USE_SSE2)
    SSE2_IMPLEMENTATION (INTERPOLATE_PRODUCT_DOUBLE)
        cubic_coef (frac, interp);
    sum =
        interpolate_product_double (iptr,
        st->sinc_table + st->oversample + 4 - offset - 2, N, st->oversample,
        interp);
    SSE2_END (INTERPOLATE_PRODUCT_DOUBLE)
#endif
        out[out_stride * out_sample++] = PSHR32 (sum, 15);
    last_sample += int_advance;
    samp_frac_num += frac_advance;
    if (samp_frac_num >= den_rate) {
      samp_frac_num -= den_rate;
      last_sample++;
    }
  }

  st->last_sample[channel_index] = last_sample;
  st->samp_frac_num[channel_index] = samp_frac_num;
  return out_sample;
}
#endif

static void
update_filter (SpeexResamplerState * st)
{
  spx_uint32_t old_length;

  old_length = st->filt_len;
  st->oversample = quality_map[st->quality].oversample;
  st->filt_len = quality_map[st->quality].base_length;

  if (st->num_rate > st->den_rate) {
    /* down-sampling */
    st->cutoff =
        quality_map[st->quality].downsample_bandwidth * st->den_rate /
        st->num_rate;
    /* FIXME: divide the numerator and denominator by a certain amount if they're too large */
    st->filt_len = st->filt_len * st->num_rate / st->den_rate;
    /* Round down to make sure we have a multiple of 4 */
    st->filt_len &= (~0x3);
    if (2 * st->den_rate < st->num_rate)
      st->oversample >>= 1;
    if (4 * st->den_rate < st->num_rate)
      st->oversample >>= 1;
    if (8 * st->den_rate < st->num_rate)
      st->oversample >>= 1;
    if (16 * st->den_rate < st->num_rate)
      st->oversample >>= 1;
    if (st->oversample < 1)
      st->oversample = 1;
  } else {
    /* up-sampling */
    st->cutoff = quality_map[st->quality].upsample_bandwidth;
  }

  /* Choose the resampling type that requires the least amount of memory */
  /* Or if the full sinc table is explicitely requested, use that */
  if (st->use_full_sinc_table || (st->den_rate <= st->oversample)) {
    spx_uint32_t i;
    if (!st->sinc_table)
      st->sinc_table =
          (spx_word16_t *) speex_alloc (st->filt_len * st->den_rate *
          sizeof (spx_word16_t));
    else if (st->sinc_table_length < st->filt_len * st->den_rate) {
      st->sinc_table =
          (spx_word16_t *) speex_realloc (st->sinc_table,
          st->filt_len * st->den_rate * sizeof (spx_word16_t));
      st->sinc_table_length = st->filt_len * st->den_rate;
    }
    for (i = 0; i < st->den_rate; i++) {
      spx_int32_t j;
      for (j = 0; j < st->filt_len; j++) {
        st->sinc_table[i * st->filt_len + j] =
            sinc (st->cutoff, ((j - (spx_int32_t) st->filt_len / 2 + 1) -
#ifdef DOUBLE_PRECISION
                ((double) i) / st->den_rate), st->filt_len,
#else
                ((float) i) / st->den_rate), st->filt_len,
#endif
            quality_map[st->quality].window_func);
      }
    }
#ifdef FIXED_POINT
    st->resampler_ptr = resampler_basic_direct_single;
#else
#ifdef DOUBLE_PRECISION
    st->resampler_ptr = resampler_basic_direct_double;
#else
    if (st->quality > 8)
      st->resampler_ptr = resampler_basic_direct_double;
    else
      st->resampler_ptr = resampler_basic_direct_single;
#endif
#endif
    /*fprintf (stderr, "resampler uses direct sinc table and normalised cutoff %f\n", cutoff); */
  } else {
    spx_int32_t i;
    if (!st->sinc_table)
      st->sinc_table =
          (spx_word16_t *) speex_alloc ((st->filt_len * st->oversample +
              8) * sizeof (spx_word16_t));
    else if (st->sinc_table_length < st->filt_len * st->oversample + 8) {
      st->sinc_table =
          (spx_word16_t *) speex_realloc (st->sinc_table,
          (st->filt_len * st->oversample + 8) * sizeof (spx_word16_t));
      st->sinc_table_length = st->filt_len * st->oversample + 8;
    }
    for (i = -4; i < (spx_int32_t) (st->oversample * st->filt_len + 4); i++)
      st->sinc_table[i + 4] =
#ifdef DOUBLE_PRECISION
          sinc (st->cutoff, (i / (double) st->oversample - st->filt_len / 2),
#else
          sinc (st->cutoff, (i / (float) st->oversample - st->filt_len / 2),
#endif
          st->filt_len, quality_map[st->quality].window_func);
#ifdef FIXED_POINT
    st->resampler_ptr = resampler_basic_interpolate_single;
#else
#ifdef DOUBLE_PRECISION
    st->resampler_ptr = resampler_basic_interpolate_double;
#else
    if (st->quality > 8)
      st->resampler_ptr = resampler_basic_interpolate_double;
    else
      st->resampler_ptr = resampler_basic_interpolate_single;
#endif
#endif
    /*fprintf (stderr, "resampler uses interpolated sinc table and normalised cutoff %f\n", cutoff); */
  }
  st->int_advance = st->num_rate / st->den_rate;
  st->frac_advance = st->num_rate % st->den_rate;


  /* Here's the place where we update the filter memory to take into account
     the change in filter length. It's probably the messiest part of the code
     due to handling of lots of corner cases. */
  if (!st->mem) {
    spx_uint32_t i;
    st->mem_alloc_size = st->filt_len - 1 + st->buffer_size;
    st->mem =
        (spx_word16_t *) speex_alloc (st->nb_channels * st->mem_alloc_size *
        sizeof (spx_word16_t));
    for (i = 0; i < st->nb_channels * st->mem_alloc_size; i++)
      st->mem[i] = 0;
    /*speex_warning("init filter"); */
  } else if (!st->started) {
    spx_uint32_t i;
    st->mem_alloc_size = st->filt_len - 1 + st->buffer_size;
    st->mem =
        (spx_word16_t *) speex_realloc (st->mem,
        st->nb_channels * st->mem_alloc_size * sizeof (spx_word16_t));
    for (i = 0; i < st->nb_channels * st->mem_alloc_size; i++)
      st->mem[i] = 0;
    /*speex_warning("reinit filter"); */
  } else if (st->filt_len > old_length) {
    spx_int32_t i;
    /* Increase the filter length */
    /*speex_warning("increase filter size"); */
    int old_alloc_size = st->mem_alloc_size;
    if ((st->filt_len - 1 + st->buffer_size) > st->mem_alloc_size) {
      st->mem_alloc_size = st->filt_len - 1 + st->buffer_size;
      st->mem =
          (spx_word16_t *) speex_realloc (st->mem,
          st->nb_channels * st->mem_alloc_size * sizeof (spx_word16_t));
    }
    for (i = st->nb_channels - 1; i >= 0; i--) {
      spx_int32_t j;
      spx_uint32_t olen = old_length;
      /*if (st->magic_samples[i]) */
      {
        /* Try and remove the magic samples as if nothing had happened */

        /* FIXME: This is wrong but for now we need it to avoid going over the array bounds */
        olen = old_length + 2 * st->magic_samples[i];
        for (j = old_length - 2 + st->magic_samples[i]; j >= 0; j--)
          st->mem[i * st->mem_alloc_size + j + st->magic_samples[i]] =
              st->mem[i * old_alloc_size + j];
        for (j = 0; j < st->magic_samples[i]; j++)
          st->mem[i * st->mem_alloc_size + j] = 0;
        st->magic_samples[i] = 0;
      }
      if (st->filt_len > olen) {
        /* If the new filter length is still bigger than the "augmented" length */
        /* Copy data going backward */
        for (j = 0; j < olen - 1; j++)
          st->mem[i * st->mem_alloc_size + (st->filt_len - 2 - j)] =
              st->mem[i * st->mem_alloc_size + (olen - 2 - j)];
        /* Then put zeros for lack of anything better */
        for (; j < st->filt_len - 1; j++)
          st->mem[i * st->mem_alloc_size + (st->filt_len - 2 - j)] = 0;
        /* Adjust last_sample */
        st->last_sample[i] += (st->filt_len - olen) / 2;
      } else {
        /* Put back some of the magic! */
        st->magic_samples[i] = (olen - st->filt_len) / 2;
        for (j = 0; j < st->filt_len - 1 + st->magic_samples[i]; j++)
          st->mem[i * st->mem_alloc_size + j] =
              st->mem[i * st->mem_alloc_size + j + st->magic_samples[i]];
      }
    }
  } else if (st->filt_len < old_length) {
    spx_uint32_t i;
    /* Reduce filter length, this a bit tricky. We need to store some of the memory as "magic"
       samples so they can be used directly as input the next time(s) */
    for (i = 0; i < st->nb_channels; i++) {
      spx_uint32_t j;
      spx_uint32_t old_magic = st->magic_samples[i];
      st->magic_samples[i] = (old_length - st->filt_len) / 2;
      /* We must copy some of the memory that's no longer used */
      /* Copy data going backward */
      for (j = 0; j < st->filt_len - 1 + st->magic_samples[i] + old_magic; j++)
        st->mem[i * st->mem_alloc_size + j] =
            st->mem[i * st->mem_alloc_size + j + st->magic_samples[i]];
      st->magic_samples[i] += old_magic;
    }
  }

}

EXPORT SpeexResamplerState *
speex_resampler_init (spx_uint32_t nb_channels, spx_uint32_t in_rate,
    spx_uint32_t out_rate, int quality,
    SpeexResamplerSincFilterMode sinc_filter_mode,
    spx_uint32_t sinc_filter_auto_threshold, int *err)
{
  return speex_resampler_init_frac (nb_channels, in_rate, out_rate, in_rate,
      out_rate, quality, sinc_filter_mode, sinc_filter_auto_threshold, err);
}

#if defined HAVE_ORC && !defined DISABLE_ORC
static void
check_insn_set (SpeexResamplerState * st, const char *name)
{
  if (!name)
    return;
#ifdef _USE_SSE
  if (!strcmp (name, "sse"))
    st->use_sse = 1;
#endif
#ifdef _USE_SSE2
  if (!strcmp (name, "sse2"))
    st->use_sse = st->use_sse2 = 1;
#endif
#ifdef _USE_NEON
  if (!strcmp (name, "neon"))
    st->use_neon = 1;
#endif
}
#endif

EXPORT SpeexResamplerState *
speex_resampler_init_frac (spx_uint32_t nb_channels, spx_uint32_t ratio_num,
    spx_uint32_t ratio_den, spx_uint32_t in_rate, spx_uint32_t out_rate,
    int quality, SpeexResamplerSincFilterMode sinc_filter_mode,
    spx_uint32_t sinc_filter_auto_threshold, int *err)
{
  spx_uint32_t i;
  SpeexResamplerState *st;
  int use_full_sinc_table = 0;
  if (quality > 10 || quality < 0) {
    if (err)
      *err = RESAMPLER_ERR_INVALID_ARG;
    return NULL;
  }
  if (ratio_den == 0) {
    if (err)
      *err = RESAMPLER_ERR_INVALID_ARG;
    return NULL;
  }
  switch (sinc_filter_mode) {
    case RESAMPLER_SINC_FILTER_INTERPOLATED:
      use_full_sinc_table = 0;
      break;
    case RESAMPLER_SINC_FILTER_FULL:
      use_full_sinc_table = 1;
      break;
    case RESAMPLER_SINC_FILTER_AUTO:
      /* Handled below */
      break;
    default:
      if (err)
        *err = RESAMPLER_ERR_INVALID_ARG;
      return NULL;
  }

  st = (SpeexResamplerState *) speex_alloc (sizeof (SpeexResamplerState));
  st->initialised = 0;
  st->started = 0;
  st->in_rate = 0;
  st->out_rate = 0;
  st->num_rate = 0;
  st->den_rate = 0;
  st->quality = -1;
  st->sinc_table_length = 0;
  st->mem_alloc_size = 0;
  st->filt_len = 0;
  st->mem = 0;
  st->resampler_ptr = 0;
  st->use_full_sinc_table = use_full_sinc_table;

  st->cutoff = 1.f;
  st->nb_channels = nb_channels;
  st->in_stride = 1;
  st->out_stride = 1;

#ifdef FIXED_POINT
  st->buffer_size = 160;
#else
  st->buffer_size = 160;
#endif

  st->use_sse = st->use_sse2 = 0;
  st->use_neon = 0;
#if defined HAVE_ORC && !defined DISABLE_ORC
  orc_init ();
  {
    OrcTarget *target = orc_target_get_default ();
    if (target) {
      unsigned int flags = orc_target_get_default_flags (target);
      check_insn_set (st, orc_target_get_name (target));
      for (i = 0; i < 32; ++i) {
        if (flags & (1U << i)) {
          check_insn_set (st, orc_target_get_flag_name (target, i));
        }
      }
    }
  }
#endif

  /* Per channel data */
  st->last_sample = (spx_int32_t *) speex_alloc (nb_channels * sizeof (int));
  st->magic_samples = (spx_uint32_t *) speex_alloc (nb_channels * sizeof (int));
  st->samp_frac_num = (spx_uint32_t *) speex_alloc (nb_channels * sizeof (int));
  for (i = 0; i < nb_channels; i++) {
    st->last_sample[i] = 0;
    st->magic_samples[i] = 0;
    st->samp_frac_num[i] = 0;
  }

  speex_resampler_set_quality (st, quality);
  speex_resampler_set_rate_frac (st, ratio_num, ratio_den, in_rate, out_rate);

  if (sinc_filter_mode == RESAMPLER_SINC_FILTER_AUTO) {
    /*
       Estimate how big the filter table would become if the full mode were to be used
       calculations used correspond to the ones in update_filter()
       if the size is bigger than the threshold, use interpolated sinc instead
     */
    spx_uint32_t base_filter_length = st->filt_len =
        quality_map[st->quality].base_length;
    spx_uint32_t filter_table_size =
        base_filter_length * st->den_rate * sizeof (spx_uint16_t);
    st->use_full_sinc_table =
        (filter_table_size > sinc_filter_auto_threshold) ? 0 : 1;
  }

  update_filter (st);

  st->initialised = 1;
  if (err)
    *err = RESAMPLER_ERR_SUCCESS;

  return st;
}

EXPORT void
speex_resampler_destroy (SpeexResamplerState * st)
{
  speex_free (st->mem);
  speex_free (st->sinc_table);
  speex_free (st->last_sample);
  speex_free (st->magic_samples);
  speex_free (st->samp_frac_num);
  speex_free (st);
}

static int
speex_resampler_process_native (SpeexResamplerState * st,
    spx_uint32_t channel_index, spx_uint32_t * in_len, spx_word16_t * out,
    spx_uint32_t * out_len)
{
  int j = 0;
  const int N = st->filt_len;
  int out_sample = 0;
  spx_word16_t *mem = st->mem + channel_index * st->mem_alloc_size;
  spx_uint32_t ilen;

  st->started = 1;

  /* Call the right resampler through the function ptr */
  out_sample = st->resampler_ptr (st, channel_index, mem, in_len, out, out_len);

  if (st->last_sample[channel_index] < (spx_int32_t) * in_len)
    *in_len = st->last_sample[channel_index];
  *out_len = out_sample;
  st->last_sample[channel_index] -= *in_len;

  ilen = *in_len;

  for (j = 0; j < N - 1; ++j)
    mem[j] = mem[j + ilen];

  return RESAMPLER_ERR_SUCCESS;
}

static int
speex_resampler_magic (SpeexResamplerState * st, spx_uint32_t channel_index,
    spx_word16_t ** out, spx_uint32_t out_len)
{
  spx_uint32_t tmp_in_len = st->magic_samples[channel_index];
  spx_word16_t *mem = st->mem + channel_index * st->mem_alloc_size;
  const int N = st->filt_len;

  speex_resampler_process_native (st, channel_index, &tmp_in_len, *out,
      &out_len);

  st->magic_samples[channel_index] -= tmp_in_len;

  /* If we couldn't process all "magic" input samples, save the rest for next time */
  if (st->magic_samples[channel_index]) {
    spx_uint32_t i;
    for (i = 0; i < st->magic_samples[channel_index]; i++)
      mem[N - 1 + i] = mem[N - 1 + i + tmp_in_len];
  }
  *out += out_len * st->out_stride;
  return out_len;
}

#ifdef FIXED_POINT
EXPORT int
speex_resampler_process_int (SpeexResamplerState * st,
    spx_uint32_t channel_index, const spx_int16_t * in, spx_uint32_t * in_len,
    spx_int16_t * out, spx_uint32_t * out_len)
#else
#ifdef DOUBLE_PRECISION
EXPORT int
speex_resampler_process_float (SpeexResamplerState * st,
    spx_uint32_t channel_index, const double *in, spx_uint32_t * in_len,
    double *out, spx_uint32_t * out_len)
#else
EXPORT int
speex_resampler_process_float (SpeexResamplerState * st,
    spx_uint32_t channel_index, const float *in, spx_uint32_t * in_len,
    float *out, spx_uint32_t * out_len)
#endif
#endif
{
  int j;
  spx_uint32_t ilen = *in_len;
  spx_uint32_t olen = *out_len;
  spx_word16_t *x = st->mem + channel_index * st->mem_alloc_size;
  const int filt_offs = st->filt_len - 1;
  const spx_uint32_t xlen = st->mem_alloc_size - filt_offs;
  const int istride = st->in_stride;

  if (st->magic_samples[channel_index])
    olen -= speex_resampler_magic (st, channel_index, &out, olen);
  if (!st->magic_samples[channel_index]) {
    while (ilen) {
      spx_uint32_t ichunk = (ilen > xlen) ? xlen : ilen;
      spx_uint32_t ochunk = olen;

      if (in) {
        for (j = 0; j < ichunk; ++j)
          x[j + filt_offs] = in[j * istride];
      } else {
        for (j = 0; j < ichunk; ++j)
          x[j + filt_offs] = 0;
      }
      speex_resampler_process_native (st, channel_index, &ichunk, out, &ochunk);
      ilen -= ichunk;
      olen -= ochunk;
      out += ochunk * st->out_stride;
      if (in)
        in += ichunk * istride;
      if (olen == 0 && ichunk == 0)
        break;
    }
  }
  *in_len -= ilen;
  *out_len -= olen;
  return RESAMPLER_ERR_SUCCESS;
}

#ifdef FIXED_POINT
EXPORT int
speex_resampler_process_float (SpeexResamplerState * st,
    spx_uint32_t channel_index, const float *in, spx_uint32_t * in_len,
    float *out, spx_uint32_t * out_len)
#else
EXPORT int
speex_resampler_process_int (SpeexResamplerState * st,
    spx_uint32_t channel_index, const spx_int16_t * in, spx_uint32_t * in_len,
    spx_int16_t * out, spx_uint32_t * out_len)
#endif
{
  int j;
  const int istride_save = st->in_stride;
  const int ostride_save = st->out_stride;
  spx_uint32_t ilen = *in_len;
  spx_uint32_t olen = *out_len;
  spx_word16_t *x = st->mem + channel_index * st->mem_alloc_size;
  const spx_uint32_t xlen = st->mem_alloc_size - (st->filt_len - 1);
#ifdef VAR_ARRAYS
  const unsigned int ylen =
      (olen < FIXED_STACK_ALLOC) ? olen : FIXED_STACK_ALLOC;
  VARDECL (spx_word16_t * ystack);
  ALLOC (ystack, ylen, spx_word16_t);
#else
  const unsigned int ylen = FIXED_STACK_ALLOC;
  spx_word16_t ystack[FIXED_STACK_ALLOC];
#endif

  st->out_stride = 1;

  while (ilen) {
    spx_word16_t *y = ystack;
    spx_uint32_t ichunk = (ilen > xlen) ? xlen : ilen;
    spx_uint32_t ochunk = (olen > ylen) ? ylen : olen;
    spx_uint32_t omagic = 0;

    if (st->magic_samples[channel_index]) {
      omagic = speex_resampler_magic (st, channel_index, &y, ochunk);
      ochunk -= omagic;
      olen -= omagic;
    }
    if (!st->magic_samples[channel_index]) {
      if (in) {
        for (j = 0; j < ichunk; ++j)
#ifdef FIXED_POINT
          x[j + st->filt_len - 1] = WORD2INT (in[j * istride_save]);
#else
          x[j + st->filt_len - 1] = in[j * istride_save];
#endif
      } else {
        for (j = 0; j < ichunk; ++j)
          x[j + st->filt_len - 1] = 0;
      }

      speex_resampler_process_native (st, channel_index, &ichunk, y, &ochunk);
    } else {
      ichunk = 0;
      ochunk = 0;
    }

    for (j = 0; j < ochunk + omagic; ++j)
#ifdef FIXED_POINT
      out[j * ostride_save] = ystack[j];
#else
      out[j * ostride_save] = WORD2INT (ystack[j]);
#endif

    ilen -= ichunk;
    olen -= ochunk;
    out += (ochunk + omagic) * ostride_save;
    if (in)
      in += ichunk * istride_save;
    if (olen == 0 && ichunk == 0)
      break;
  }
  st->out_stride = ostride_save;
  *in_len -= ilen;
  *out_len -= olen;

  return RESAMPLER_ERR_SUCCESS;
}

#ifdef DOUBLE_PRECISION
EXPORT int
speex_resampler_process_interleaved_float (SpeexResamplerState * st,
    const double *in, spx_uint32_t * in_len, double *out,
    spx_uint32_t * out_len)
#else
EXPORT int
speex_resampler_process_interleaved_float (SpeexResamplerState * st,
    const float *in, spx_uint32_t * in_len, float *out, spx_uint32_t * out_len)
#endif
{
  spx_uint32_t i;
  int istride_save, ostride_save;
  spx_uint32_t bak_len = *out_len;
  istride_save = st->in_stride;
  ostride_save = st->out_stride;
  st->in_stride = st->out_stride = st->nb_channels;
  for (i = 0; i < st->nb_channels; i++) {
    *out_len = bak_len;
    if (in != NULL)
      speex_resampler_process_float (st, i, in + i, in_len, out + i, out_len);
    else
      speex_resampler_process_float (st, i, NULL, in_len, out + i, out_len);
  }
  st->in_stride = istride_save;
  st->out_stride = ostride_save;
  return RESAMPLER_ERR_SUCCESS;
}

EXPORT int
speex_resampler_process_interleaved_int (SpeexResamplerState * st,
    const spx_int16_t * in, spx_uint32_t * in_len, spx_int16_t * out,
    spx_uint32_t * out_len)
{
  spx_uint32_t i;
  int istride_save, ostride_save;
  spx_uint32_t bak_len = *out_len;
  istride_save = st->in_stride;
  ostride_save = st->out_stride;
  st->in_stride = st->out_stride = st->nb_channels;
  for (i = 0; i < st->nb_channels; i++) {
    *out_len = bak_len;
    if (in != NULL)
      speex_resampler_process_int (st, i, in + i, in_len, out + i, out_len);
    else
      speex_resampler_process_int (st, i, NULL, in_len, out + i, out_len);
  }
  st->in_stride = istride_save;
  st->out_stride = ostride_save;
  return RESAMPLER_ERR_SUCCESS;
}

EXPORT int
speex_resampler_set_rate (SpeexResamplerState * st, spx_uint32_t in_rate,
    spx_uint32_t out_rate)
{
  return speex_resampler_set_rate_frac (st, in_rate, out_rate, in_rate,
      out_rate);
}

EXPORT void
speex_resampler_get_rate (SpeexResamplerState * st, spx_uint32_t * in_rate,
    spx_uint32_t * out_rate)
{
  *in_rate = st->in_rate;
  *out_rate = st->out_rate;
}

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 (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;
  /* FIXME: This is terribly inefficient, but who cares (at least for now)? */
  for (fact = 2; fact <= IMIN (st->num_rate, st->den_rate); fact++) {
    while ((st->num_rate % fact == 0) && (st->den_rate % fact == 0)) {
      st->num_rate /= fact;
      st->den_rate /= fact;
    }
  }

  if (old_den > 0) {
    for (i = 0; i < st->nb_channels; i++) {
      st->samp_frac_num[i] =
          (gint64) st->samp_frac_num[i] * (gint64) st->den_rate / old_den;
      /* Safety net */
      if (st->samp_frac_num[i] >= st->den_rate)
        st->samp_frac_num[i] = st->den_rate - 1;
    }
  }

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

EXPORT void
speex_resampler_get_ratio (SpeexResamplerState * st, spx_uint32_t * ratio_num,
    spx_uint32_t * ratio_den)
{
  *ratio_num = st->num_rate;
  *ratio_den = st->den_rate;
}

EXPORT int
speex_resampler_set_quality (SpeexResamplerState * st, int quality)
{
  if (quality > 10 || quality < 0)
    return RESAMPLER_ERR_INVALID_ARG;
  if (st->quality == quality)
    return RESAMPLER_ERR_SUCCESS;
  st->quality = quality;
  if (st->initialised)
    update_filter (st);
  return RESAMPLER_ERR_SUCCESS;
}

EXPORT void
speex_resampler_get_quality (SpeexResamplerState * st, int *quality)
{
  *quality = st->quality;
}

EXPORT void
speex_resampler_set_input_stride (SpeexResamplerState * st, spx_uint32_t stride)
{
  st->in_stride = stride;
}

EXPORT void
speex_resampler_get_input_stride (SpeexResamplerState * st,
    spx_uint32_t * stride)
{
  *stride = st->in_stride;
}

EXPORT void
speex_resampler_set_output_stride (SpeexResamplerState * st,
    spx_uint32_t stride)
{
  st->out_stride = stride;
}

EXPORT void
speex_resampler_get_output_stride (SpeexResamplerState * st,
    spx_uint32_t * stride)
{
  *stride = st->out_stride;
}

EXPORT int
speex_resampler_get_input_latency (SpeexResamplerState * st)
{
  return st->filt_len / 2;
}

EXPORT int
speex_resampler_get_output_latency (SpeexResamplerState * st)
{
  return ((st->filt_len / 2) * st->den_rate +
      (st->num_rate >> 1)) / st->num_rate;
}

EXPORT int
speex_resampler_get_filt_len (SpeexResamplerState * st)
{
  return st->filt_len;
}

EXPORT int
speex_resampler_get_sinc_filter_mode (SpeexResamplerState * st)
{
  return st->use_full_sinc_table;
}

EXPORT int
speex_resampler_skip_zeros (SpeexResamplerState * st)
{
  spx_uint32_t i;
  for (i = 0; i < st->nb_channels; i++)
    st->last_sample[i] = st->filt_len / 2;
  return RESAMPLER_ERR_SUCCESS;
}

EXPORT int
speex_resampler_reset_mem (SpeexResamplerState * st)
{
  spx_uint32_t i;
  for (i = 0; i < st->nb_channels * (st->filt_len - 1); i++)
    st->mem[i] = 0;
  return RESAMPLER_ERR_SUCCESS;
}

EXPORT const char *
speex_resampler_strerror (int err)
{
  switch (err) {
    case RESAMPLER_ERR_SUCCESS:
      return "Success.";
    case RESAMPLER_ERR_ALLOC_FAILED:
      return "Memory allocation failed.";
    case RESAMPLER_ERR_BAD_STATE:
      return "Bad resampler state.";
    case RESAMPLER_ERR_INVALID_ARG:
      return "Invalid argument.";
    case RESAMPLER_ERR_PTR_OVERLAP:
      return "Input and output buffers overlap.";
    default:
      return "Unknown error. Bad error code or strange version mismatch.";
  }
}
