comparison src/xs_filter.c @ 312:7a5dc6898659

Fixed filter signedness bugs.
author Matti Hamalainen <ccr@tnsp.org>
date Thu, 30 Dec 2004 12:29:02 +0000
parents d5c79d5a0b60
children dd201740a720
comparison
equal deleted inserted replaced
311:7c49095b9c52 312:7a5dc6898659
22 #include "xmms-sid.h" 22 #include "xmms-sid.h"
23 23
24 /* Let's do some preprocessor magic :) */ 24 /* Let's do some preprocessor magic :) */
25 #define XS_FVAR(T, P, K) g ## K ## int ## P *sp_ ## T ## P , *dp_ ## T ## P 25 #define XS_FVAR(T, P, K) g ## K ## int ## P *sp_ ## T ## P , *dp_ ## T ## P
26 26
27 #define XS_FILTER1(T, P, K) \ 27 #define XS_FILTER1(T, P, K, Q) \
28 dataSize /= sizeof(g ## K ## int ## P); tmpo_ ## T = 0; \ 28 dataSize /= sizeof(g ## K ## int ## P); tmpo = 0; \
29 sp_ ## T ## P = (g ## K ## int ## P *) srcBuf; \ 29 sp_ ## T ## P = (g ## K ## int ## P *) srcBuf; \
30 dp_ ## T ## P = (g ## K ## int ## P *) destBuf; \ 30 dp_ ## T ## P = (g ## K ## int ## P *) destBuf; \
31 while (dataSize-- > 0) { \ 31 while (dataSize-- > 0) { \
32 for (tmp_ ## T = 0, i = 0; i < oversampleFactor; i++) \ 32 for (tmp = 0, i = 0; i < oversampleFactor; i++) \
33 tmp_ ## T += *(sp_ ## T ## P ++); \ 33 tmp += (gint32) ((gint ## P) (*(sp_ ## T ## P ++) Q)); \
34 tmpo_ ## T = (tmp_ ## T + tmpo_ ## T ) / (oversampleFactor * 2); \ 34 tmpo = (tmp + tmpo) / (oversampleFactor + 1); \
35 *(dp_ ## T ## P ++) = tmpo_ ## T; \ 35 *(dp_ ## T ## P ++) = ((g ## K ## int ## P) tmpo) Q ; \
36 } 36 }
37 37
38 gint xs_rateconv_filter(void *destBuf, void *srcBuf, AFormat audioFormat, gint oversampleFactor, gint dataSize) 38 gint xs_rateconv_filter(void *destBuf, void *srcBuf, AFormat audioFormat, gint oversampleFactor, gint dataSize)
39 { 39 {
40 guint32 tmp_u, tmpo_u; 40 gint32 tmp, tmpo;
41 gint32 tmp_s, tmpo_s; 41 XS_FVAR(s,8,);
42 XS_FVAR(u, 8, u); 42 XS_FVAR(u,8,u);
43 XS_FVAR(s, 8,); 43 XS_FVAR(s,16,);
44 XS_FVAR(u, 16, u); 44 XS_FVAR(u,16,u);
45 XS_FVAR(s, 16,);
46 gint i; 45 gint i;
47 46
48 if (dataSize <= 0) 47 if (dataSize <= 0)
49 return dataSize; 48 return dataSize;
50 49
51 switch (audioFormat) { 50 switch (audioFormat) {
52 case FMT_U8: 51 case FMT_U8:
52 XS_FILTER1(u,8,u, ^ 0x80)
53 break;
54
53 case FMT_S8: 55 case FMT_S8:
54 XS_FILTER1(s, 8,); 56 XS_FILTER1(s,8,,)
55 break; 57 break;
56 58
57 59
58 case FMT_U16_BE: 60 case FMT_U16_BE:
59 case FMT_U16_LE: 61 case FMT_U16_LE:
60 case FMT_U16_NE: 62 case FMT_U16_NE:
63 XS_FILTER1(u,16,u, ^ 0x8000)
64 break;
61 65
62 case FMT_S16_BE: 66 case FMT_S16_BE:
63 case FMT_S16_LE: 67 case FMT_S16_LE:
64 case FMT_S16_NE: 68 case FMT_S16_NE:
65 XS_FILTER1(s, 16,); 69 XS_FILTER1(s,16,,)
66 break; 70 break;
67 71
68 default: 72 default:
69 return -1; 73 return -1;
70 } 74 }