changeset 28201:4ff973912251

Rename libaf/af_resample.h to libaf/af_resample_template.c, it is used as a macro, not as a header file.
author diego
date Fri, 02 Jan 2009 16:13:22 +0000
parents 56868e6fb340
children b2e17894b4d0
files libaf/af_resample.c libaf/af_resample.h libaf/af_resample_template.c
diffstat 3 files changed, 170 insertions(+), 170 deletions(-) [+]
line wrap: on
line diff
--- a/libaf/af_resample.c	Fri Jan 02 14:41:38 2009 +0000
+++ b/libaf/af_resample.c	Fri Jan 02 16:13:22 2009 +0000
@@ -31,7 +31,7 @@
 #define L16
 #endif
 
-#include "af_resample.h"
+#include "af_resample_template.c"
 
 // Filtering types
 #define RSMP_LIN   	(0<<0)	// Linear interpolation
@@ -316,12 +316,12 @@
 # define FORMAT_I 1
     if(s->up>s->dn){
 #     define UP
-#     include "af_resample.h"
+#     include "af_resample_template.c"
 #     undef UP 
     }
     else{
 #     define DN
-#     include "af_resample.h"
+#     include "af_resample_template.c"
 #     undef DN
     }
     break;
@@ -330,12 +330,12 @@
 # define FORMAT_F 1
     if(s->up>s->dn){
 #     define UP
-#     include "af_resample.h"
+#     include "af_resample_template.c"
 #     undef UP 
     }
     else{
 #     define DN
-#     include "af_resample.h"
+#     include "af_resample_template.c"
 #     undef DN
     }
     break;
--- a/libaf/af_resample.h	Fri Jan 02 14:41:38 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,165 +0,0 @@
-/*=============================================================================
-//	
-//  This software has been released under the terms of the GNU General Public
-//  license. See http://www.gnu.org/copyleft/gpl.html for details.
-//
-//  Copyright 2002 Anders Johansson ajh@atri.curtin.edu.au
-//
-//=============================================================================
-*/
-
-/* This file contains the resampling engine, the sample format is
-   controlled by the FORMAT parameter, the filter length by the L
-   parameter and the resampling type by UP and DN. This file should
-   only be included by af_resample.c 
-*/ 
-
-/* This header intentionally has no multiple inclusion guards. It is meant to
- * be included multiple times and generates different code depending on the
- * value of certain #defines. */
-
-#undef L
-#undef SHIFT
-#undef FORMAT
-#undef FIR
-#undef ADDQUE
-
-/* The length Lxx definition selects the length of each poly phase
-   component. Valid definitions are L8 and L16 where the number
-   defines the nuber of taps. This definition affects the
-   computational complexity, the performance and the memory usage.
-*/
-
-/* The FORMAT_x parameter selects the sample format type currently
-   float and int16 are supported. Thes two formats are selected by
-   defining eiter FORMAT_F or FORMAT_I. The advantage of using float
-   is that the amplitude and therefore the SNR isn't affected by the
-   filtering, the disadvantage is that it is a lot slower.
-*/
-
-#if defined(FORMAT_I)
-#define SHIFT >>16
-#define FORMAT int16_t
-#else 
-#define SHIFT
-#define FORMAT float
-#endif
-
-// Short filter
-#if defined(L8) 
-
-#define L   	8	// Filter length
-// Unrolled loop to speed up execution 
-#define FIR(x,w,y) \
-  (y[0])  = ( w[0]*x[0]+w[1]*x[1]+w[2]*x[2]+w[3]*x[3] \
-            + w[4]*x[4]+w[5]*x[5]+w[6]*x[6]+w[7]*x[7] ) SHIFT
-
-
-
-#else  /* L8/L16 */
-
-#define L   	16
-// Unrolled loop to speed up execution 
-#define FIR(x,w,y) \
-  y[0] = ( w[0] *x[0] +w[1] *x[1] +w[2] *x[2] +w[3] *x[3] \
-         + w[4] *x[4] +w[5] *x[5] +w[6] *x[6] +w[7] *x[7] \
-         + w[8] *x[8] +w[9] *x[9] +w[10]*x[10]+w[11]*x[11] \
-         + w[12]*x[12]+w[13]*x[13]+w[14]*x[14]+w[15]*x[15] ) SHIFT
-
-#endif /* L8/L16 */
-
-// Macro to add data to circular que 
-#define ADDQUE(xi,xq,in)\
-  xq[xi]=xq[(xi)+L]=*(in);\
-  xi=((xi)-1)&(L-1);
-
-#if defined(UP)
-
-  uint32_t		ci    = l->nch; 	// Index for channels
-  uint32_t		nch   = l->nch;   	// Number of channels
-  uint32_t		inc   = s->up/s->dn; 
-  uint32_t		level = s->up%s->dn; 
-  uint32_t		up    = s->up;
-  uint32_t		dn    = s->dn;
-  uint32_t		ns    = c->len/l->bps;
-  register FORMAT*	w     = s->w;
-
-  register uint32_t	wi    = 0;
-  register uint32_t	xi    = 0; 
-
-  // Index current channel
-  while(ci--){
-    // Temporary pointers
-    register FORMAT*	x     = s->xq[ci];
-    register FORMAT*	in    = ((FORMAT*)c->audio)+ci;
-    register FORMAT*	out   = ((FORMAT*)l->audio)+ci;
-    FORMAT* 		end   = in+ns; // Block loop end
-    wi = s->wi; xi = s->xi;
-
-    while(in < end){
-      register uint32_t	i = inc;
-      if(wi<level) i++;
-
-      ADDQUE(xi,x,in);
-      in+=nch;
-      while(i--){
-	// Run the FIR filter
-	FIR((&x[xi]),(&w[wi*L]),out);
-	len++; out+=nch;
-	// Update wi to point at the correct polyphase component
-	wi=(wi+dn)%up;
-      }
-    }
-
-  }
-  // Save values that needs to be kept for next time
-  s->wi = wi;
-  s->xi = xi;
-#endif /* UP */
-
-#if defined(DN) /* DN */
-  uint32_t		ci    = l->nch; 	// Index for channels
-  uint32_t		nch   = l->nch;   	// Number of channels
-  uint32_t		inc   = s->dn/s->up; 
-  uint32_t		level = s->dn%s->up; 
-  uint32_t		up    = s->up;
-  uint32_t		dn    = s->dn;
-  uint32_t		ns    = c->len/l->bps;
-  FORMAT*		w     = s->w;
-
-  register int32_t	i     = 0;
-  register uint32_t	wi    = 0;
-  register uint32_t	xi    = 0;
-  
-  // Index current channel
-  while(ci--){
-    // Temporary pointers
-    register FORMAT*	x     = s->xq[ci];
-    register FORMAT*	in    = ((FORMAT*)c->audio)+ci;
-    register FORMAT*	out   = ((FORMAT*)l->audio)+ci;
-    register FORMAT* 	end   = in+ns;    // Block loop end
-    i = s->i; wi = s->wi; xi = s->xi;
-
-    while(in < end){
-
-      ADDQUE(xi,x,in);
-      in+=nch;
-      if((--i)<=0){
-	// Run the FIR filter
-	FIR((&x[xi]),(&w[wi*L]),out);
-	len++;	out+=nch;
-
-	// Update wi to point at the correct polyphase component
-	wi=(wi+dn)%up;  
-
-	// Insert i number of new samples in queue
-	i = inc;
-	if(wi<level) i++;
-      }
-    }
-  }
-  // Save values that needs to be kept for next time
-  s->wi = wi;
-  s->xi = xi;
-  s->i = i;
-#endif /* DN */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libaf/af_resample_template.c	Fri Jan 02 16:13:22 2009 +0000
@@ -0,0 +1,165 @@
+/*=============================================================================
+//	
+//  This software has been released under the terms of the GNU General Public
+//  license. See http://www.gnu.org/copyleft/gpl.html for details.
+//
+//  Copyright 2002 Anders Johansson ajh@atri.curtin.edu.au
+//
+//=============================================================================
+*/
+
+/* This file contains the resampling engine, the sample format is
+   controlled by the FORMAT parameter, the filter length by the L
+   parameter and the resampling type by UP and DN. This file should
+   only be included by af_resample.c 
+*/ 
+
+/* This header intentionally has no multiple inclusion guards. It is meant to
+ * be included multiple times and generates different code depending on the
+ * value of certain #defines. */
+
+#undef L
+#undef SHIFT
+#undef FORMAT
+#undef FIR
+#undef ADDQUE
+
+/* The length Lxx definition selects the length of each poly phase
+   component. Valid definitions are L8 and L16 where the number
+   defines the nuber of taps. This definition affects the
+   computational complexity, the performance and the memory usage.
+*/
+
+/* The FORMAT_x parameter selects the sample format type currently
+   float and int16 are supported. Thes two formats are selected by
+   defining eiter FORMAT_F or FORMAT_I. The advantage of using float
+   is that the amplitude and therefore the SNR isn't affected by the
+   filtering, the disadvantage is that it is a lot slower.
+*/
+
+#if defined(FORMAT_I)
+#define SHIFT >>16
+#define FORMAT int16_t
+#else 
+#define SHIFT
+#define FORMAT float
+#endif
+
+// Short filter
+#if defined(L8) 
+
+#define L   	8	// Filter length
+// Unrolled loop to speed up execution 
+#define FIR(x,w,y) \
+  (y[0])  = ( w[0]*x[0]+w[1]*x[1]+w[2]*x[2]+w[3]*x[3] \
+            + w[4]*x[4]+w[5]*x[5]+w[6]*x[6]+w[7]*x[7] ) SHIFT
+
+
+
+#else  /* L8/L16 */
+
+#define L   	16
+// Unrolled loop to speed up execution 
+#define FIR(x,w,y) \
+  y[0] = ( w[0] *x[0] +w[1] *x[1] +w[2] *x[2] +w[3] *x[3] \
+         + w[4] *x[4] +w[5] *x[5] +w[6] *x[6] +w[7] *x[7] \
+         + w[8] *x[8] +w[9] *x[9] +w[10]*x[10]+w[11]*x[11] \
+         + w[12]*x[12]+w[13]*x[13]+w[14]*x[14]+w[15]*x[15] ) SHIFT
+
+#endif /* L8/L16 */
+
+// Macro to add data to circular que 
+#define ADDQUE(xi,xq,in)\
+  xq[xi]=xq[(xi)+L]=*(in);\
+  xi=((xi)-1)&(L-1);
+
+#if defined(UP)
+
+  uint32_t		ci    = l->nch; 	// Index for channels
+  uint32_t		nch   = l->nch;   	// Number of channels
+  uint32_t		inc   = s->up/s->dn; 
+  uint32_t		level = s->up%s->dn; 
+  uint32_t		up    = s->up;
+  uint32_t		dn    = s->dn;
+  uint32_t		ns    = c->len/l->bps;
+  register FORMAT*	w     = s->w;
+
+  register uint32_t	wi    = 0;
+  register uint32_t	xi    = 0; 
+
+  // Index current channel
+  while(ci--){
+    // Temporary pointers
+    register FORMAT*	x     = s->xq[ci];
+    register FORMAT*	in    = ((FORMAT*)c->audio)+ci;
+    register FORMAT*	out   = ((FORMAT*)l->audio)+ci;
+    FORMAT* 		end   = in+ns; // Block loop end
+    wi = s->wi; xi = s->xi;
+
+    while(in < end){
+      register uint32_t	i = inc;
+      if(wi<level) i++;
+
+      ADDQUE(xi,x,in);
+      in+=nch;
+      while(i--){
+	// Run the FIR filter
+	FIR((&x[xi]),(&w[wi*L]),out);
+	len++; out+=nch;
+	// Update wi to point at the correct polyphase component
+	wi=(wi+dn)%up;
+      }
+    }
+
+  }
+  // Save values that needs to be kept for next time
+  s->wi = wi;
+  s->xi = xi;
+#endif /* UP */
+
+#if defined(DN) /* DN */
+  uint32_t		ci    = l->nch; 	// Index for channels
+  uint32_t		nch   = l->nch;   	// Number of channels
+  uint32_t		inc   = s->dn/s->up; 
+  uint32_t		level = s->dn%s->up; 
+  uint32_t		up    = s->up;
+  uint32_t		dn    = s->dn;
+  uint32_t		ns    = c->len/l->bps;
+  FORMAT*		w     = s->w;
+
+  register int32_t	i     = 0;
+  register uint32_t	wi    = 0;
+  register uint32_t	xi    = 0;
+  
+  // Index current channel
+  while(ci--){
+    // Temporary pointers
+    register FORMAT*	x     = s->xq[ci];
+    register FORMAT*	in    = ((FORMAT*)c->audio)+ci;
+    register FORMAT*	out   = ((FORMAT*)l->audio)+ci;
+    register FORMAT* 	end   = in+ns;    // Block loop end
+    i = s->i; wi = s->wi; xi = s->xi;
+
+    while(in < end){
+
+      ADDQUE(xi,x,in);
+      in+=nch;
+      if((--i)<=0){
+	// Run the FIR filter
+	FIR((&x[xi]),(&w[wi*L]),out);
+	len++;	out+=nch;
+
+	// Update wi to point at the correct polyphase component
+	wi=(wi+dn)%up;  
+
+	// Insert i number of new samples in queue
+	i = inc;
+	if(wi<level) i++;
+      }
+    }
+  }
+  // Save values that needs to be kept for next time
+  s->wi = wi;
+  s->xi = xi;
+  s->i = i;
+#endif /* DN */