
/* audioopmodule - Module to detect peak values in arrays */

#define PY_SSIZE_T_CLEAN

#include "Python.h"

#if SIZEOF_INT == 4
typedef int Py_Int32;
typedef unsigned int Py_UInt32;
#else
#if SIZEOF_LONG == 4
typedef long Py_Int32;
typedef unsigned long Py_UInt32;
#else
#error "No 4-byte integral type"
#endif
#endif

typedef short PyInt16;

#if defined(__CHAR_UNSIGNED__)
#if defined(signed)
/* This module currently does not work on systems where only unsigned
   characters are available.  Take it out of Setup.  Sorry. */
#endif
#endif

/* Code shamelessly stolen from sox, 12.17.7, g711.c
** (c) Craig Reese, Joe Campbell and Jeff Poskanzer 1989 */

/* From g711.c:
 *
 * December 30, 1994:
 * Functions linear2alaw, linear2ulaw have been updated to correctly
 * convert unquantized 16 bit values.
 * Tables for direct u- to A-law and A- to u-law conversions have been
 * corrected.
 * Borge Lindberg, Center for PersonKommunikation, Aalborg University.
 * bli@cpk.auc.dk
 *
 */
#define BIAS 0x84   /* define the add-in bias for 16 bit samples */
#define CLIP 32635
#define SIGN_BIT        (0x80)          /* Sign bit for a A-law byte. */
#define QUANT_MASK      (0xf)           /* Quantization field mask. */
#define SEG_SHIFT       (4)             /* Left shift for segment number. */
#define SEG_MASK        (0x70)          /* Segment field mask. */

static PyInt16 seg_aend[8] = {0x1F, 0x3F, 0x7F, 0xFF,
                              0x1FF, 0x3FF, 0x7FF, 0xFFF};
static PyInt16 seg_uend[8] = {0x3F, 0x7F, 0xFF, 0x1FF,
                              0x3FF, 0x7FF, 0xFFF, 0x1FFF};

static PyInt16
search(PyInt16 val, PyInt16 *table, int size)
{
    int i;

    for (i = 0; i < size; i++) {
        if (val <= *table++)
            return (i);
    }
    return (size);
}
#define st_ulaw2linear16(uc) (_st_ulaw2linear16[uc])
#define st_alaw2linear16(uc) (_st_alaw2linear16[uc])

static PyInt16 _st_ulaw2linear16[256] = {
    -32124,  -31100,  -30076,  -29052,  -28028,  -27004,  -25980,
    -24956,  -23932,  -22908,  -21884,  -20860,  -19836,  -18812,
    -17788,  -16764,  -15996,  -15484,  -14972,  -14460,  -13948,
    -13436,  -12924,  -12412,  -11900,  -11388,  -10876,  -10364,
     -9852,   -9340,   -8828,   -8316,   -7932,   -7676,   -7420,
     -7164,   -6908,   -6652,   -6396,   -6140,   -5884,   -5628,
     -5372,   -5116,   -4860,   -4604,   -4348,   -4092,   -3900,
     -3772,   -3644,   -3516,   -3388,   -3260,   -3132,   -3004,
     -2876,   -2748,   -2620,   -2492,   -2364,   -2236,   -2108,
     -1980,   -1884,   -1820,   -1756,   -1692,   -1628,   -1564,
     -1500,   -1436,   -1372,   -1308,   -1244,   -1180,   -1116,
     -1052,    -988,    -924,    -876,    -844,    -812,    -780,
      -748,    -716,    -684,    -652,    -620,    -588,    -556,
      -524,    -492,    -460,    -428,    -396,    -372,    -356,
      -340,    -324,    -308,    -292,    -276,    -260,    -244,
      -228,    -212,    -196,    -180,    -164,    -148,    -132,
      -120,    -112,    -104,     -96,     -88,     -80,     -72,
       -64,     -56,     -48,     -40,     -32,     -24,     -16,
    -8,       0,   32124,   31100,   30076,   29052,   28028,
     27004,   25980,   24956,   23932,   22908,   21884,   20860,
     19836,   18812,   17788,   16764,   15996,   15484,   14972,
     14460,   13948,   13436,   12924,   12412,   11900,   11388,
     10876,   10364,    9852,    9340,    8828,    8316,    7932,
      7676,    7420,    7164,    6908,    6652,    6396,    6140,
      5884,    5628,    5372,    5116,    4860,    4604,    4348,
      4092,    3900,    3772,    3644,    3516,    3388,    3260,
      3132,    3004,    2876,    2748,    2620,    2492,    2364,
      2236,    2108,    1980,    1884,    1820,    1756,    1692,
      1628,    1564,    1500,    1436,    1372,    1308,    1244,
      1180,    1116,    1052,     988,     924,     876,     844,
       812,     780,     748,     716,     684,     652,     620,
       588,     556,     524,     492,     460,     428,     396,
       372,     356,     340,     324,     308,     292,     276,
       260,     244,     228,     212,     196,     180,     164,
       148,     132,     120,     112,     104,      96,      88,
    80,      72,      64,      56,      48,      40,      32,
    24,      16,       8,       0
};

/*
 * linear2ulaw() accepts a 14-bit signed integer and encodes it as u-law data
 * stored in a unsigned char.  This function should only be called with
 * the data shifted such that it only contains information in the lower
 * 14-bits.
 *
 * In order to simplify the encoding process, the original linear magnitude
 * is biased by adding 33 which shifts the encoding range from (0 - 8158) to
 * (33 - 8191). The result can be seen in the following encoding table:
 *
 *      Biased Linear Input Code        Compressed Code
 *      ------------------------        ---------------
 *      00000001wxyza                   000wxyz
 *      0000001wxyzab                   001wxyz
 *      000001wxyzabc                   010wxyz
 *      00001wxyzabcd                   011wxyz
 *      0001wxyzabcde                   100wxyz
 *      001wxyzabcdef                   101wxyz
 *      01wxyzabcdefg                   110wxyz
 *      1wxyzabcdefgh                   111wxyz
 *
 * Each biased linear code has a leading 1 which identifies the segment
 * number. The value of the segment number is equal to 7 minus the number
 * of leading 0's. The quantization interval is directly available as the
 * four bits wxyz.  * The trailing bits (a - h) are ignored.
 *
 * Ordinarily the complement of the resulting code word is used for
 * transmission, and so the code word is complemented before it is returned.
 *
 * For further information see John C. Bellamy's Digital Telephony, 1982,
 * John Wiley & Sons, pps 98-111 and 472-476.
 */
static unsigned char
st_14linear2ulaw(PyInt16 pcm_val)       /* 2's complement (14-bit range) */
{
    PyInt16         mask;
    PyInt16         seg;
    unsigned char   uval;

    /* The original sox code does this in the calling function, not here */
    pcm_val = pcm_val >> 2;

    /* u-law inverts all bits */
    /* Get the sign and the magnitude of the value. */
    if (pcm_val < 0) {
        pcm_val = -pcm_val;
        mask = 0x7F;
    } else {
        mask = 0xFF;
    }
    if ( pcm_val > CLIP ) pcm_val = CLIP;           /* clip the magnitude */
    pcm_val += (BIAS >> 2);

    /* Convert the scaled magnitude to segment number. */
    seg = search(pcm_val, seg_uend, 8);

    /*
     * Combine the sign, segment, quantization bits;
     * and complement the code word.
     */
    if (seg >= 8)           /* out of range, return maximum value. */
        return (unsigned char) (0x7F ^ mask);
    else {
        uval = (unsigned char) (seg << 4) | ((pcm_val >> (seg + 1)) & 0xF);
        return (uval ^ mask);
    }

}

static PyInt16 _st_alaw2linear16[256] = {
     -5504,   -5248,   -6016,   -5760,   -4480,   -4224,   -4992,
     -4736,   -7552,   -7296,   -8064,   -7808,   -6528,   -6272,
     -7040,   -6784,   -2752,   -2624,   -3008,   -2880,   -2240,
     -2112,   -2496,   -2368,   -3776,   -3648,   -4032,   -3904,
     -3264,   -3136,   -3520,   -3392,  -22016,  -20992,  -24064,
    -23040,  -17920,  -16896,  -19968,  -18944,  -30208,  -29184,
    -32256,  -31232,  -26112,  -25088,  -28160,  -27136,  -11008,
    -10496,  -12032,  -11520,   -8960,   -8448,   -9984,   -9472,
    -15104,  -14592,  -16128,  -15616,  -13056,  -12544,  -14080,
    -13568,    -344,    -328,    -376,    -360,    -280,    -264,
      -312,    -296,    -472,    -456,    -504,    -488,    -408,
      -392,    -440,    -424,     -88,     -72,    -120,    -104,
       -24,      -8,     -56,     -40,    -216,    -200,    -248,
      -232,    -152,    -136,    -184,    -168,   -1376,   -1312,
     -1504,   -1440,   -1120,   -1056,   -1248,   -1184,   -1888,
     -1824,   -2016,   -1952,   -1632,   -1568,   -1760,   -1696,
      -688,    -656,    -752,    -720,    -560,    -528,    -624,
      -592,    -944,    -912,   -1008,    -976,    -816,    -784,
      -880,    -848,    5504,    5248,    6016,    5760,    4480,
      4224,    4992,    4736,    7552,    7296,    8064,    7808,
      6528,    6272,    7040,    6784,    2752,    2624,    3008,
      2880,    2240,    2112,    2496,    2368,    3776,    3648,
      4032,    3904,    3264,    3136,    3520,    3392,   22016,
     20992,   24064,   23040,   17920,   16896,   19968,   18944,
     30208,   29184,   32256,   31232,   26112,   25088,   28160,
     27136,   11008,   10496,   12032,   11520,    8960,    8448,
      9984,    9472,   15104,   14592,   16128,   15616,   13056,
     12544,   14080,   13568,     344,     328,     376,     360,
       280,     264,     312,     296,     472,     456,     504,
       488,     408,     392,     440,     424,      88,      72,
       120,     104,      24,       8,      56,      40,     216,
       200,     248,     232,     152,     136,     184,     168,
      1376,    1312,    1504,    1440,    1120,    1056,    1248,
      1184,    1888,    1824,    2016,    1952,    1632,    1568,
      1760,    1696,     688,     656,     752,     720,     560,
       528,     624,     592,     944,     912,    1008,     976,
       816,     784,     880,     848
};

/*
 * linear2alaw() accepts an 13-bit signed integer and encodes it as A-law data
 * stored in a unsigned char.  This function should only be called with
 * the data shifted such that it only contains information in the lower
 * 13-bits.
 *
 *              Linear Input Code       Compressed Code
 *      ------------------------        ---------------
 *      0000000wxyza                    000wxyz
 *      0000001wxyza                    001wxyz
 *      000001wxyzab                    010wxyz
 *      00001wxyzabc                    011wxyz
 *      0001wxyzabcd                    100wxyz
 *      001wxyzabcde                    101wxyz
 *      01wxyzabcdef                    110wxyz
 *      1wxyzabcdefg                    111wxyz
 *
 * For further information see John C. Bellamy's Digital Telephony, 1982,
 * John Wiley & Sons, pps 98-111 and 472-476.
 */
static unsigned char
st_linear2alaw(PyInt16 pcm_val) /* 2's complement (13-bit range) */
{
    PyInt16         mask;
    short           seg;
    unsigned char   aval;

    /* The original sox code does this in the calling function, not here */
    pcm_val = pcm_val >> 3;

    /* A-law using even bit inversion */
    if (pcm_val >= 0) {
        mask = 0xD5;            /* sign (7th) bit = 1 */
    } else {
        mask = 0x55;            /* sign bit = 0 */
        pcm_val = -pcm_val - 1;
    }

    /* Convert the scaled magnitude to segment number. */
    seg = search(pcm_val, seg_aend, 8);

    /* Combine the sign, segment, and quantization bits. */

    if (seg >= 8)           /* out of range, return maximum value. */
        return (unsigned char) (0x7F ^ mask);
    else {
        aval = (unsigned char) seg << SEG_SHIFT;
        if (seg < 2)
            aval |= (pcm_val >> 1) & QUANT_MASK;
        else
            aval |= (pcm_val >> seg) & QUANT_MASK;
        return (aval ^ mask);
    }
}
/* End of code taken from sox */

/* Intel ADPCM step variation table */
static int indexTable[16] = {
    -1, -1, -1, -1, 2, 4, 6, 8,
    -1, -1, -1, -1, 2, 4, 6, 8,
};

static int stepsizeTable[89] = {
    7, 8, 9, 10, 11, 12, 13, 14, 16, 17,
    19, 21, 23, 25, 28, 31, 34, 37, 41, 45,
    50, 55, 60, 66, 73, 80, 88, 97, 107, 118,
    130, 143, 157, 173, 190, 209, 230, 253, 279, 307,
    337, 371, 408, 449, 494, 544, 598, 658, 724, 796,
    876, 963, 1060, 1166, 1282, 1411, 1552, 1707, 1878, 2066,
    2272, 2499, 2749, 3024, 3327, 3660, 4026, 4428, 4871, 5358,
    5894, 6484, 7132, 7845, 8630, 9493, 10442, 11487, 12635, 13899,
    15289, 16818, 18500, 20350, 22385, 24623, 27086, 29794, 32767
};

#define CHARP(cp, i) ((signed char *)(cp+i))
#define SHORTP(cp, i) ((short *)(cp+i))
#define LONGP(cp, i) ((Py_Int32 *)(cp+i))



static PyObject *AudioopError;

static int
audioop_check_size(int size)
{
    if (size != 1 && size != 2 && size != 4) {
        PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
        return 0;
    }
    else
        return 1;
}

static int
audioop_check_parameters(Py_ssize_t len, int size)
{
    if (!audioop_check_size(size))
        return 0;
    if (len % size != 0) {
        PyErr_SetString(AudioopError, "not a whole number of frames");
        return 0;
    }
    return 1;
}

static PyObject *
audioop_getsample(PyObject *self, PyObject *args)
{
    signed char *cp;
    Py_ssize_t len, i;
    int size, val = 0;

    if ( !PyArg_ParseTuple(args, "s#in:getsample", &cp, &len, &size, &i) )
        return 0;
    if (!audioop_check_parameters(len, size))
        return NULL;
    if ( i < 0 || i >= len/size ) {
        PyErr_SetString(AudioopError, "Index out of range");
        return 0;
    }
    if ( size == 1 )      val = (int)*CHARP(cp, i);
    else if ( size == 2 ) val = (int)*SHORTP(cp, i*2);
    else if ( size == 4 ) val = (int)*LONGP(cp, i*4);
    return PyLong_FromLong(val);
}

static PyObject *
audioop_max(PyObject *self, PyObject *args)
{
    signed char *cp;
    Py_ssize_t len, i;
    int size, val = 0;
    int max = 0;

    if ( !PyArg_ParseTuple(args, "s#i:max", &cp, &len, &size) )
        return 0;
    if (!audioop_check_parameters(len, size))
        return NULL;
    for ( i=0; i<len; i+= size) {
        if ( size == 1 )      val = (int)*CHARP(cp, i);
        else if ( size == 2 ) val = (int)*SHORTP(cp, i);
        else if ( size == 4 ) val = (int)*LONGP(cp, i);
        if ( val < 0 ) val = (-val);
        if ( val > max ) max = val;
    }
    return PyLong_FromLong(max);
}

static PyObject *
audioop_minmax(PyObject *self, PyObject *args)
{
    signed char *cp;
    Py_ssize_t len, i;
    int size, val = 0;
    int min = 0x7fffffff, max = -0x7fffffff;

    if (!PyArg_ParseTuple(args, "s#i:minmax", &cp, &len, &size))
        return NULL;
    if (!audioop_check_parameters(len, size))
        return NULL;
    for (i = 0; i < len; i += size) {
        if (size == 1) val = (int) *CHARP(cp, i);
        else if (size == 2) val = (int) *SHORTP(cp, i);
        else if (size == 4) val = (int) *LONGP(cp, i);
        if (val > max) max = val;
        if (val < min) min = val;
    }
    return Py_BuildValue("(ii)", min, max);
}

static PyObject *
audioop_avg(PyObject *self, PyObject *args)
{
    signed char *cp;
    Py_ssize_t len, i;
    int size, val = 0;
    double avg = 0.0;

    if ( !PyArg_ParseTuple(args, "s#i:avg", &cp, &len, &size) )
        return 0;
    if (!audioop_check_parameters(len, size))
        return NULL;
    for ( i=0; i<len; i+= size) {
        if ( size == 1 )      val = (int)*CHARP(cp, i);
        else if ( size == 2 ) val = (int)*SHORTP(cp, i);
        else if ( size == 4 ) val = (int)*LONGP(cp, i);
        avg += val;
    }
    if ( len == 0 )
        val = 0;
    else
        val = (int)(avg / (double)(len/size));
    return PyLong_FromLong(val);
}

static PyObject *
audioop_rms(PyObject *self, PyObject *args)
{
    signed char *cp;
    Py_ssize_t len, i;
    int size, val = 0;
    double sum_squares = 0.0;

    if ( !PyArg_ParseTuple(args, "s#i:rms", &cp, &len, &size) )
        return 0;
    if (!audioop_check_parameters(len, size))
        return NULL;
    for ( i=0; i<len; i+= size) {
        if ( size == 1 )      val = (int)*CHARP(cp, i);
        else if ( size == 2 ) val = (int)*SHORTP(cp, i);
        else if ( size == 4 ) val = (int)*LONGP(cp, i);
        sum_squares += (double)val*(double)val;
    }
    if ( len == 0 )
        val = 0;
    else
        val = (int)sqrt(sum_squares / (double)(len/size));
    return PyLong_FromLong(val);
}

static double _sum2(short *a, short *b, Py_ssize_t len)
{
    Py_ssize_t i;
    double sum = 0.0;

    for( i=0; i<len; i++) {
        sum = sum + (double)a[i]*(double)b[i];
    }
    return sum;
}

/*
** Findfit tries to locate a sample within another sample. Its main use
** is in echo-cancellation (to find the feedback of the output signal in
** the input signal).
** The method used is as follows:
**
** let R be the reference signal (length n) and A the input signal (length N)
** with N > n, and let all sums be over i from 0 to n-1.
**
** Now, for each j in {0..N-n} we compute a factor fj so that -fj*R matches A
** as good as possible, i.e. sum( (A[j+i]+fj*R[i])^2 ) is minimal. This
** equation gives fj = sum( A[j+i]R[i] ) / sum(R[i]^2).
**
** Next, we compute the relative distance between the original signal and
** the modified signal and minimize that over j:
** vj = sum( (A[j+i]-fj*R[i])^2 ) / sum( A[j+i]^2 )  =>
** vj = ( sum(A[j+i]^2)*sum(R[i]^2) - sum(A[j+i]R[i])^2 ) / sum( A[j+i]^2 )
**
** In the code variables correspond as follows:
** cp1          A
** cp2          R
** len1         N
** len2         n
** aj_m1        A[j-1]
** aj_lm1       A[j+n-1]
** sum_ri_2     sum(R[i]^2)
** sum_aij_2    sum(A[i+j]^2)
** sum_aij_ri   sum(A[i+j]R[i])
**
** sum_ri is calculated once, sum_aij_2 is updated each step and sum_aij_ri
** is completely recalculated each step.
*/
static PyObject *
audioop_findfit(PyObject *self, PyObject *args)
{
    short *cp1, *cp2;
    Py_ssize_t len1, len2;
    Py_ssize_t j, best_j;
    double aj_m1, aj_lm1;
    double sum_ri_2, sum_aij_2, sum_aij_ri, result, best_result, factor;

    /* Passing a short** for an 's' argument is correct only
       if the string contents is aligned for interpretation
       as short[]. Due to the definition of PyBytesObject,
       this is currently (Python 2.6) the case. */
    if ( !PyArg_ParseTuple(args, "s#s#:findfit",
                           (char**)&cp1, &len1, (char**)&cp2, &len2) )
        return 0;
    if ( len1 & 1 || len2 & 1 ) {
        PyErr_SetString(AudioopError, "Strings should be even-sized");
        return 0;
    }
    len1 >>= 1;
    len2 >>= 1;

    if ( len1 < len2 ) {
        PyErr_SetString(AudioopError, "First sample should be longer");
        return 0;
    }
    sum_ri_2 = _sum2(cp2, cp2, len2);
    sum_aij_2 = _sum2(cp1, cp1, len2);
    sum_aij_ri = _sum2(cp1, cp2, len2);

    result = (sum_ri_2*sum_aij_2 - sum_aij_ri*sum_aij_ri) / sum_aij_2;

    best_result = result;
    best_j = 0;

    for ( j=1; j<=len1-len2; j++) {
        aj_m1 = (double)cp1[j-1];
        aj_lm1 = (double)cp1[j+len2-1];

        sum_aij_2 = sum_aij_2 + aj_lm1*aj_lm1 - aj_m1*aj_m1;
        sum_aij_ri = _sum2(cp1+j, cp2, len2);

        result = (sum_ri_2*sum_aij_2 - sum_aij_ri*sum_aij_ri)
            / sum_aij_2;

        if ( result < best_result ) {
            best_result = result;
            best_j = j;
        }

    }

    factor = _sum2(cp1+best_j, cp2, len2) / sum_ri_2;

    return Py_BuildValue("(nf)", best_j, factor);
}

/*
** findfactor finds a factor f so that the energy in A-fB is minimal.
** See the comment for findfit for details.
*/
static PyObject *
audioop_findfactor(PyObject *self, PyObject *args)
{
    short *cp1, *cp2;
    Py_ssize_t len1, len2;
    double sum_ri_2, sum_aij_ri, result;

    if ( !PyArg_ParseTuple(args, "s#s#:findfactor",
                           (char**)&cp1, &len1, (char**)&cp2, &len2) )
        return 0;
    if ( len1 & 1 || len2 & 1 ) {
        PyErr_SetString(AudioopError, "Strings should be even-sized");
        return 0;
    }
    if ( len1 != len2 ) {
        PyErr_SetString(AudioopError, "Samples should be same size");
        return 0;
    }
    len2 >>= 1;
    sum_ri_2 = _sum2(cp2, cp2, len2);
    sum_aij_ri = _sum2(cp1, cp2, len2);

    result = sum_aij_ri / sum_ri_2;

    return PyFloat_FromDouble(result);
}

/*
** findmax returns the index of the n-sized segment of the input sample
** that contains the most energy.
*/
static PyObject *
audioop_findmax(PyObject *self, PyObject *args)
{
    short *cp1;
    Py_ssize_t len1, len2;
    Py_ssize_t j, best_j;
    double aj_m1, aj_lm1;
    double result, best_result;

    if ( !PyArg_ParseTuple(args, "s#n:findmax",
                           (char**)&cp1, &len1, &len2) )
        return 0;
    if ( len1 & 1 ) {
        PyErr_SetString(AudioopError, "Strings should be even-sized");
        return 0;
    }
    len1 >>= 1;

    if ( len2 < 0 || len1 < len2 ) {
        PyErr_SetString(AudioopError, "Input sample should be longer");
        return 0;
    }

    result = _sum2(cp1, cp1, len2);

    best_result = result;
    best_j = 0;

    for ( j=1; j<=len1-len2; j++) {
        aj_m1 = (double)cp1[j-1];
        aj_lm1 = (double)cp1[j+len2-1];

        result = result + aj_lm1*aj_lm1 - aj_m1*aj_m1;

        if ( result > best_result ) {
            best_result = result;
            best_j = j;
        }

    }

    return PyLong_FromSsize_t(best_j);
}

static PyObject *
audioop_avgpp(PyObject *self, PyObject *args)
{
    signed char *cp;
    Py_ssize_t len, i;
    int size, val = 0, prevval = 0, prevextremevalid = 0,
        prevextreme = 0;
    double avg = 0.0;
    int diff, prevdiff, extremediff, nextreme = 0;

    if ( !PyArg_ParseTuple(args, "s#i:avgpp", &cp, &len, &size) )
        return 0;
    if (!audioop_check_parameters(len, size))
        return NULL;
    /* Compute first delta value ahead. Also automatically makes us
    ** skip the first extreme value
    */
    if ( size == 1 )      prevval = (int)*CHARP(cp, 0);
    else if ( size == 2 ) prevval = (int)*SHORTP(cp, 0);
    else if ( size == 4 ) prevval = (int)*LONGP(cp, 0);
    if ( size == 1 )      val = (int)*CHARP(cp, size);
    else if ( size == 2 ) val = (int)*SHORTP(cp, size);
    else if ( size == 4 ) val = (int)*LONGP(cp, size);
    prevdiff = val - prevval;

    for ( i=size; i<len; i+= size) {
        if ( size == 1 )      val = (int)*CHARP(cp, i);
        else if ( size == 2 ) val = (int)*SHORTP(cp, i);
        else if ( size == 4 ) val = (int)*LONGP(cp, i);
        diff = val - prevval;
        if ( diff*prevdiff < 0 ) {
            /* Derivative changed sign. Compute difference to last
            ** extreme value and remember.
            */
            if ( prevextremevalid ) {
                extremediff = prevval - prevextreme;
                if ( extremediff < 0 )
                    extremediff = -extremediff;
                avg += extremediff;
                nextreme++;
            }
            prevextremevalid = 1;
            prevextreme = prevval;
        }
        prevval = val;
        if ( diff != 0 )
            prevdiff = diff;
    }
    if ( nextreme == 0 )
        val = 0;
    else
        val = (int)(avg / (double)nextreme);
    return PyLong_FromLong(val);
}

static PyObject *
audioop_maxpp(PyObject *self, PyObject *args)
{
    signed char *cp;
    Py_ssize_t len, i;
    int size, val = 0, prevval = 0, prevextremevalid = 0,
        prevextreme = 0;
    int max = 0;
    int diff, prevdiff, extremediff;

    if ( !PyArg_ParseTuple(args, "s#i:maxpp", &cp, &len, &size) )
        return 0;
    if (!audioop_check_parameters(len, size))
        return NULL;
    /* Compute first delta value ahead. Also automatically makes us
    ** skip the first extreme value
    */
    if ( size == 1 )      prevval = (int)*CHARP(cp, 0);
    else if ( size == 2 ) prevval = (int)*SHORTP(cp, 0);
    else if ( size == 4 ) prevval = (int)*LONGP(cp, 0);
    if ( size == 1 )      val = (int)*CHARP(cp, size);
    else if ( size == 2 ) val = (int)*SHORTP(cp, size);
    else if ( size == 4 ) val = (int)*LONGP(cp, size);
    prevdiff = val - prevval;

    for ( i=size; i<len; i+= size) {
        if ( size == 1 )      val = (int)*CHARP(cp, i);
        else if ( size == 2 ) val = (int)*SHORTP(cp, i);
        else if ( size == 4 ) val = (int)*LONGP(cp, i);
        diff = val - prevval;
        if ( diff*prevdiff < 0 ) {
            /* Derivative changed sign. Compute difference to
            ** last extreme value and remember.
            */
            if ( prevextremevalid ) {
                extremediff = prevval - prevextreme;
                if ( extremediff < 0 )
                    extremediff = -extremediff;
                if ( extremediff > max )
                    max = extremediff;
            }
            prevextremevalid = 1;
            prevextreme = prevval;
        }
        prevval = val;
        if ( diff != 0 )
            prevdiff = diff;
    }
    return PyLong_FromLong(max);
}

static PyObject *
audioop_cross(PyObject *self, PyObject *args)
{
    signed char *cp;
    Py_ssize_t len, i;
    int size, val = 0;
    int prevval;
    Py_ssize_t ncross;

    if ( !PyArg_ParseTuple(args, "s#i:cross", &cp, &len, &size) )
        return 0;
    if (!audioop_check_parameters(len, size))
        return NULL;
    ncross = -1;
    prevval = 17; /* Anything <> 0,1 */
    for ( i=0; i<len; i+= size) {
        if ( size == 1 )      val = ((int)*CHARP(cp, i)) >> 7;
        else if ( size == 2 ) val = ((int)*SHORTP(cp, i)) >> 15;
        else if ( size == 4 ) val = ((int)*LONGP(cp, i)) >> 31;
        val = val & 1;
        if ( val != prevval ) ncross++;
        prevval = val;
    }
    return PyLong_FromSsize_t(ncross);
}

static PyObject *
audioop_mul(PyObject *self, PyObject *args)
{
    signed char *cp, *ncp;
    Py_ssize_t len, i;
    int size, val = 0;
    double factor, fval, maxval;
    PyObject *rv;

    if ( !PyArg_ParseTuple(args, "s#id:mul", &cp, &len, &size, &factor ) )
        return 0;
    if (!audioop_check_parameters(len, size))
        return NULL;

    if ( size == 1 ) maxval = (double) 0x7f;
    else if ( size == 2 ) maxval = (double) 0x7fff;
    else if ( size == 4 ) maxval = (double) 0x7fffffff;
    else {
        PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
        return 0;
    }

    rv = PyBytes_FromStringAndSize(NULL, len);
    if ( rv == 0 )
        return 0;
    ncp = (signed char *)PyBytes_AsString(rv);


    for ( i=0; i < len; i += size ) {
        if ( size == 1 )      val = (int)*CHARP(cp, i);
        else if ( size == 2 ) val = (int)*SHORTP(cp, i);
        else if ( size == 4 ) val = (int)*LONGP(cp, i);
        fval = (double)val*factor;
        if ( fval > maxval ) fval = maxval;
        else if ( fval < -maxval ) fval = -maxval;
        val = (int)fval;
        if ( size == 1 )      *CHARP(ncp, i) = (signed char)val;
        else if ( size == 2 ) *SHORTP(ncp, i) = (short)val;
        else if ( size == 4 ) *LONGP(ncp, i) = (Py_Int32)val;
    }
    return rv;
}

static PyObject *
audioop_tomono(PyObject *self, PyObject *args)
{
    Py_buffer pcp;
    signed char *cp, *ncp;
    Py_ssize_t len, i;
    int size, val1 = 0, val2 = 0;
    double fac1, fac2, fval, maxval;
    PyObject *rv;

    if ( !PyArg_ParseTuple(args, "s*idd:tomono",
                           &pcp, &size, &fac1, &fac2 ) )
        return 0;
    cp = pcp.buf;
    len = pcp.len;
    if (!audioop_check_parameters(len, size)) {
        PyBuffer_Release(&pcp);
        return NULL;
    }
    if (((len / size) & 1) != 0) {
        PyErr_SetString(AudioopError, "not a whole number of frames");
        PyBuffer_Release(&pcp);
        return NULL;
    }

    if ( size == 1 ) maxval = (double) 0x7f;
    else if ( size == 2 ) maxval = (double) 0x7fff;
    else if ( size == 4 ) maxval = (double) 0x7fffffff;
    else {
        PyBuffer_Release(&pcp);
        PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
        return 0;
    }

    rv = PyBytes_FromStringAndSize(NULL, len/2);
    if ( rv == 0 ) {
        PyBuffer_Release(&pcp);
        return 0;
    }
    ncp = (signed char *)PyBytes_AsString(rv);


    for ( i=0; i < len; i += size*2 ) {
        if ( size == 1 )      val1 = (int)*CHARP(cp, i);
        else if ( size == 2 ) val1 = (int)*SHORTP(cp, i);
        else if ( size == 4 ) val1 = (int)*LONGP(cp, i);
        if ( size == 1 )      val2 = (int)*CHARP(cp, i+1);
        else if ( size == 2 ) val2 = (int)*SHORTP(cp, i+2);
        else if ( size == 4 ) val2 = (int)*LONGP(cp, i+4);
        fval = (double)val1*fac1 + (double)val2*fac2;
        if ( fval > maxval ) fval = maxval;
        else if ( fval < -maxval ) fval = -maxval;
        val1 = (int)fval;
        if ( size == 1 )      *CHARP(ncp, i/2) = (signed char)val1;
        else if ( size == 2 ) *SHORTP(ncp, i/2) = (short)val1;
        else if ( size == 4 ) *LONGP(ncp, i/2)= (Py_Int32)val1;
    }
    PyBuffer_Release(&pcp);
    return rv;
}

static PyObject *
audioop_tostereo(PyObject *self, PyObject *args)
{
    signed char *cp, *ncp;
    Py_ssize_t len, i;
    int size, val1, val2, val = 0;
    double fac1, fac2, fval, maxval;
    PyObject *rv;

    if ( !PyArg_ParseTuple(args, "s#idd:tostereo",
                           &cp, &len, &size, &fac1, &fac2 ) )
        return 0;
    if (!audioop_check_parameters(len, size))
        return NULL;

    if ( size == 1 ) maxval = (double) 0x7f;
    else if ( size == 2 ) maxval = (double) 0x7fff;
    else if ( size == 4 ) maxval = (double) 0x7fffffff;
    else {
        PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
        return 0;
    }

    if (len > PY_SSIZE_T_MAX/2) {
        PyErr_SetString(PyExc_MemoryError,
                        "not enough memory for output buffer");
        return 0;
    }

    rv = PyBytes_FromStringAndSize(NULL, len*2);
    if ( rv == 0 )
        return 0;
    ncp = (signed char *)PyBytes_AsString(rv);


    for ( i=0; i < len; i += size ) {
        if ( size == 1 )      val = (int)*CHARP(cp, i);
        else if ( size == 2 ) val = (int)*SHORTP(cp, i);
        else if ( size == 4 ) val = (int)*LONGP(cp, i);

        fval = (double)val*fac1;
        if ( fval > maxval ) fval = maxval;
        else if ( fval < -maxval ) fval = -maxval;
        val1 = (int)fval;

        fval = (double)val*fac2;
        if ( fval > maxval ) fval = maxval;
        else if ( fval < -maxval ) fval = -maxval;
        val2 = (int)fval;

        if ( size == 1 )      *CHARP(ncp, i*2) = (signed char)val1;
        else if ( size == 2 ) *SHORTP(ncp, i*2) = (short)val1;
        else if ( size == 4 ) *LONGP(ncp, i*2) = (Py_Int32)val1;

        if ( size == 1 )      *CHARP(ncp, i*2+1) = (signed char)val2;
        else if ( size == 2 ) *SHORTP(ncp, i*2+2) = (short)val2;
        else if ( size == 4 ) *LONGP(ncp, i*2+4) = (Py_Int32)val2;
    }
    return rv;
}

static PyObject *
audioop_add(PyObject *self, PyObject *args)
{
    signed char *cp1, *cp2, *ncp;
    Py_ssize_t len1, len2, i;
    int size, val1 = 0, val2 = 0, maxval, newval;
    PyObject *rv;

    if ( !PyArg_ParseTuple(args, "s#s#i:add",
                      &cp1, &len1, &cp2, &len2, &size ) )
        return 0;
    if (!audioop_check_parameters(len1, size))
        return NULL;
    if ( len1 != len2 ) {
        PyErr_SetString(AudioopError, "Lengths should be the same");
        return 0;
    }

    if ( size == 1 ) maxval = 0x7f;
    else if ( size == 2 ) maxval = 0x7fff;
    else if ( size == 4 ) maxval = 0x7fffffff;
    else {
        PyErr_SetString(AudioopError, "Size should be 1, 2 or 4");
        return 0;
    }

    rv = PyBytes_FromStringAndSize(NULL, len1);
    if ( rv == 0 )
        return 0;
    ncp = (signed char *)PyBytes_AsString(rv);

    for ( i=0; i < len1; i += size ) {
        if ( size == 1 )      val1 = (int)*CHARP(cp1, i);
        else if ( size == 2 ) val1 = (int)*SHORTP(cp1, i);
        else if ( size == 4 ) val1 = (int)*LONGP(cp1, i);

        if ( size == 1 )      val2 = (int)*CHARP(cp2, i);
        else if ( size == 2 ) val2 = (int)*SHORTP(cp2, i);
        else if ( size == 4 ) val2 = (int)*LONGP(cp2, i);

        newval = val1 + val2;
        /* truncate in case of overflow */
        if (newval > maxval) newval = maxval;
        else if (newval < -maxval) newval = -maxval;
        else if (size == 4 && (newval^val1) < 0 && (newval^val2) < 0)
            newval = val1 > 0 ? maxval : - maxval;

        if ( size == 1 )      *CHARP(ncp, i) = (signed char)newval;
        else if ( size == 2 ) *SHORTP(ncp, i) = (short)newval;
        else if ( size == 4 ) *LONGP(ncp, i) = (Py_Int32)newval;
    }
    return rv;
}

static PyObject *
audioop_bias(PyObject *self, PyObject *args)
{
    signed char *cp, *ncp;
    Py_ssize_t len, i;
    int size, val = 0;
    PyObject *rv;
    int bias;

    if ( !PyArg_ParseTuple(args, "s#ii:bias",
                      &cp, &len, &size , &bias) )
        return 0;

    if (!audioop_check_parameters(len, size))
        return NULL;

    rv = PyBytes_FromStringAndSize(NULL, len);
    if ( rv == 0 )
        return 0;
    ncp = (signed char *)PyBytes_AsString(rv);


    for ( i=0; i < len; i += size ) {
        if ( size == 1 )      val = (int)*CHARP(cp, i);
        else if ( size == 2 ) val = (int)*SHORTP(cp, i);
        else if ( size == 4 ) val = (int)*LONGP(cp, i);

        if ( size == 1 )      *CHARP(ncp, i) = (signed char)(val+bias);
        else if ( size == 2 ) *SHORTP(ncp, i) = (short)(val+bias);
        else if ( size == 4 ) *LONGP(ncp, i) = (Py_Int32)(val+bias);
    }
    return rv;
}

static PyObject *
audioop_reverse(PyObject *self, PyObject *args)
{
    signed char *cp;
    unsigned char *ncp;
    Py_ssize_t len, i, j;
    int size, val = 0;
    PyObject *rv;

    if ( !PyArg_ParseTuple(args, "s#i:reverse",
                      &cp, &len, &size) )
        return 0;

    if (!audioop_check_parameters(len, size))
        return NULL;

    rv = PyBytes_FromStringAndSize(NULL, len);
    if ( rv == 0 )
        return 0;
    ncp = (unsigned char *)PyBytes_AsString(rv);

    for ( i=0; i < len; i += size ) {
        if ( size == 1 )      val = ((int)*CHARP(cp, i)) << 8;
        else if ( size == 2 ) val = (int)*SHORTP(cp, i);
        else if ( size == 4 ) val = ((int)*LONGP(cp, i)) >> 16;

        j = len - i - size;

        if ( size == 1 )      *CHARP(ncp, j) = (signed char)(val >> 8);
        else if ( size == 2 ) *SHORTP(ncp, j) = (short)(val);
        else if ( size == 4 ) *LONGP(ncp, j) = (Py_Int32)(val<<16);
    }
    return rv;
}

static PyObject *
audioop_lin2lin(PyObject *self, PyObject *args)
{
    signed char *cp;
    unsigned char *ncp;
    Py_ssize_t len, i, j;
    int size, size2, val = 0;
    PyObject *rv;

    if ( !PyArg_ParseTuple(args, "s#ii:lin2lin",
                      &cp, &len, &size, &size2) )
        return 0;

    if (!audioop_check_parameters(len, size))
        return NULL;
    if (!audioop_check_size(size2))
        return NULL;

    if (len/size > PY_SSIZE_T_MAX/size2) {
        PyErr_SetString(PyExc_MemoryError,
                        "not enough memory for output buffer");
        return 0;
    }
    rv = PyBytes_FromStringAndSize(NULL, (len/size)*size2);
    if ( rv == 0 )
        return 0;
    ncp = (unsigned char *)PyBytes_AsString(rv);

    for ( i=0, j=0; i < len; i += size, j += size2 ) {
        if ( size == 1 )      val = ((int)*CHARP(cp, i)) << 8;
        else if ( size == 2 ) val = (int)*SHORTP(cp, i);
        else if ( size == 4 ) val = ((int)*LONGP(cp, i)) >> 16;

        if ( size2 == 1 )  *CHARP(ncp, j) = (signed char)(val >> 8);
        else if ( size2 == 2 ) *SHORTP(ncp, j) = (short)(val);
        else if ( size2 == 4 ) *LONGP(ncp, j) = (Py_Int32)(val<<16);
    }
    return rv;
}

static int
gcd(int a, int b)
{
    while (b > 0) {
        int tmp = a % b;
        a = b;
        b = tmp;
    }
    return a;
}

static PyObject *
audioop_ratecv(PyObject *self, PyObject *args)
{
    char *cp, *ncp;
    Py_ssize_t len;
    int size, nchannels, inrate, outrate, weightA, weightB;
    int chan, d, *prev_i, *cur_i, cur_o;
    PyObject *state, *samps, *str, *rv = NULL;
    int bytes_per_frame;

    weightA = 1;
    weightB = 0;
    if (!PyArg_ParseTuple(args, "s#iiiiO|ii:ratecv", &cp, &len, &size,
                          &nchannels, &inrate, &outrate, &state,
                          &weightA, &weightB))
        return NULL;
    if (!audioop_check_size(size))
        return NULL;
    if (nchannels < 1) {
        PyErr_SetString(AudioopError, "# of channels should be >= 1");
        return NULL;
    }
    bytes_per_frame = size * nchannels;
    if (bytes_per_frame / nchannels != size) {
        /* This overflow test is rigorously correct because
           both multiplicands are >= 1.  Use the argument names
           from the docs for the error msg. */
        PyErr_SetString(PyExc_OverflowError,
                        "width * nchannels too big for a C int");
        return NULL;
    }
    if (weightA < 1 || weightB < 0) {
        PyErr_SetString(AudioopError,
            "weightA should be >= 1, weightB should be >= 0");
        return NULL;
    }
    if (len % bytes_per_frame != 0) {
        PyErr_SetString(AudioopError, "not a whole number of frames");
        return NULL;
    }
    if (inrate <= 0 || outrate <= 0) {
        PyErr_SetString(AudioopError, "sampling rate not > 0");
        return NULL;
    }
    /* divide inrate and outrate by their greatest common divisor */
    d = gcd(inrate, outrate);
    inrate /= d;
    outrate /= d;

    if ((size_t)nchannels > PY_SIZE_MAX/sizeof(int)) {
        PyErr_SetString(PyExc_MemoryError,
                        "not enough memory for output buffer");
        return 0;
    }
    prev_i = (int *) malloc(nchannels * sizeof(int));
    cur_i = (int *) malloc(nchannels * sizeof(int));
    if (prev_i == NULL || cur_i == NULL) {
        (void) PyErr_NoMemory();
        goto exit;
    }

    len /= bytes_per_frame; /* # of frames */

    if (state == Py_None) {
        d = -outrate;
        for (chan = 0; chan < nchannels; chan++)
            prev_i[chan] = cur_i[chan] = 0;
    }
    else {
        if (!PyArg_ParseTuple(state,
                        "iO!;audioop.ratecv: illegal state argument",
                        &d, &PyTuple_Type, &samps))
            goto exit;
        if (PyTuple_Size(samps) != nchannels) {
            PyErr_SetString(AudioopError,
                            "illegal state argument");
            goto exit;
        }
        for (chan = 0; chan < nchannels; chan++) {
            if (!PyArg_ParseTuple(PyTuple_GetItem(samps, chan),
                                  "ii:ratecv", &prev_i[chan],
                                               &cur_i[chan]))
                goto exit;
        }
    }

    /* str <- Space for the output buffer. */
    {
        /* There are len input frames, so we need (mathematically)
           ceiling(len*outrate/inrate) output frames, and each frame
           requires bytes_per_frame bytes.  Computing this
           without spurious overflow is the challenge; we can
           settle for a reasonable upper bound, though, in this
           case ceiling(len/inrate) * outrate. */

        /* compute ceiling(len/inrate) without overflow */
        Py_ssize_t q = len > 0 ? 1 + (len - 1) / inrate : 0;
        if (outrate > PY_SSIZE_T_MAX / q / bytes_per_frame)
            str = NULL;
        else
            str = PyBytes_FromStringAndSize(NULL,
                                            q * outrate * bytes_per_frame);

        if (str == NULL) {
            PyErr_SetString(PyExc_MemoryError,
                "not enough memory for output buffer");
            goto exit;
        }
    }
    ncp = PyBytes_AsString(str);

    for (;;) {
        while (d < 0) {
            if (len == 0) {
                samps = PyTuple_New(nchannels);
                if (samps == NULL)
                    goto exit;
                for (chan = 0; chan < nchannels; chan++)
                    PyTuple_SetItem(samps, chan,
                        Py_BuildValue("(ii)",
                                      prev_i[chan],
                                      cur_i[chan]));
                if (PyErr_Occurred())
                    goto exit;
                /* We have checked before that the length
                 * of the string fits into int. */
                len = (Py_ssize_t)(ncp - PyBytes_AsString(str));
                rv = PyBytes_FromStringAndSize
                    (PyBytes_AsString(str), len);
                Py_DECREF(str);
                str = rv;
                if (str == NULL)
                    goto exit;
                rv = Py_BuildValue("(O(iO))", str, d, samps);
                Py_DECREF(samps);
                Py_DECREF(str);
                goto exit; /* return rv */
            }
            for (chan = 0; chan < nchannels; chan++) {
                prev_i[chan] = cur_i[chan];
                if (size == 1)
                    cur_i[chan] = ((int)*CHARP(cp, 0)) << 8;
                else if (size == 2)
                    cur_i[chan] = (int)*SHORTP(cp, 0);
                else if (size == 4)
                    cur_i[chan] = ((int)*LONGP(cp, 0)) >> 16;
                cp += size;
                /* implements a simple digital filter */
                cur_i[chan] =
                    (weightA * cur_i[chan] +
                     weightB * prev_i[chan]) /
                    (weightA + weightB);
            }
            len--;
            d += outrate;
        }
        while (d >= 0) {
            for (chan = 0; chan < nchannels; chan++) {
                cur_o = (prev_i[chan] * d +
                         cur_i[chan] * (outrate - d)) /
                    outrate;
                if (size == 1)
                    *CHARP(ncp, 0) = (signed char)(cur_o >> 8);
                else if (size == 2)
                    *SHORTP(ncp, 0) = (short)(cur_o);
                else if (size == 4)
                    *LONGP(ncp, 0) = (Py_Int32)(cur_o<<16);
                ncp += size;
            }
            d -= inrate;
        }
    }
  exit:
    if (prev_i != NULL)
        free(prev_i);
    if (cur_i != NULL)
        free(cur_i);
    return rv;
}

static PyObject *
audioop_lin2ulaw(PyObject *self, PyObject *args)
{
    signed char *cp;
    unsigned char *ncp;
    Py_ssize_t len, i;
    int size, val = 0;
    PyObject *rv;

    if ( !PyArg_ParseTuple(args, "s#i:lin2ulaw",
                           &cp, &len, &size) )
        return 0 ;

    if (!audioop_check_parameters(len, size))
        return NULL;

    rv = PyBytes_FromStringAndSize(NULL, len/size);
    if ( rv == 0 )
        return 0;
    ncp = (unsigned char *)PyBytes_AsString(rv);

    for ( i=0; i < len; i += size ) {
        if ( size == 1 )      val = ((int)*CHARP(cp, i)) << 8;
        else if ( size == 2 ) val = (int)*SHORTP(cp, i);
        else if ( size == 4 ) val = ((int)*LONGP(cp, i)) >> 16;

        *ncp++ = st_14linear2ulaw(val);
    }
    return rv;
}

static PyObject *
audioop_ulaw2lin(PyObject *self, PyObject *args)
{
    unsigned char *cp;
    unsigned char cval;
    signed char *ncp;
    Py_ssize_t len, i;
    int size, val;
    PyObject *rv;

    if ( !PyArg_ParseTuple(args, "s#i:ulaw2lin",
                           &cp, &len, &size) )
        return 0;

    if (!audioop_check_size(size))
        return NULL;

    if (len > PY_SSIZE_T_MAX/size) {
        PyErr_SetString(PyExc_MemoryError,
                        "not enough memory for output buffer");
        return 0;
    }
    rv = PyBytes_FromStringAndSize(NULL, len*size);
    if ( rv == 0 )
        return 0;
    ncp = (signed char *)PyBytes_AsString(rv);

    for ( i=0; i < len*size; i += size ) {
        cval = *cp++;
        val = st_ulaw2linear16(cval);

        if ( size == 1 )      *CHARP(ncp, i) = (signed char)(val >> 8);
        else if ( size == 2 ) *SHORTP(ncp, i) = (short)(val);
        else if ( size == 4 ) *LONGP(ncp, i) = (Py_Int32)(val<<16);
    }
    return rv;
}

static PyObject *
audioop_lin2alaw(PyObject *self, PyObject *args)
{
    signed char *cp;
    unsigned char *ncp;
    Py_ssize_t len, i;
    int size, val = 0;
    PyObject *rv;

    if ( !PyArg_ParseTuple(args, "s#i:lin2alaw",
                           &cp, &len, &size) )
        return 0;

    if (!audioop_check_parameters(len, size))
        return NULL;

    rv = PyBytes_FromStringAndSize(NULL, len/size);
    if ( rv == 0 )
        return 0;
    ncp = (unsigned char *)PyBytes_AsString(rv);

    for ( i=0; i < len; i += size ) {
        if ( size == 1 )      val = ((int)*CHARP(cp, i)) << 8;
        else if ( size == 2 ) val = (int)*SHORTP(cp, i);
        else if ( size == 4 ) val = ((int)*LONGP(cp, i)) >> 16;

        *ncp++ = st_linear2alaw(val);
    }
    return rv;
}

static PyObject *
audioop_alaw2lin(PyObject *self, PyObject *args)
{
    unsigned char *cp;
    unsigned char cval;
    signed char *ncp;
    Py_ssize_t len, i;
    int size, val;
    PyObject *rv;

    if ( !PyArg_ParseTuple(args, "s#i:alaw2lin",
                           &cp, &len, &size) )
        return 0;

    if (!audioop_check_size(size))
        return NULL;

    if (len > PY_SSIZE_T_MAX/size) {
        PyErr_SetString(PyExc_MemoryError,
                        "not enough memory for output buffer");
        return 0;
    }
    rv = PyBytes_FromStringAndSize(NULL, len*size);
    if ( rv == 0 )
        return 0;
    ncp = (signed char *)PyBytes_AsString(rv);

    for ( i=0; i < len*size; i += size ) {
        cval = *cp++;
        val = st_alaw2linear16(cval);

        if ( size == 1 )      *CHARP(ncp, i) = (signed char)(val >> 8);
        else if ( size == 2 ) *SHORTP(ncp, i) = (short)(val);
        else if ( size == 4 ) *LONGP(ncp, i) = (Py_Int32)(val<<16);
    }
    return rv;
}

static PyObject *
audioop_lin2adpcm(PyObject *self, PyObject *args)
{
    signed char *cp;
    signed char *ncp;
    Py_ssize_t len, i;
    int size, val = 0, step, valpred, delta,
        index, sign, vpdiff, diff;
    PyObject *rv, *state, *str;
    int outputbuffer = 0, bufferstep;

    if ( !PyArg_ParseTuple(args, "s#iO:lin2adpcm",
                           &cp, &len, &size, &state) )
        return 0;

    if (!audioop_check_parameters(len, size))
        return NULL;

    str = PyBytes_FromStringAndSize(NULL, len/(size*2));
    if ( str == 0 )
        return 0;
    ncp = (signed char *)PyBytes_AsString(str);

    /* Decode state, should have (value, step) */
    if ( state == Py_None ) {
        /* First time, it seems. Set defaults */
        valpred = 0;
        index = 0;
    } else if ( !PyArg_ParseTuple(state, "ii", &valpred, &index) )
        return 0;

    step = stepsizeTable[index];
    bufferstep = 1;

    for ( i=0; i < len; i += size ) {
        if ( size == 1 )      val = ((int)*CHARP(cp, i)) << 8;
        else if ( size == 2 ) val = (int)*SHORTP(cp, i);
        else if ( size == 4 ) val = ((int)*LONGP(cp, i)) >> 16;

        /* Step 1 - compute difference with previous value */
        diff = val - valpred;
        sign = (diff < 0) ? 8 : 0;
        if ( sign ) diff = (-diff);

        /* Step 2 - Divide and clamp */
        /* Note:
        ** This code *approximately* computes:
        **    delta = diff*4/step;
        **    vpdiff = (delta+0.5)*step/4;
        ** but in shift step bits are dropped. The net result of this
        ** is that even if you have fast mul/div hardware you cannot
        ** put it to good use since the fixup would be too expensive.
        */
        delta = 0;
        vpdiff = (step >> 3);

        if ( diff >= step ) {
            delta = 4;
            diff -= step;
            vpdiff += step;
        }
        step >>= 1;
        if ( diff >= step  ) {
            delta |= 2;
            diff -= step;
            vpdiff += step;
        }
        step >>= 1;
        if ( diff >= step ) {
            delta |= 1;
            vpdiff += step;
        }

        /* Step 3 - Update previous value */
        if ( sign )
            valpred -= vpdiff;
        else
            valpred += vpdiff;

        /* Step 4 - Clamp previous value to 16 bits */
        if ( valpred > 32767 )
            valpred = 32767;
        else if ( valpred < -32768 )
            valpred = -32768;

        /* Step 5 - Assemble value, update index and step values */
        delta |= sign;

        index += indexTable[delta];
        if ( index < 0 ) index = 0;
        if ( index > 88 ) index = 88;
        step = stepsizeTable[index];

        /* Step 6 - Output value */
        if ( bufferstep ) {
            outputbuffer = (delta << 4) & 0xf0;
        } else {
            *ncp++ = (delta & 0x0f) | outputbuffer;
        }
        bufferstep = !bufferstep;
    }
    rv = Py_BuildValue("(O(ii))", str, valpred, index);
    Py_DECREF(str);
    return rv;
}

static PyObject *
audioop_adpcm2lin(PyObject *self, PyObject *args)
{
    signed char *cp;
    signed char *ncp;
    Py_ssize_t len, i;
    int size, valpred, step, delta, index, sign, vpdiff;
    PyObject *rv, *str, *state;
    int inputbuffer = 0, bufferstep;

    if ( !PyArg_ParseTuple(args, "s#iO:adpcm2lin",
                           &cp, &len, &size, &state) )
        return 0;

    if (!audioop_check_size(size))
        return NULL;

    /* Decode state, should have (value, step) */
    if ( state == Py_None ) {
        /* First time, it seems. Set defaults */
        valpred = 0;
        index = 0;
    } else if ( !PyArg_ParseTuple(state, "ii", &valpred, &index) )
        return 0;

    if (len > (PY_SSIZE_T_MAX/2)/size) {
        PyErr_SetString(PyExc_MemoryError,
                        "not enough memory for output buffer");
        return 0;
    }
    str = PyBytes_FromStringAndSize(NULL, len*size*2);
    if ( str == 0 )
        return 0;
    ncp = (signed char *)PyBytes_AsString(str);

    step = stepsizeTable[index];
    bufferstep = 0;

    for ( i=0; i < len*size*2; i += size ) {
        /* Step 1 - get the delta value and compute next index */
        if ( bufferstep ) {
            delta = inputbuffer & 0xf;
        } else {
            inputbuffer = *cp++;
            delta = (inputbuffer >> 4) & 0xf;
        }

        bufferstep = !bufferstep;

        /* Step 2 - Find new index value (for later) */
        index += indexTable[delta];
        if ( index < 0 ) index = 0;
        if ( index > 88 ) index = 88;

        /* Step 3 - Separate sign and magnitude */
        sign = delta & 8;
        delta = delta & 7;

        /* Step 4 - Compute difference and new predicted value */
        /*
        ** Computes 'vpdiff = (delta+0.5)*step/4', but see comment
        ** in adpcm_coder.
        */
        vpdiff = step >> 3;
        if ( delta & 4 ) vpdiff += step;
        if ( delta & 2 ) vpdiff += step>>1;
        if ( delta & 1 ) vpdiff += step>>2;

        if ( sign )
            valpred -= vpdiff;
        else
            valpred += vpdiff;

        /* Step 5 - clamp output value */
        if ( valpred > 32767 )
            valpred = 32767;
        else if ( valpred < -32768 )
            valpred = -32768;

        /* Step 6 - Update step value */
        step = stepsizeTable[index];

        /* Step 6 - Output value */
        if ( size == 1 ) *CHARP(ncp, i) = (signed char)(valpred >> 8);
        else if ( size == 2 ) *SHORTP(ncp, i) = (short)(valpred);
        else if ( size == 4 ) *LONGP(ncp, i) = (Py_Int32)(valpred<<16);
    }

    rv = Py_BuildValue("(O(ii))", str, valpred, index);
    Py_DECREF(str);
    return rv;
}

static PyMethodDef audioop_methods[] = {
    { "max", audioop_max, METH_VARARGS },
    { "minmax", audioop_minmax, METH_VARARGS },
    { "avg", audioop_avg, METH_VARARGS },
    { "maxpp", audioop_maxpp, METH_VARARGS },
    { "avgpp", audioop_avgpp, METH_VARARGS },
    { "rms", audioop_rms, METH_VARARGS },
    { "findfit", audioop_findfit, METH_VARARGS },
    { "findmax", audioop_findmax, METH_VARARGS },
    { "findfactor", audioop_findfactor, METH_VARARGS },
    { "cross", audioop_cross, METH_VARARGS },
    { "mul", audioop_mul, METH_VARARGS },
    { "add", audioop_add, METH_VARARGS },
    { "bias", audioop_bias, METH_VARARGS },
    { "ulaw2lin", audioop_ulaw2lin, METH_VARARGS },
    { "lin2ulaw", audioop_lin2ulaw, METH_VARARGS },
    { "alaw2lin", audioop_alaw2lin, METH_VARARGS },
    { "lin2alaw", audioop_lin2alaw, METH_VARARGS },
    { "lin2lin", audioop_lin2lin, METH_VARARGS },
    { "adpcm2lin", audioop_adpcm2lin, METH_VARARGS },
    { "lin2adpcm", audioop_lin2adpcm, METH_VARARGS },
    { "tomono", audioop_tomono, METH_VARARGS },
    { "tostereo", audioop_tostereo, METH_VARARGS },
    { "getsample", audioop_getsample, METH_VARARGS },
    { "reverse", audioop_reverse, METH_VARARGS },
    { "ratecv", audioop_ratecv, METH_VARARGS },
    { 0,          0 }
};


static struct PyModuleDef audioopmodule = {
    PyModuleDef_HEAD_INIT,
    "audioop",
    NULL,
    -1,
    audioop_methods,
    NULL,
    NULL,
    NULL,
    NULL
};

PyMODINIT_FUNC
PyInit_audioop(void)
{
    PyObject *m, *d;
    m = PyModule_Create(&audioopmodule);
    if (m == NULL)
        return NULL;
    d = PyModule_GetDict(m);
    if (d == NULL)
        return NULL;
    AudioopError = PyErr_NewException("audioop.error", NULL, NULL);
    if (AudioopError != NULL)
         PyDict_SetItemString(d,"error",AudioopError);
    return m;
}
