Mercurial > hg > xmms-sid
comparison 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 |
comparison
equal
deleted
inserted
replaced
713:06db79680afe | 714:229fa2d043b9 |
---|---|
241 { | 241 { |
242 while (str[*pos] && isdigit(str[*pos])) | 242 while (str[*pos] && isdigit(str[*pos])) |
243 (*pos)++; | 243 (*pos)++; |
244 } | 244 } |
245 | 245 |
246 | |
247 /* Let's do some preprocessor magic :) */ | |
248 #define XS_FVAR(T, P, K) g ## K ## int ## P *sp_ ## T ## P , *dp_ ## T ## P | |
249 | |
250 #define XS_FILTER1(T, P, K, Q) \ | |
251 dataSize /= sizeof(g ## K ## int ## P); \ | |
252 sp_ ## T ## P = (g ## K ## int ## P *) srcBuf; \ | |
253 dp_ ## T ## P = (g ## K ## int ## P *) destBuf; \ | |
254 while (dataSize-- > 0) { \ | |
255 for (tmp = 0, i = 0; i < oversampleFactor; i++) \ | |
256 tmp += (gint32) ((gint ## P) (*(sp_ ## T ## P ++) Q)); \ | |
257 xs_filter_mbn = (tmp + xs_filter_mbn) / (oversampleFactor + 1); \ | |
258 *(dp_ ## T ## P ++) = ((g ## K ## int ## P) xs_filter_mbn) Q ; \ | |
259 } | |
260 | |
261 | |
262 static gint32 xs_filter_mbn = 0; | |
263 | |
264 | |
265 gint xs_filter_rateconv(void *destBuf, void *srcBuf, const AFormat audioFormat, | |
266 const gint oversampleFactor, const gint bufSize) | |
267 { | |
268 static gint32 tmp; | |
269 XS_FVAR(s, 8,); | |
270 XS_FVAR(u, 8, u); | |
271 XS_FVAR(s, 16,); | |
272 XS_FVAR(u, 16, u); | |
273 gint i; | |
274 gint dataSize = bufSize; | |
275 | |
276 if (dataSize <= 0) | |
277 return dataSize; | |
278 | |
279 switch (audioFormat) { | |
280 case FMT_U8: | |
281 XS_FILTER1(u, 8, u, ^0x80) | |
282 break; | |
283 | |
284 case FMT_S8: | |
285 XS_FILTER1(s, 8,,) | |
286 break; | |
287 | |
288 | |
289 case FMT_U16_BE: | |
290 case FMT_U16_LE: | |
291 case FMT_U16_NE: | |
292 XS_FILTER1(u, 16, u, ^0x8000) | |
293 break; | |
294 | |
295 case FMT_S16_BE: | |
296 case FMT_S16_LE: | |
297 case FMT_S16_NE: | |
298 XS_FILTER1(s, 16,,) | |
299 break; | |
300 | |
301 default: | |
302 return -1; | |
303 } | |
304 | |
305 return 0; | |
306 } |