changeset 312:7a5dc6898659

Fixed filter signedness bugs.
author Matti Hamalainen <ccr@tnsp.org>
date Thu, 30 Dec 2004 12:29:02 +0000
parents 7c49095b9c52
children b2707c970c9c
files src/xs_filter.c
diffstat 1 files changed, 18 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/src/xs_filter.c	Thu Dec 30 11:37:05 2004 +0000
+++ b/src/xs_filter.c	Thu Dec 30 12:29:02 2004 +0000
@@ -24,25 +24,24 @@
 /* Let's do some preprocessor magic :) */
 #define XS_FVAR(T, P, K) g ## K ## int ## P *sp_ ## T ## P , *dp_ ## T ## P
 
-#define XS_FILTER1(T, P, K)							\
-	dataSize /= sizeof(g ## K ## int ## P); tmpo_ ## T = 0;			\
+#define XS_FILTER1(T, P, K, Q)							\
+	dataSize /= sizeof(g ## K ## int ## P); tmpo = 0;			\
 	sp_ ## T ## P = (g ## K ## int ## P *) srcBuf;				\
 	dp_ ## T ## P = (g ## K ## int ## P *) destBuf;				\
 	while (dataSize-- > 0) {						\
-		for (tmp_ ## T = 0, i = 0; i < oversampleFactor; i++)		\
-			tmp_ ## T += *(sp_ ## T ## P ++);			\
-		tmpo_ ## T = (tmp_ ## T + tmpo_ ## T ) / (oversampleFactor * 2);	\
-		*(dp_ ## T ## P ++) = tmpo_ ## T;				\
+		for (tmp = 0, i = 0; i < oversampleFactor; i++)			\
+			tmp += (gint32) ((gint ## P) (*(sp_ ## T ## P ++) Q));	\
+		tmpo = (tmp + tmpo) / (oversampleFactor + 1);			\
+		*(dp_ ## T ## P ++) = ((g ## K ## int ## P) tmpo) Q ;		\
 		}
 
 gint xs_rateconv_filter(void *destBuf, void *srcBuf, AFormat audioFormat, gint oversampleFactor, gint dataSize)
 {
- guint32 tmp_u, tmpo_u;
- gint32 tmp_s, tmpo_s;
- XS_FVAR(u, 8, u);
- XS_FVAR(s, 8,);
- XS_FVAR(u, 16, u);
- XS_FVAR(s, 16,);
+ gint32 tmp, tmpo;
+ XS_FVAR(s,8,);
+ XS_FVAR(u,8,u);
+ XS_FVAR(s,16,);
+ XS_FVAR(u,16,u);
  gint i;
  
  if (dataSize <= 0)
@@ -50,19 +49,24 @@
 
  switch (audioFormat) {
  case FMT_U8:
+ 	XS_FILTER1(u,8,u, ^ 0x80)
+	break;
+	
  case FMT_S8:
- 	XS_FILTER1(s, 8,);
+ 	XS_FILTER1(s,8,,)
  	break;
  	
 
  case FMT_U16_BE:
  case FMT_U16_LE:
  case FMT_U16_NE:
+ 	XS_FILTER1(u,16,u, ^ 0x8000)
+ 	break;
  	
  case FMT_S16_BE:
  case FMT_S16_LE:
  case FMT_S16_NE:
- 	XS_FILTER1(s, 16,);
+ 	XS_FILTER1(s,16,,)
  	break;
 
  default: