shithub: dumb

Download patch

ref: b456e20491ea5edc1c052d21e1c105f2d2d5815b
parent: 55217b9408a6d8d47e9aed12276d096711d3e8f4
author: Chris Moeller <kode54@gmail.com>
date: Mon Nov 25 12:05:02 EST 2013

Added extra safety checking to aliased resampling mode

--- a/dumb/src/helpers/resamp3.inc
+++ b/dumb/src/helpers/resamp3.inc
@@ -53,6 +53,7 @@
 	LONG_LONG todo64;
 	int quality;
 	int blip_samples[256*SRC_CHANNELS];
+	int check;
 
 	if (!resampler || resampler->dir == 0) return 0;
 	ASSERT(resampler->dir == -1 || resampler->dir == 1);
@@ -109,6 +110,7 @@
 					int todo_clocks = todo << 16, todo_clocks_set = todo_clocks;
 					SRCTYPE xbuf[2*SRC_CHANNELS];
 					SRCTYPE *x = &xbuf[0];
+					check = resampler->start;
 					COPYSRC(xbuf, 0, resampler->X, 1);
 					COPYSRC(xbuf, 1, resampler->X, 2);
 					if ( todo_clocks_set > 256 * 65536 ) todo_clocks_set = 256 * 65536;
@@ -124,14 +126,19 @@
 						todo_clocks_set = todo_clocks;
 						if ( todo_clocks_set > 256 * 65536 ) todo_clocks_set = 256 * 65536;
 						todo_clocks -= todo_clocks_set;
-						while ( resampler->last_clock < todo_clocks_set )
-						{
+						while ( resampler->last_clock < todo_clocks_set && pos >= check ) {
 							POKE_ALIAS(2);
 							pos--;
 							x -= SRC_CHANNELS;
 						}
 						todo = todo_clocks_set >> 16;
+						check = 0;
+						if ( resampler->last_clock < todo_clocks_set ) {
+							check = ( todo_clocks_set - resampler->last_clock + 65535 ) >> 16;
+						}
+						todo -= check;
 						MIX_ALIAS( todo );
+						done -= check;
 					}
 				} else if (quality <= DUMB_RQ_LINEAR) {
 					/* Linear interpolation, backwards */
@@ -237,6 +244,7 @@
 					int todo_clocks = todo << 16, todo_clocks_set = todo_clocks;
 					SRCTYPE xbuf[2*SRC_CHANNELS];
 					SRCTYPE *x = &xbuf[0];
+					check = resampler->end;
 					COPYSRC(xbuf, 0, resampler->X, 1);
 					COPYSRC(xbuf, 1, resampler->X, 2);
 					if ( todo_clocks_set > 256 * 65536 ) todo_clocks_set = 256 * 65536;
@@ -251,14 +259,19 @@
 						todo_clocks_set = todo_clocks;
 						if ( todo_clocks_set > 256 * 65536 ) todo_clocks_set = 256 * 65536;
 						todo_clocks -= todo_clocks_set;
-						while ( resampler->last_clock < todo_clocks_set )
-						{
+						while ( resampler->last_clock < todo_clocks_set && pos < check ) {
 							POKE_ALIAS(-2);
 							pos++;
 							x += SRC_CHANNELS;
 						}
 						todo = todo_clocks_set >> 16;
+						check = 0;
+						if ( resampler->last_clock < todo_clocks_set ) {
+							check = ( todo_clocks_set - resampler->last_clock + 65535 ) >> 16;
+						}
+						todo -= check;
 						MIX_ALIAS( todo );
+						done -= check;
 					}
 				} else if (quality <= DUMB_RQ_LINEAR) {
 					/* Linear interpolation, forwards */