fix crash when using soxr_process after calling soxr_clear

master
Rob Sykes 2015-08-20 17:19:23 +01:00
parent fa5a481987
commit 4527588bea
3 changed files with 16 additions and 3 deletions

View File

@ -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);}

View File

@ -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);

View File

@ -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