diff libaf/af_resample.c @ 14433:95bb94a930a3

always cancel down fractions (frac_t) to avoid overflows and playback problems (e.g. when using resample and equalizer filters together, see http://mplayerhq.hu/pipermail/mplayer-users/2004-December/050058.html)
author reimar
date Sat, 08 Jan 2005 21:34:06 +0000
parents de13fd557440
children 934380353fd6
line wrap: on
line diff
--- a/libaf/af_resample.c	Sat Jan 08 21:06:04 2005 +0000
+++ b/libaf/af_resample.c	Sat Jan 08 21:34:06 2005 +0000
@@ -62,22 +62,6 @@
   int		setup;	// Setup parameters cmdline or through postcreate
 } af_resample_t;
 
-// Euclids algorithm for calculating Greatest Common Divisor GCD(a,b)
-static inline int gcd(register int a, register int b)
-{
-  register int r = min(a,b);
-  a=max(a,b);
-  b=r;
-
-  r=a%b;
-  while(r!=0){
-    a=b;
-    b=r;
-    r=a%b;
-  }
-  return b;
-}
-
 // Fast linear interpolation resample with modest audio quality
 static int linint(af_data_t* c,af_data_t* l, af_resample_t* s)
 {
@@ -202,11 +186,12 @@
 	     s->step);
       af->mul.n = af->data->rate;
       af->mul.d = n->rate;
+      af_frac_cancel(&af->mul);
       return rv;
     }
 
     // Calculate up and down sampling factors
-    d=gcd(af->data->rate,n->rate);
+    d=af_gcd(af->data->rate,n->rate);
 
     // If sloppy resampling is enabled limit the upsampling factor
     if(((s->setup & FREQ_MASK) == FREQ_SLOPPY) && (af->data->rate/d > 5000)){
@@ -214,7 +199,7 @@
       int dn=n->rate/2;
       int m=2;
       while(af->data->rate/(d*m) > 5000){
-	d=gcd(up,dn); 
+	d=af_gcd(up,dn); 
 	up/=2; dn/=2; m*=2;
       }
       d*=m;