1
0
mirror of https://github.com/cookiengineer/audacity synced 2026-02-04 02:33:14 +01:00

Upgrade to libsoxr 0.0.2.

This commit is contained in:
v.audacity
2012-10-12 23:54:03 +00:00
parent 3cb679ccd8
commit 2416f94980
51 changed files with 1300 additions and 372 deletions

View File

@@ -55,7 +55,7 @@ typedef void (* deinterleave_t)(sample_t * * dest,
typedef size_t (* interleave_t)(soxr_datatype_t data_type, void * * dest,
sample_t const * const * src, size_t, unsigned, unsigned long *);
struct soxr_t {
struct soxr {
unsigned num_channels;
double oi_ratio;
soxr_error_t error;
@@ -405,7 +405,7 @@ void soxr_delete(soxr_t p)
soxr_error_t soxr_clear(soxr_t p) /* TODO: this, properly. */
{
if (p) {
struct soxr_t tmp = *p;
struct soxr tmp = *p;
soxr_delete0(p);
memset(p, 0, sizeof(*p));
p->input_fn = tmp.input_fn;
@@ -464,9 +464,9 @@ static size_t soxr_output_1ch(soxr_t p, unsigned i, soxr_buf_t dest, size_t len,
resampler_process(p->resamplers[i]);
src = resampler_output(p->resamplers[i], NULL, &len);
if (separated)
p->clips += (p->interleave)(p->io_spec.otype, &dest, &src,
p->clips += (p->interleave)(p->io_spec.otype, &dest, &src,
len, 1, (p->io_spec.flags & SOXR_NO_DITHER)? 0 : &p->seed);
else p->channel_ptrs[i] = (void /* const */ *)src;;
else p->channel_ptrs[i] = (void /* const */ *)src;
return len;
}
@@ -502,6 +502,7 @@ size_t soxr_output(soxr_t p, void * out, size_t len0)
{
size_t odone, odone0 = 0, olen = len0, osize, idone;
void const * in = out; /* Set to !=0, so that caller may leave unset. */
bool was_flushing;
if (!p || p->error) return 0;
if (!out && len0) {p->error = "null output buffer pointer"; return 0;}
@@ -516,10 +517,11 @@ size_t soxr_output(soxr_t p, void * out, size_t len0)
out = (char *)out + osize * odone;
olen -= odone;
idone = p->input_fn(p->input_fn_state, &in, (size_t)ceil((double)olen /p->oi_ratio));
was_flushing = p->flushing;
if (!in)
p->error = "input function reported failure";
else soxr_input(p, in, idone);
} while (in && (odone || idone));
} while (odone || idone || (!was_flushing && p->flushing));
return odone0;
}
@@ -561,7 +563,7 @@ soxr_error_t soxr_process(soxr_t p,
flush_requested = true, ilen = ilen0 = 0;
else {
if ((ptrdiff_t)ilen0 < 0)
flush_requested = true, ilen0 = 1 + ~ilen0;
flush_requested = true, ilen0 = ~ilen0;
if (1 || flush_requested)
ilen = soxr_i_for_o(p, olen, ilen0);
else
@@ -592,7 +594,7 @@ soxr_error_t soxr_process(soxr_t p,
idone = ilen;
}
else {
idone = soxr_input (p, in , ilen);
idone = ilen? soxr_input (p, in , ilen) : 0;
odone = soxr_output(p, out, olen);
}
if (idone0) *idone0 = idone;
@@ -621,8 +623,7 @@ soxr_error_t soxr_oneshot(
&error, io_spec, q_spec, runtime_spec);
}
if (!error) {
ilen = 1 + ~ilen;
error = soxr_process(resampler, in, ilen, idone, out, olen, odone);
error = soxr_process(resampler, in, ~ilen, idone, out, olen, odone);
soxr_delete(resampler);
}
return error;