summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--polyp/resampler.c15
1 files changed, 7 insertions, 8 deletions
diff --git a/polyp/resampler.c b/polyp/resampler.c
index 68c0129a..28e49209 100644
--- a/polyp/resampler.c
+++ b/polyp/resampler.c
@@ -333,7 +333,7 @@ static void trivial_run(struct pa_resampler *r, const struct pa_memchunk *in, st
unsigned o_index;
/* The length of the new memory block rounded up */
- l = ((nframes * r->o_ss.rate + r->i_ss.rate - 1) / r->i_ss.rate) * fz;
+ l = ((((nframes+1) * r->o_ss.rate) / r->i_ss.rate) + 1) * fz;
out->index = 0;
out->memblock = pa_memblock_new(l, r->memblock_stat);
@@ -342,12 +342,11 @@ static void trivial_run(struct pa_resampler *r, const struct pa_memchunk *in, st
unsigned j;
j = (i->o_counter * r->i_ss.rate / r->o_ss.rate);
-
j = j > i->i_counter ? j - i->i_counter : 0;
if (j >= nframes)
break;
-
+
assert(o_index*fz < out->memblock->length);
memcpy((uint8_t*) out->memblock->data + fz*o_index,
@@ -357,15 +356,15 @@ static void trivial_run(struct pa_resampler *r, const struct pa_memchunk *in, st
out->length = o_index*fz;
}
-
- /* Normalize the output counter */
- while (i->o_counter >= r->o_ss.rate)
- i->o_counter -= r->o_ss.rate;
i->i_counter += nframes;
- while (i->i_counter >= r->i_ss.rate)
+ /* Normalize counters */
+ while (i->i_counter >= r->i_ss.rate) {
i->i_counter -= r->i_ss.rate;
+ assert(i->o_counter >= r->o_ss.rate);
+ i->o_counter -= r->o_ss.rate;
+ }
}
static void trivial_free(struct pa_resampler *r) {