shithub: dumb

Download patch

ref: 7c2cc8b01ae64355772be20f7d5edd4e30bd1e08
parent: eff0f2541daf739f21bb0662345915f4fa60354f
author: Chris Moeller <[email protected]>
date: Mon Jan 11 04:02:22 EST 2010

{12/17/2009 2:12:36 AM}Reverted sinc interpolation until I feel like fixing it

git-tfs-id: [http://localhost:8080/tfs/DefaultCollection/]$/foobar2000/files/plugins.root;C365

--- a/dumb/include/dumb.h
+++ b/dumb/include/dumb.h
@@ -641,8 +641,7 @@
 #define DUMB_RQ_ALIASING 0
 #define DUMB_RQ_LINEAR   1
 #define DUMB_RQ_CUBIC    2
-#define DUMB_RQ_SINC     3
-#define DUMB_RQ_N_LEVELS 4
+#define DUMB_RQ_N_LEVELS 3
 extern int dumb_resampling_quality;
 
 typedef struct DUMB_RESAMPLER DUMB_RESAMPLER;
@@ -663,9 +662,9 @@
 	int quality;
 	/* Everything below this point is internal: do not use. */
 	union {
-		sample_t x24[7*2];
-		short x16[7*2];
-		signed char x8[7*2];
+		sample_t x24[3*2];
+		short x16[3*2];
+		signed char x8[3*2];
 	} x;
 	int overshot;
 };
--- a/dumb/src/helpers/resamp2.inc
+++ b/dumb/src/helpers/resamp2.inc
@@ -52,7 +52,7 @@
 	if (resampler->overshot < 0) {
 		resampler->overshot = 0;
 		dumb_resample(resampler, NULL, 2, MONO_DEST_VOLUME_ZEROS, 1.0f); /* Doesn't matter which SUFFIX3. */
-		//COPYSRC(resampler->X, 0, resampler->X, 1);
+		COPYSRC(resampler->X, 0, resampler->X, 1);
 	}
 
 	for (;;) {
@@ -59,22 +59,14 @@
 		SRCTYPE *src = resampler->src;
 
 		if (resampler->dir < 0) {
-			if (resampler->overshot >= 7 && resampler->pos+7 >= resampler->start) COPYSRC(resampler->X, 0, src, resampler->pos+7);
-			if (resampler->overshot >= 6 && resampler->pos+6 >= resampler->start) COPYSRC(resampler->X, 1, src, resampler->pos+6);
-			if (resampler->overshot >= 5 && resampler->pos+5 >= resampler->start) COPYSRC(resampler->X, 2, src, resampler->pos+5);
-			if (resampler->overshot >= 4 && resampler->pos+4 >= resampler->start) COPYSRC(resampler->X, 3, src, resampler->pos+4);
-			if (resampler->overshot >= 3 && resampler->pos+3 >= resampler->start) COPYSRC(resampler->X, 4, src, resampler->pos+3);
-			if (resampler->overshot >= 2 && resampler->pos+2 >= resampler->start) COPYSRC(resampler->X, 5, src, resampler->pos+2);
-			if (resampler->overshot >= 1 && resampler->pos+1 >= resampler->start) COPYSRC(resampler->X, 6, src, resampler->pos+1);
+			if (resampler->overshot >= 3 && resampler->pos+3 >= resampler->start) COPYSRC(resampler->X, 0, src, resampler->pos+3);
+			if (resampler->overshot >= 2 && resampler->pos+2 >= resampler->start) COPYSRC(resampler->X, 1, src, resampler->pos+2);
+			if (resampler->overshot >= 1 && resampler->pos+1 >= resampler->start) COPYSRC(resampler->X, 2, src, resampler->pos+1);
 			resampler->overshot = resampler->start - resampler->pos - 1;
 		} else {
-			if (resampler->overshot >= 7 && resampler->pos-7 < resampler->end) COPYSRC(resampler->X, 0, src, resampler->pos-7);
-			if (resampler->overshot >= 6 && resampler->pos-6 < resampler->end) COPYSRC(resampler->X, 1, src, resampler->pos-6);
-			if (resampler->overshot >= 5 && resampler->pos-5 < resampler->end) COPYSRC(resampler->X, 2, src, resampler->pos-5);
-			if (resampler->overshot >= 4 && resampler->pos-4 < resampler->end) COPYSRC(resampler->X, 3, src, resampler->pos-4);
-			if (resampler->overshot >= 3 && resampler->pos-3 < resampler->end) COPYSRC(resampler->X, 4, src, resampler->pos-3);
-			if (resampler->overshot >= 2 && resampler->pos-2 < resampler->end) COPYSRC(resampler->X, 5, src, resampler->pos-2);
-			if (resampler->overshot >= 1 && resampler->pos-1 < resampler->end) COPYSRC(resampler->X, 6, src, resampler->pos-1);
+			if (resampler->overshot >= 3 && resampler->pos-3 < resampler->end) COPYSRC(resampler->X, 0, src, resampler->pos-3);
+			if (resampler->overshot >= 2 && resampler->pos-2 < resampler->end) COPYSRC(resampler->X, 1, src, resampler->pos-2);
+			if (resampler->overshot >= 1 && resampler->pos-1 < resampler->end) COPYSRC(resampler->X, 2, src, resampler->pos-1);
 			resampler->overshot = resampler->pos - resampler->end;
 		}
 
@@ -105,7 +97,6 @@
 #define MIX_ALIAS(op, upd, offset) MONO_DEST_MIX_ALIAS(op, upd, offset)
 #define MIX_LINEAR(op, upd, o0, o1) MONO_DEST_MIX_LINEAR(op, upd, o0, o1)
 #define MIX_CUBIC(op, upd, x0, x3, o0, o1, o2, o3) MONO_DEST_MIX_CUBIC(op, upd, x0, x3, o0, o1, o2, o3)
-#define MIX_SINC(op, upd, x0, x7, o0, o1, o2, o3, o4, o5, o6, o7) MONO_DEST_MIX_SINC(op, upd, x0, x7, o0, o1, o2, o3, o4, o5, o6, o7)
 #define MIX_ZEROS(op) *dst++ op 0
 #include "resamp3.inc"
 
@@ -145,14 +136,11 @@
 #define MIX_ALIAS(op, upd, offset) STEREO_DEST_MIX_ALIAS(op, upd, offset)
 #define MIX_LINEAR(op, upd, o0, o1) STEREO_DEST_MIX_LINEAR(op, upd, o0, o1)
 #define MIX_CUBIC(op, upd, x0, x3, o0, o1, o2, o3) STEREO_DEST_MIX_CUBIC(op, upd, x0, x3, o0, o1, o2, o3)
-#define MIX_SINC(op, upd, x0, x7, o0, o1, o2, o3, o4, o5, o6, o7) STEREO_DEST_MIX_SINC(op, upd, x0, x7, o0, o1, o2, o3, o4, o5, o6, o7)
 #define MIX_ZEROS(op) { *dst++ op 0; *dst++ op 0; }
 #include "resamp3.inc"
 
 
 
-#undef STEREO_DEST_MIX_SINC
-#undef MONO_DEST_MIX_SINC
 #undef STEREO_DEST_MIX_CUBIC
 #undef MONO_DEST_MIX_CUBIC
 #undef STEREO_DEST_MIX_LINEAR
--- a/dumb/src/helpers/resamp3.inc
+++ b/dumb/src/helpers/resamp3.inc
@@ -64,7 +64,6 @@
 	if (VOLUMES_ARE_ZERO) dst = NULL;
 
 	init_cubic();
-	init_sinc();
 
 	quality = resampler->quality;
 
@@ -108,8 +107,8 @@
 					SRCTYPE xbuf[2*SRC_CHANNELS];
 					SRCTYPE *x = &xbuf[0];
 					SRCTYPE *xstart;
-					COPYSRC(xbuf, 0, resampler->X, 5);
-					COPYSRC(xbuf, 1, resampler->X, 6);
+					COPYSRC(xbuf, 0, resampler->X, 1);
+					COPYSRC(xbuf, 1, resampler->X, 2);
 					while (todo && x < &xbuf[2*SRC_CHANNELS]) {
 						// TODO: check what happens when multiple tempo slides occur per row
 						HEAVYASSERT(pos >= resampler->start);
@@ -132,8 +131,8 @@
 					/* Linear interpolation, backwards */
 					SRCTYPE xbuf[3*SRC_CHANNELS];
 					SRCTYPE *x = &xbuf[1*SRC_CHANNELS];
-					COPYSRC(xbuf, 0, resampler->X, 5);
-					COPYSRC(xbuf, 1, resampler->X, 6);
+					COPYSRC(xbuf, 0, resampler->X, 1);
+					COPYSRC(xbuf, 1, resampler->X, 2);
 					COPYSRC(xbuf, 2, src, pos);
 					while (todo && x < &xbuf[3*SRC_CHANNELS]) {
 						HEAVYASSERT(pos >= resampler->start);
@@ -154,13 +153,13 @@
 						x += (subpos >> 16) * SRC_CHANNELS;
 						subpos &= 65535;
 					);
-				} else if (quality <= DUMB_RQ_CUBIC) {
+				} else {
 					/* Cubic interpolation, backwards */
 					SRCTYPE xbuf[6*SRC_CHANNELS];
 					SRCTYPE *x = &xbuf[3*SRC_CHANNELS];
-					COPYSRC(xbuf, 0, resampler->X, 4);
-					COPYSRC(xbuf, 1, resampler->X, 5);
-					COPYSRC(xbuf, 2, resampler->X, 6);
+					COPYSRC(xbuf, 0, resampler->X, 0);
+					COPYSRC(xbuf, 1, resampler->X, 1);
+					COPYSRC(xbuf, 2, resampler->X, 2);
 					COPYSRC(xbuf, 3, src, pos);
 					if (pos-1 >= resampler->start) COPYSRC(xbuf, 4, src, pos-1);
 					if (pos-2 >= resampler->start) COPYSRC(xbuf, 5, src, pos-2);
@@ -182,101 +181,21 @@
 						x += (subpos >> 16) * SRC_CHANNELS;
 						subpos &= 65535;
 					);
-				} else {
-					/* Sinc interpolation, backwards */
-					SRCTYPE xbuf[14*SRC_CHANNELS];
-					SRCTYPE *x = &xbuf[7*SRC_CHANNELS];
-					COPYSRC(xbuf, 0, resampler->X, 0);
-					COPYSRC(xbuf, 1, resampler->X, 1);
-					COPYSRC(xbuf, 2, resampler->X, 2);
-					COPYSRC(xbuf, 3, resampler->X, 3);
-					COPYSRC(xbuf, 4, resampler->X, 4);
-					COPYSRC(xbuf, 5, resampler->X, 5);
-					COPYSRC(xbuf, 6, resampler->X, 6);
-					COPYSRC(xbuf, 7, src, pos);
-					if (pos-1 >= resampler->start) COPYSRC(xbuf, 8, src, pos-1);
-					if (pos-2 >= resampler->start) COPYSRC(xbuf, 9, src, pos-2);
-					if (pos-3 >= resampler->start) COPYSRC(xbuf, 10, src, pos-3);
-					if (pos-4 >= resampler->start) COPYSRC(xbuf, 11, src, pos-4);
-					if (pos-5 >= resampler->start) COPYSRC(xbuf, 12, src, pos-5);
-					if (pos-6 >= resampler->start) COPYSRC(xbuf, 13, src, pos-6);
-					while (todo && x < &xbuf[14*SRC_CHANNELS]) {
-						HEAVYASSERT(pos >= resampler->start);
-						MIX_SINC(+=, 1, x, x, 0, -1, -2, -3, -4, -5, -6, -7);
-						subpos += dt;
-						pos += subpos >> 16;
-						x -= (subpos >> 16) * SRC_CHANNELS;
-						subpos &= 65535;
-						todo--;
-					}
-					x = &src[pos*SRC_CHANNELS];
-					LOOP4(todo,
-						HEAVYASSERT(pos >= resampler->start);
-						MIX_SINC(+=, 1, x, x, 0, 1, 2, 3, 4, 5, 6, 7);
-						subpos += dt;
-						pos += subpos >> 16;
-						x += (subpos >> 16) * SRC_CHANNELS;
-						subpos &= 65535;
-					);
 				}
 				diff = diff - pos;
 				overshot = resampler->start - pos - 1;
-				if (diff >= 7) {
-					COPYSRC2(resampler->X, 0, overshot < 7, src, pos+7);
-					COPYSRC2(resampler->X, 1, overshot < 6, src, pos+6);
-					COPYSRC2(resampler->X, 2, overshot < 5, src, pos+5);
-					COPYSRC2(resampler->X, 3, overshot < 4, src, pos+4);
-					COPYSRC2(resampler->X, 4, overshot < 3, src, pos+3);
-					COPYSRC2(resampler->X, 5, overshot < 2, src, pos+2);
-					COPYSRC2(resampler->X, 6, overshot < 1, src, pos+1);
-				} else if (diff >= 6) {
-					COPYSRC(resampler->X, 0, resampler->X, 1);
-					COPYSRC2(resampler->X, 1, overshot < 6, src, pos+6);
-					COPYSRC2(resampler->X, 2, overshot < 5, src, pos+5);
-					COPYSRC2(resampler->X, 3, overshot < 4, src, pos+4);
-					COPYSRC2(resampler->X, 4, overshot < 3, src, pos+3);
-					COPYSRC2(resampler->X, 5, overshot < 2, src, pos+2);
-					COPYSRC2(resampler->X, 6, overshot < 1, src, pos+1);
-				} else if (diff >= 5) {
-					COPYSRC(resampler->X, 0, resampler->X, 1);
-					COPYSRC(resampler->X, 1, resampler->X, 2);
-					COPYSRC2(resampler->X, 2, overshot < 5, src, pos+5);
-					COPYSRC2(resampler->X, 3, overshot < 4, src, pos+4);
-					COPYSRC2(resampler->X, 4, overshot < 3, src, pos+3);
-					COPYSRC2(resampler->X, 5, overshot < 2, src, pos+2);
-					COPYSRC2(resampler->X, 6, overshot < 1, src, pos+1);
-				} else if (diff >= 4) {
-					COPYSRC(resampler->X, 0, resampler->X, 1);
-					COPYSRC(resampler->X, 1, resampler->X, 2);
-					COPYSRC(resampler->X, 2, resampler->X, 3);
-					COPYSRC2(resampler->X, 3, overshot < 4, src, pos+4);
-					COPYSRC2(resampler->X, 4, overshot < 3, src, pos+3);
-					COPYSRC2(resampler->X, 5, overshot < 2, src, pos+2);
-					COPYSRC2(resampler->X, 6, overshot < 1, src, pos+1);
-				} else if (diff >= 3) {
-					COPYSRC(resampler->X, 0, resampler->X, 1);
-					COPYSRC(resampler->X, 1, resampler->X, 2);
-					COPYSRC(resampler->X, 2, resampler->X, 3);
-					COPYSRC(resampler->X, 3, resampler->X, 4);
-					COPYSRC2(resampler->X, 4, overshot < 3, src, pos+3);
-					COPYSRC2(resampler->X, 5, overshot < 2, src, pos+2);
-					COPYSRC2(resampler->X, 6, overshot < 1, src, pos+1);
+				if (diff >= 3) {
+					COPYSRC2(resampler->X, 0, overshot < 3, src, pos+3);
+					COPYSRC2(resampler->X, 1, overshot < 2, src, pos+2);
+					COPYSRC2(resampler->X, 2, overshot < 1, src, pos+1);
 				} else if (diff >= 2) {
-					COPYSRC(resampler->X, 0, resampler->X, 1);
-					COPYSRC(resampler->X, 1, resampler->X, 2);
-					COPYSRC(resampler->X, 2, resampler->X, 3);
-					COPYSRC(resampler->X, 3, resampler->X, 4);
-					COPYSRC(resampler->X, 4, resampler->X, 5);
-					COPYSRC2(resampler->X, 5, overshot < 2, src, pos+2);
-					COPYSRC2(resampler->X, 6, overshot < 1, src, pos+1);
+					COPYSRC(resampler->X, 0, resampler->X, 2);
+					COPYSRC2(resampler->X, 1, overshot < 2, src, pos+2);
+					COPYSRC2(resampler->X, 2, overshot < 1, src, pos+1);
 				} else if (diff >= 1) {
 					COPYSRC(resampler->X, 0, resampler->X, 1);
 					COPYSRC(resampler->X, 1, resampler->X, 2);
-					COPYSRC(resampler->X, 2, resampler->X, 3);
-					COPYSRC(resampler->X, 3, resampler->X, 4);
-					COPYSRC(resampler->X, 4, resampler->X, 5);
-					COPYSRC(resampler->X, 5, resampler->X, 6);
-					COPYSRC2(resampler->X, 6, overshot < 1, src, pos+1);
+					COPYSRC2(resampler->X, 2, overshot < 1, src, pos+1);
 				}
 			} else {
 				if (!dst) {
@@ -289,8 +208,8 @@
 					SRCTYPE xbuf[2*SRC_CHANNELS];
 					SRCTYPE *x = &xbuf[0];
 					SRCTYPE *xstart;
-					COPYSRC(xbuf, 0, resampler->X, 5);
-					COPYSRC(xbuf, 1, resampler->X, 6);
+					COPYSRC(xbuf, 0, resampler->X, 1);
+					COPYSRC(xbuf, 1, resampler->X, 2);
 					while (todo && x < &xbuf[2*SRC_CHANNELS]) {
 						HEAVYASSERT(pos < resampler->end);
 						MIX_ALIAS(+=, 1, 0);
@@ -312,8 +231,8 @@
 					/* Linear interpolation, forwards */
 					SRCTYPE xbuf[3*SRC_CHANNELS];
 					SRCTYPE *x = &xbuf[1*SRC_CHANNELS];
-					COPYSRC(xbuf, 0, resampler->X, 5);
-					COPYSRC(xbuf, 1, resampler->X, 6);
+					COPYSRC(xbuf, 0, resampler->X, 1);
+					COPYSRC(xbuf, 1, resampler->X, 2);
 					COPYSRC(xbuf, 2, src, pos);
 					while (todo && x < &xbuf[3*SRC_CHANNELS]) {
 						HEAVYASSERT(pos < resampler->end);
@@ -333,13 +252,13 @@
 						x += (subpos >> 16) * SRC_CHANNELS;
 						subpos &= 65535;
 					);
-				} else if (quality <= DUMB_RQ_CUBIC) {
+				} else {
 					/* Cubic interpolation, forwards */
 					SRCTYPE xbuf[6*SRC_CHANNELS];
 					SRCTYPE *x = &xbuf[3*SRC_CHANNELS];
-					COPYSRC(xbuf, 0, resampler->X, 4);
-					COPYSRC(xbuf, 1, resampler->X, 5);
-					COPYSRC(xbuf, 2, resampler->X, 6);
+					COPYSRC(xbuf, 0, resampler->X, 0);
+					COPYSRC(xbuf, 1, resampler->X, 1);
+					COPYSRC(xbuf, 2, resampler->X, 2);
 					COPYSRC(xbuf, 3, src, pos);
 					if (pos+1 < resampler->end) COPYSRC(xbuf, 4, src, pos+1);
 					if (pos+2 < resampler->end) COPYSRC(xbuf, 5, src, pos+2);
@@ -361,101 +280,21 @@
 						x += (subpos >> 16) * SRC_CHANNELS;
 						subpos &= 65535;
 					);
-				} else {
-					/* Sinc interpolation, forwards */
-					SRCTYPE xbuf[14*SRC_CHANNELS];
-					SRCTYPE *x = &xbuf[7*SRC_CHANNELS];
-					COPYSRC(xbuf, 0, resampler->X, 0);
-					COPYSRC(xbuf, 1, resampler->X, 1);
-					COPYSRC(xbuf, 2, resampler->X, 2);
-					COPYSRC(xbuf, 3, resampler->X, 3);
-					COPYSRC(xbuf, 4, resampler->X, 4);
-					COPYSRC(xbuf, 5, resampler->X, 5);
-					COPYSRC(xbuf, 6, resampler->X, 6);
-					COPYSRC(xbuf, 7, src, pos);
-					if (pos+1 < resampler->end) COPYSRC(xbuf, 8, src, pos+1);
-					if (pos+2 < resampler->end) COPYSRC(xbuf, 9, src, pos+2);
-					if (pos+3 < resampler->end) COPYSRC(xbuf, 10, src, pos+3);
-					if (pos+4 < resampler->end) COPYSRC(xbuf, 11, src, pos+4);
-					if (pos+5 < resampler->end) COPYSRC(xbuf, 12, src, pos+5);
-					if (pos+6 < resampler->end) COPYSRC(xbuf, 13, src, pos+6);
-					while (todo && x < &xbuf[14*SRC_CHANNELS]) {
-						HEAVYASSERT(pos < resampler->end);
-						MIX_SINC(+=, 1, x, x, -7, -6, -5, -4, -3, -2, -1, 0);
-						subpos += dt;
-						pos += subpos >> 16;
-						x += (subpos >> 16) * SRC_CHANNELS;
-						subpos &= 65535;
-						todo--;
-					}
-					x = &src[pos*SRC_CHANNELS];
-					LOOP4(todo,
-						HEAVYASSERT(pos < resampler->end);
-						MIX_SINC(+=, 1, x, x, -7, -6, -5, -4, -3, -2, -1, 0);
-						subpos += dt;
-						pos += subpos >> 16;
-						x += (subpos >> 16) * SRC_CHANNELS;
-						subpos &= 65535;
-					);
 				}
 				diff = pos - diff;
 				overshot = pos - resampler->end;
-				if (diff >= 7) {
-					COPYSRC2(resampler->X, 0, overshot < 7, src, pos-7);
-					COPYSRC2(resampler->X, 1, overshot < 6, src, pos-6);
-					COPYSRC2(resampler->X, 2, overshot < 5, src, pos-5);
-					COPYSRC2(resampler->X, 3, overshot < 4, src, pos-4);
-					COPYSRC2(resampler->X, 4, overshot < 3, src, pos-3);
-					COPYSRC2(resampler->X, 5, overshot < 2, src, pos-2);
-					COPYSRC2(resampler->X, 6, overshot < 1, src, pos-1);
-				} else if (diff >= 6) {
-					COPYSRC(resampler->X, 0, resampler->X, 1);
-					COPYSRC2(resampler->X, 1, overshot < 6, src, pos-6);
-					COPYSRC2(resampler->X, 2, overshot < 5, src, pos-5);
-					COPYSRC2(resampler->X, 3, overshot < 4, src, pos-4);
-					COPYSRC2(resampler->X, 4, overshot < 3, src, pos-3);
-					COPYSRC2(resampler->X, 5, overshot < 2, src, pos-2);
-					COPYSRC2(resampler->X, 6, overshot < 1, src, pos-1);
-				} else if (diff >= 5) {
-					COPYSRC(resampler->X, 0, resampler->X, 1);
-					COPYSRC(resampler->X, 1, resampler->X, 2);
-					COPYSRC2(resampler->X, 2, overshot < 5, src, pos-5);
-					COPYSRC2(resampler->X, 3, overshot < 4, src, pos-4);
-					COPYSRC2(resampler->X, 4, overshot < 3, src, pos-3);
-					COPYSRC2(resampler->X, 5, overshot < 2, src, pos-2);
-					COPYSRC2(resampler->X, 6, overshot < 1, src, pos-1);
-				} else if (diff >= 4) {
-					COPYSRC(resampler->X, 0, resampler->X, 1);
-					COPYSRC(resampler->X, 1, resampler->X, 2);
-					COPYSRC(resampler->X, 2, resampler->X, 3);
-					COPYSRC2(resampler->X, 3, overshot < 4, src, pos-4);
-					COPYSRC2(resampler->X, 4, overshot < 3, src, pos-3);
-					COPYSRC2(resampler->X, 5, overshot < 2, src, pos-2);
-					COPYSRC2(resampler->X, 6, overshot < 1, src, pos-1);
-				} else if (diff >= 3) {
-					COPYSRC(resampler->X, 0, resampler->X, 1);
-					COPYSRC(resampler->X, 1, resampler->X, 2);
-					COPYSRC(resampler->X, 2, resampler->X, 3);
-					COPYSRC(resampler->X, 3, resampler->X, 4);
-					COPYSRC2(resampler->X, 4, overshot < 3, src, pos-3);
-					COPYSRC2(resampler->X, 5, overshot < 2, src, pos-2);
-					COPYSRC2(resampler->X, 6, overshot < 1, src, pos-1);
+				if (diff >= 3) {
+					COPYSRC2(resampler->X, 0, overshot < 3, src, pos-3);
+					COPYSRC2(resampler->X, 1, overshot < 2, src, pos-2);
+					COPYSRC2(resampler->X, 2, overshot < 1, src, pos-1);
 				} else if (diff >= 2) {
-					COPYSRC(resampler->X, 0, resampler->X, 1);
-					COPYSRC(resampler->X, 1, resampler->X, 2);
-					COPYSRC(resampler->X, 2, resampler->X, 3);
-					COPYSRC(resampler->X, 3, resampler->X, 4);
-					COPYSRC(resampler->X, 4, resampler->X, 5);
-					COPYSRC2(resampler->X, 5, overshot < 2, src, pos-2);
-					COPYSRC2(resampler->X, 6, overshot < 1, src, pos-1);
+					COPYSRC(resampler->X, 0, resampler->X, 2);
+					COPYSRC2(resampler->X, 1, overshot < 2, src, pos-2);
+					COPYSRC2(resampler->X, 2, overshot < 1, src, pos-1);
 				} else if (diff >= 1) {
 					COPYSRC(resampler->X, 0, resampler->X, 1);
 					COPYSRC(resampler->X, 1, resampler->X, 2);
-					COPYSRC(resampler->X, 2, resampler->X, 3);
-					COPYSRC(resampler->X, 3, resampler->X, 4);
-					COPYSRC(resampler->X, 4, resampler->X, 5);
-					COPYSRC(resampler->X, 5, resampler->X, 6);
-					COPYSRC2(resampler->X, 6, overshot < 1, src, pos-1);
+					COPYSRC2(resampler->X, 2, overshot < 1, src, pos-1);
 				}
 			}
 			resampler->pos = pos;
@@ -488,7 +327,6 @@
 	if (VOLUMES_ARE_ZERO) { MIX_ZEROS(=); return; }
 
 	init_cubic();
-	init_sinc();
 
 	quality = resampler->quality;
 
@@ -505,12 +343,9 @@
 		} else if (quality <= DUMB_RQ_LINEAR) {
 			/* Linear interpolation, backwards */
 			MIX_LINEAR(=, 0, 2, 1);
-		} else if (quality <= DUMB_RQ_CUBIC) {
+		} else {
 			/* Cubic interpolation, backwards */
 			MIX_CUBIC(=, 0, src, x, pos, 2, 1, 0);
-		} else {
-			/* Sinc interpolation, backwards */
-			MIX_SINC(=, 0, src, x, pos, 6, 5, 4, 3, 2, 1, 0);
 		}
 	} else {
 		HEAVYASSERT(pos < resampler->end);
@@ -520,12 +355,9 @@
 		} else if (quality <= DUMB_RQ_LINEAR) {
 			/* Linear interpolation, forwards */
 			MIX_LINEAR(=, 0, 1, 2);
-		} else if (quality <= DUMB_RQ_CUBIC) {
+		} else {
 			/* Cubic interpolation, forwards */
 			MIX_CUBIC(=, 0, x, src, 0, 1, 2, pos);
-		} else {
-			/* Sinc interpolation, forwards */
-			MIX_SINC(=, 0, x, src, 0, 1, 2, 3, 4, 5, 6, pos);
 		}
 	}
 }
@@ -533,7 +365,6 @@
 
 
 #undef MIX_ZEROS
-#undef MIX_SINC
 #undef MIX_CUBIC
 #undef MIX_LINEAR
 #undef MIX_ALIAS
--- a/dumb/src/helpers/resample.c
+++ b/dumb/src/helpers/resample.c
@@ -71,10 +71,9 @@
  *
  *  0 - DUMB_RQ_ALIASING - fastest
  *  1 - DUMB_RQ_LINEAR
- *  2 - DUMB_RQ_CUBIC
- *  3 - DUMB_RQ_SINC     - nicest
+ *  2 - DUMB_RQ_CUBIC    - nicest
  *
- * Values outside the range 0-3 will behave the same as the nearest
+ * Values outside the range 0-2 will behave the same as the nearest
  * value within the range.
  */
 int dumb_resampling_quality = DUMB_RQ_CUBIC;
@@ -162,144 +161,8 @@
 	}
 }
 
-static short sinc[8192];
 
-#define WFIR_QUANTBITS		14
-#define WFIR_QUANTSCALE		(1L<<WFIR_QUANTBITS)
-#define WFIR_8SHIFT			(WFIR_QUANTBITS-8)
-#define WFIR_16BITSHIFT		(WFIR_QUANTBITS)
-// log2(number)-1 of precalculated taps range is [4..12]
-#define WFIR_FRACBITS		9
-#define WFIR_LUTLEN			((1L<<(WFIR_FRACBITS+1))/*+1*/)
-// number of samples in window
-#define WFIR_LOG2WIDTH		3
-#define WFIR_WIDTH			(1L<<WFIR_LOG2WIDTH)
-#define WFIR_SMPSPERWING	((WFIR_WIDTH-1)>>1)
-// cutoff (1.0 == pi/2)
-#define WFIR_CUTOFF			0.95f
-// wfir type
-#define WFIR_HANN			0
-#define WFIR_HAMMING		1
-#define WFIR_BLACKMANEXACT	2
-#define WFIR_BLACKMAN3T61	3
-#define WFIR_BLACKMAN3T67	4
-#define WFIR_BLACKMAN4T92	5
-#define WFIR_BLACKMAN4T74	6
-#define WFIR_KAISER4T		7
-#define WFIR_TYPE			WFIR_HANN
-// wfir help
-#ifndef M_zPI
-#define M_zPI			3.1415926535897932384626433832795
-#endif
-#define M_zEPS			1e-8
-#define M_zBESSELEPS	1e-21
 
-static float sinc_coef( int _PCnr, float _POfs, float _PCut, int _PWidth, int _PType ) //float _PPos, float _PFc, int _PLen )
-{
-	double	_LWidthM1		= _PWidth-1;
-	double	_LWidthM1Half	= 0.5*_LWidthM1;
-	double	_LPosU			= ((double)_PCnr - _POfs);
-	double	_LPos			= _LPosU-_LWidthM1Half;
-	double	_LPIdl			= 2.0*M_zPI/_LWidthM1;
-	double	_LWc,_LSi;
-	if( fabs(_LPos)<M_zEPS )
-	{
-		_LWc	= 1.0;
-		_LSi	= _PCut;
-	}
-	else
-	{
-		switch( _PType )
-		{
-		case WFIR_HANN:
-			_LWc = 0.50 - 0.50 * cos(_LPIdl*_LPosU);
-			break;
-		case WFIR_HAMMING:
-			_LWc = 0.54 - 0.46 * cos(_LPIdl*_LPosU);
-			break;
-		case WFIR_BLACKMANEXACT:
-			_LWc = 0.42 - 0.50 * cos(_LPIdl*_LPosU) + 0.08 * cos(2.0*_LPIdl*_LPosU);
-			break;
-		case WFIR_BLACKMAN3T61:
-			_LWc = 0.44959 - 0.49364 * cos(_LPIdl*_LPosU) + 0.05677 * cos(2.0*_LPIdl*_LPosU);
-			break;
-		case WFIR_BLACKMAN3T67:
-			_LWc = 0.42323 - 0.49755 * cos(_LPIdl*_LPosU) + 0.07922 * cos(2.0*_LPIdl*_LPosU);
-			break;
-		case WFIR_BLACKMAN4T92:
-			_LWc = 0.35875 - 0.48829 * cos(_LPIdl*_LPosU) + 0.14128 * cos(2.0*_LPIdl*_LPosU) - 0.01168 * cos(3.0*_LPIdl*_LPosU);
-			break;
-		case WFIR_BLACKMAN4T74:
-			_LWc = 0.40217 - 0.49703 * cos(_LPIdl*_LPosU) + 0.09392 * cos(2.0*_LPIdl*_LPosU) - 0.00183 * cos(3.0*_LPIdl*_LPosU);
-			break;
-		case WFIR_KAISER4T:
-			_LWc = 0.40243 - 0.49804 * cos(_LPIdl*_LPosU) + 0.09831 * cos(2.0*_LPIdl*_LPosU) - 0.00122 * cos(3.0*_LPIdl*_LPosU);
-			break;
-		default:
-			_LWc = 1.0;
-			break;
-		}
-		_LPos	 *= M_zPI;
-		_LSi	 = sin(_PCut*_LPos)/_LPos;
-	}
-	return (float)(_LWc*_LSi);
-}
-
-/*static*/ void init_sinc(void)
-{
-	int _LPcl;
-	float _LPcllen;
-	float _LNorm;
-	float _LCut;
-	float _LScale;
-	float _LGain,_LCoefs[WFIR_WIDTH];
-	static int done = 0;
-	if (done) return;
-	done = 1;
-	_LPcllen  = (float)(1L<<WFIR_FRACBITS);	// number of precalculated lines for 0..1 (-1..0)
-	_LNorm    = 1.0f / (float)(2.0f * _LPcllen);
-	_LCut     = WFIR_CUTOFF;
-	_LScale   = (float)WFIR_QUANTSCALE;
-	for( _LPcl=0;_LPcl<WFIR_LUTLEN;_LPcl++ )
-	{
-		float _LOfs		= ((float)_LPcl-_LPcllen)*_LNorm;
-		int _LCc,_LIdx	= _LPcl<<WFIR_LOG2WIDTH;
-		for( _LCc=0,_LGain=0.0f;_LCc<WFIR_WIDTH;_LCc++ )
-		{
-			_LGain	+= (_LCoefs[_LCc] = sinc_coef( _LCc, _LOfs, _LCut, WFIR_WIDTH, WFIR_TYPE ));
-		}
-		_LGain = 1.0f/_LGain;
-		for( _LCc=0;_LCc<WFIR_WIDTH;_LCc++ )
-		{
-			float _LCoef = (float)floor( 0.5 + _LScale*_LCoefs[_LCc]*_LGain );
-			sinc[_LIdx+_LCc] = (signed short)( (_LCoef<-_LScale)?-_LScale:((_LCoef>_LScale)?_LScale:_LCoef) );
-		}
-	}
-}
-
-#undef WFIR_QUANTBITS
-#undef WFIR_QUANTSCALE
-#undef WFIR_8SHIFT
-#undef WFIR_16BITSHIFT
-#undef WFIR_FRACBITS
-#undef WFIR_LUTLEN
-#undef WFIR_LOG2WIDTH
-#undef WFIR_WIDTH
-#undef WFIR_SMPSPERWING
-#undef WFIR_CUTOFF
-#undef WFIR_HANN
-#undef WFIR_HAMMING
-#undef WFIR_BLACKMANEXACT
-#undef WFIR_BLACKMAN3T61
-#undef WFIR_BLACKMAN3T67
-#undef WFIR_BLACKMAN4T92
-#undef WFIR_BLACKMAN4T74
-#undef WFIR_KAISER4T
-#undef WFIR_TYPE
-#undef M_zPI
-#undef M_zEPS
-#undef M_zBESSELEPS
-
 /* Create resamplers for 24-in-32-bit source samples. */
 
 /* #define SUFFIX
@@ -329,16 +192,6 @@
 	MULSC(x2, cubicA1[1 + (subpos >> 6 ^ 1023)] << 2) + \
 	MULSC(x3, cubicA0[1 + (subpos >> 6 ^ 1023)] << 2))
 #define CUBICVOL(x, vol) MULSC(x, vol)
-#define SINC(x0, x1, x2, x3, x4, x5, x6, x7) ( \
-	MULSC(x0, sinc[(subpos >> 3) & 0x1FF8] << 2) + \
-	MULSC(x1, sinc[((subpos >> 3) & 0x1FF8) + 1] << 2) + \
-	MULSC(x2, sinc[((subpos >> 3) & 0x1FF8) + 2] << 2) + \
-	MULSC(x3, sinc[((subpos >> 3) & 0x1FF8) + 3] << 2) + \
-	MULSC(x4, sinc[((subpos >> 3) & 0x1FF8) + 4] << 2) + \
-	MULSC(x5, sinc[((subpos >> 3) & 0x1FF8) + 5] << 2) + \
-	MULSC(x6, sinc[((subpos >> 3) & 0x1FF8) + 6] << 2) + \
-	MULSC(x7, sinc[((subpos >> 3) & 0x1FF8) + 7] << 2))
-#define SINCVOL(x, vol) MULSC(x, vol)
 #include "resample.inc"
 
 /* Undefine the simplified macros. */
@@ -375,16 +228,6 @@
 	x2 * cubicA1[1 + (subpos >> 6 ^ 1023)] + \
 	x3 * cubicA0[1 + (subpos >> 6 ^ 1023)])
 #define CUBICVOL(x, vol) (int)((LONG_LONG)(x) * (vol << 10) >> 32)
-#define SINC(x0, x1, x2, x3, x4, x5, x6, x7) ( \
-	x0 * sinc[(subpos >> 3) & 0x1FF8] + \
-	x1 * sinc[((subpos >> 3) & 0x1FF8) + 1] + \
-	x2 * sinc[((subpos >> 3) & 0x1FF8) + 2] + \
-	x3 * sinc[((subpos >> 3) & 0x1FF8) + 3] + \
-	x4 * sinc[((subpos >> 3) & 0x1FF8) + 4] + \
-	x5 * sinc[((subpos >> 3) & 0x1FF8) + 5] + \
-	x6 * sinc[((subpos >> 3) & 0x1FF8) + 6] + \
-	x7 * sinc[((subpos >> 3) & 0x1FF8) + 7])
-#define SINCVOL(x, vol) (int)((LONG_LONG)(x) * (vol << 10) >> 32)
 #include "resample.inc"
 
 /* Create resamplers for 8-bit source samples. */
@@ -407,16 +250,6 @@
 	x2 * cubicA1[1 + (subpos >> 6 ^ 1023)] + \
 	x3 * cubicA0[1 + (subpos >> 6 ^ 1023)]) << 6)
 #define CUBICVOL(x, vol) (int)((LONG_LONG)(x) * (vol << 12) >> 32)
-#define SINC(x0, x1, x2, x3, x4, x5, x6, x7) (( \
-	x0 * sinc[(subpos >> 3) & 0x1FF8] + \
-	x1 * sinc[((subpos >> 3) & 0x1FF8) + 1] + \
-	x2 * sinc[((subpos >> 3) & 0x1FF8) + 2] + \
-	x3 * sinc[((subpos >> 3) & 0x1FF8) + 3] + \
-	x4 * sinc[((subpos >> 3) & 0x1FF8) + 4] + \
-	x5 * sinc[((subpos >> 3) & 0x1FF8) + 5] + \
-	x6 * sinc[((subpos >> 3) & 0x1FF8) + 6] + \
-	x7 * sinc[((subpos >> 3) & 0x1FF8) + 7]) << 6)
-#define SINCVOL(x, vol) (int)((LONG_LONG)(x) * (vol << 12) >> 32)
 #include "resample.inc"
 
 
--- a/dumb/src/helpers/resample.inc
+++ b/dumb/src/helpers/resample.inc
@@ -67,7 +67,7 @@
 	{
 		resampler->quality = quality;
 	}
-	for (i = 0; i < src_channels*7; i++) resampler->X[i] = 0;
+	for (i = 0; i < src_channels*3; i++) resampler->X[i] = 0;
 	resampler->overshot = -1;
 }
 
@@ -156,17 +156,6 @@
 	if ( upd ) UPDATE_VOLUME( volume_left, lvol ); \
 	if ( upd ) UPDATE_VOLUME( volume_right, rvol ); \
 }
-#define MONO_DEST_MIX_SINC(op, upd, x0, x7, o0, o1, o2, o3, o4, o5, o6, o7) { \
-	*dst++ op SINCVOL(SINC(x0[o0], x[o1], x[o2], x[o3], x[o4], x[o5], x[o6], x7[o7]), vol); \
-	if ( upd ) UPDATE_VOLUME( volume, vol ); \
-}
-#define STEREO_DEST_MIX_SINC(op, upd, x0, x7, o0, o1, o2, o3, o4, o5, o6, o7) { \
-	int xm = SINC(x0[o0], x[o1], x[o2], x[o3], x[o4], x[o5], x[o6], x7[o7]); \
-	*dst++ op SINCVOL(xm, lvol); \
-	*dst++ op SINCVOL(xm, rvol); \
-	if ( upd ) UPDATE_VOLUME( volume_left, lvol ); \
-	if ( upd ) UPDATE_VOLUME( volume_right, rvol ); \
-}
 #include "resamp2.inc"
 
 /* Create stereo source resampler. */
@@ -254,19 +243,6 @@
 	if ( upd ) UPDATE_VOLUME( volume_left, lvol ); \
 	if ( upd ) UPDATE_VOLUME( volume_right, rvol ); \
 }
-#define MONO_DEST_MIX_SINC(op, upd, x0, x7, o0, o1, o2, o3, o4, o5, o6, o7) { \
-	*dst++ op \
-		SINCVOL(SINC(x0[(o0)*2], x[(o1)*2], x[(o2)*2], x[(o3)*2], x[(o4)*2], x[(o5)*2], x[(o6)*2], x7[(o7)*2]), lvol) + \
-		SINCVOL(SINC(x0[(o0)*2+1], x[(o1)*2+1], x[(o2)*2+1], x[(o3)*2+1], x[(o4)*2+1], x[(o5)*2+1], x[(o6)*2+1], x7[(o7)*2+1]), rvol); \
-	if ( upd ) UPDATE_VOLUME( volume_left, lvol ); \
-	if ( upd ) UPDATE_VOLUME( volume_right, rvol ); \
-}
-#define STEREO_DEST_MIX_SINC(op, upd, x0, x7, o0, o1, o2, o3, o4, o5, o6, o7) { \
-	*dst++ op SINCVOL(SINC(x0[(o0)*2], x[(o1)*2], x[(o2)*2], x[(o3)*2], x[(o4)*2], x[(o5)*2], x[(o6)*2], x7[(o7)*2]), lvol); \
-	*dst++ op SINCVOL(SINC(x0[(o0)*2+1], x[(o1)*2+1], x[(o2)*2+1], x[(o3)*2+1], x[(o4)*2+1], x[(o5)*2+1], x[(o6)*2+1], x7[(o7)*2+1]), rvol); \
-	if ( upd ) UPDATE_VOLUME( volume_left, lvol ); \
-	if ( upd ) UPDATE_VOLUME( volume_right, rvol ); \
-}
 #include "resamp2.inc"
 
 
@@ -279,8 +255,6 @@
 
 
 
-#undef SINCVOL
-#undef SINC
 #undef CUBICVOL
 #undef CUBIC
 #undef LINEAR