Mercurial > hg > xmms-sid
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 } |