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 */