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 }