From b24c9ea51491e620f99b813cec1b015c968415bf Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Tue, 20 May 1997 15:59:35 +0000 Subject: [PATCH] fixed ratecv to continue working if product of rates is bigger than 32 bits (Sjoerd) --- Modules/audioop.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/Modules/audioop.c b/Modules/audioop.c index 003f8af5cb7..471f851fa2a 100644 --- a/Modules/audioop.c +++ b/Modules/audioop.c @@ -945,6 +945,18 @@ audioop_lin2lin(self, args) return rv; } +static int +gcd(a, b) + int a, b; +{ + while (b > 0) { + int tmp = a % b; + a = b; + b = tmp; + } + return a; +} + static PyObject * audioop_ratecv(self, args) PyObject *self; @@ -977,6 +989,15 @@ audioop_ratecv(self, args) 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; + prev_i = malloc(nchannels * sizeof(int)); cur_i = malloc(nchannels * sizeof(int)); len /= size * nchannels; /* # of frames */