Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/alexmarsev/soxr.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRob Sykes <robs@users.sourceforge.net>2015-08-20 19:19:23 +0300
committerRob Sykes <robs@users.sourceforge.net>2015-08-20 19:19:23 +0300
commit4527588beae35c0aefd10df1f9936cb81f9851cc (patch)
treef56d93648e5215a9776227977575cc939b345d78
parentfa5a48198754be33ddfe40624dafad929b61648d (diff)
fix crash when using soxr_process after calling soxr_clear
-rw-r--r--src/lsr.c2
-rw-r--r--src/soxr.c11
-rw-r--r--src/soxr.h6
3 files changed, 16 insertions, 3 deletions
diff --git a/src/lsr.c b/src/lsr.c
index 64b5798..8bcc11b 100644
--- a/src/lsr.c
+++ b/src/lsr.c
@@ -108,7 +108,7 @@ char const * src_get_version(void) {return soxr_version();}
char const * src_strerror(soxr_error_t error) {return error == (soxr_error_t)1? "Placeholder." : sizeof(int) >= sizeof(char *) || !error ? soxr_strerror(error) : "soxr error";}
int src_is_valid_ratio(double oi_ratio) {return getenv("SOXR_LSR_STRICT")? oi_ratio >= 1./256 && oi_ratio <= 256 : oi_ratio > 0;}
soxr_error_t src_error(soxr_t p) {return soxr_error(p);}
-soxr_error_t src_reset(soxr_t p) {return soxr_clear(p);}
+soxr_error_t src_reset(soxr_t p) {return soxr_clear0(p, 0);}
soxr_t src_delete(soxr_t p) {soxr_delete(p); return 0;}
soxr_error_t src_set_ratio(soxr_t p, double oi_ratio) {return soxr_set_io_ratio(p, 1/oi_ratio, 0);}
soxr_t src_new(unsigned id, int channels, SRC_ERROR * error) {return src_callback_new(0, id, channels, error, 0);}
diff --git a/src/soxr.c b/src/soxr.c
index 36b0251..8246655 100644
--- a/src/soxr.c
+++ b/src/soxr.c
@@ -391,7 +391,7 @@ void soxr_delete(soxr_t p)
-soxr_error_t soxr_clear(soxr_t p) /* TODO: this, properly. */
+soxr_error_t soxr_clear0(soxr_t p, int set_ratio) /* TODO: this, properly. */
{
if (p) {
struct soxr tmp = *p;
@@ -406,13 +406,20 @@ soxr_error_t soxr_clear(soxr_t p) /* TODO: this, properly. */
memcpy(p->control_block, tmp.control_block, sizeof(p->control_block));
p->deinterleave = tmp.deinterleave;
p->interleave = tmp.interleave;
- return 0;
+ return set_ratio? soxr_set_io_ratio(p, tmp.io_ratio, 0) : 0;
}
return "invalid soxr_t pointer";
}
+soxr_error_t soxr_clear(soxr_t p)
+{
+ return soxr_clear0(p, 1);
+}
+
+
+
static void soxr_input_1ch(soxr_t p, unsigned i, soxr_cbuf_t src, size_t len)
{
sample_t * dest = resampler_input(p->resamplers[i], NULL, len);
diff --git a/src/soxr.h b/src/soxr.h
index 0043ef6..6520b29 100644
--- a/src/soxr.h
+++ b/src/soxr.h
@@ -332,6 +332,12 @@ SOXR soxr_error_t soxr_set_num_channels(soxr_t, unsigned);
+/* --------------------------- Internal use only ---------------------------- */
+
+SOXR soxr_error_t soxr_clear0(soxr_t, int);
+
+
+
#undef SOXR
#if defined __cplusplus