From 91b47d00709085aeac7f4248eac3ef650a6bcbfc Mon Sep 17 00:00:00 2001 From: Andrew Bonney Date: Fri, 14 Jun 2013 08:16:17 +0100 Subject: [PATCH 4/4] Fix rounding errors in genericplc by calculating samples not time --- src/audiofilters/genericplc.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/audiofilters/genericplc.c b/src/audiofilters/genericplc.c index 9f201cf..952bd9f 100644 --- a/src/audiofilters/genericplc.c +++ b/src/audiofilters/genericplc.c @@ -40,20 +40,23 @@ static void generic_plc_init(MSFilter *f) { static void generic_plc_process(MSFilter *f) { generic_plc_struct *mgps=(generic_plc_struct*)f->data; - unsigned int buff_size = mgps->rate*sizeof(int16_t)*mgps->nchannels*f->ticker->interval/1000; + // Buff size must be exactly divisible by sizeof(int16_t)*mgps->nchannels + unsigned int buff_size = sizeof(int16_t)*mgps->nchannels*((uint32_t)(mgps->rate*f->ticker->interval/1000)); + unsigned int expected_samples = (f->ticker->time * mgps->rate * mgps->nchannels)/1000; mblk_t *m; while((m=ms_queue_get(f->inputs[0]))!=NULL){ - unsigned int time = (1000*(m->b_wptr - m->b_rptr))/(mgps->rate*sizeof(int16_t)*mgps->nchannels); - ms_concealer_inc_sample_time(mgps->concealer, f->ticker->time, time, TRUE); + unsigned int samples = (m->b_wptr - m->b_rptr)/sizeof(int16_t); // Number of samples across all channels + ms_concealer_inc_sample_time(mgps->concealer, expected_samples, samples, TRUE); ms_queue_put(f->outputs[0], m); } - if (ms_concealer_context_is_concealement_required(mgps->concealer, f->ticker->time)) { + if (ms_concealer_context_is_concealement_required(mgps->concealer, expected_samples)) { m = allocb(buff_size, 0); memset(m->b_wptr, 0, buff_size); m->b_wptr += buff_size; + unsigned int samples = buff_size/sizeof(int16_t); ms_queue_put(f->outputs[0], m); mblk_set_plc_flag(m, 1); - ms_concealer_inc_sample_time(mgps->concealer, f->ticker->time, f->ticker->interval, FALSE); + ms_concealer_inc_sample_time(mgps->concealer, expected_samples, samples, FALSE); } } -- 1.7.9.5