diff src/sid/xs_filter.c @ 12:3da1b8942b8b trunk

[svn] - remove src/Input src/Output src/Effect src/General src/Visualization src/Container
author nenolod
date Mon, 18 Sep 2006 03:14:20 -0700
parents src/Input/sid/xs_filter.c@13389e613d67
children 6c3c7b841382
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/sid/xs_filter.c	Mon Sep 18 03:14:20 2006 -0700
@@ -0,0 +1,84 @@
+/*  
+   XMMS-SID - SIDPlay input plugin for X MultiMedia System (XMMS)
+
+   Audio rate-conversion filter
+   
+   Programmed and designed by Matti 'ccr' Hamalainen <ccr@tnsp.org>
+   (C) Copyright 1999-2005 Tecnic Software productions (TNSP)
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+#include "xs_filter.h"
+
+/* 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;
+}