Mercurial > hg > xmms-sid
diff src/xs_support.c @ 714:229fa2d043b9
Moved filter routines to xs_support.[ch].
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Mon, 09 Feb 2009 14:56:56 +0200 |
parents | 180d7a0250d8 |
children | 9321ffa2ea7e |
line wrap: on
line diff
--- a/src/xs_support.c Mon Feb 09 13:23:32 2009 +0200 +++ b/src/xs_support.c Mon Feb 09 14:56:56 2009 +0200 @@ -243,3 +243,64 @@ (*pos)++; } + +/* 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, Q) \ + dataSize /= sizeof(g ## K ## int ## P); \ + sp_ ## T ## P = (g ## K ## int ## P *) srcBuf; \ + dp_ ## T ## P = (g ## K ## int ## P *) destBuf; \ + while (dataSize-- > 0) { \ + for (tmp = 0, i = 0; i < oversampleFactor; i++) \ + tmp += (gint32) ((gint ## P) (*(sp_ ## T ## P ++) Q)); \ + xs_filter_mbn = (tmp + xs_filter_mbn) / (oversampleFactor + 1); \ + *(dp_ ## T ## P ++) = ((g ## K ## int ## P) xs_filter_mbn) Q ; \ + } + + +static gint32 xs_filter_mbn = 0; + + +gint xs_filter_rateconv(void *destBuf, void *srcBuf, const AFormat audioFormat, + const gint oversampleFactor, const gint bufSize) +{ + static gint32 tmp; + XS_FVAR(s, 8,); + XS_FVAR(u, 8, u); + XS_FVAR(s, 16,); + XS_FVAR(u, 16, u); + gint i; + gint dataSize = bufSize; + + if (dataSize <= 0) + return dataSize; + + switch (audioFormat) { + case FMT_U8: + XS_FILTER1(u, 8, u, ^0x80) + break; + + case FMT_S8: + 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,,) + break; + + default: + return -1; + } + + return 0; +}