# HG changeset patch # User Matti Hamalainen # Date 1104409742 0 # Node ID 7a5dc68986596032fbcadaf7108341d596839ac5 # Parent 7c49095b9c52b8c8559bc59ce1ce4244baa56e26 Fixed filter signedness bugs. diff -r 7c49095b9c52 -r 7a5dc6898659 src/xs_filter.c --- 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: