diff --git a/linphone/mediastreamer2/src/speexec.c b/linphone/mediastreamer2/src/speexec.c index 102da1706..c94cdd386 100644 --- a/linphone/mediastreamer2/src/speexec.c +++ b/linphone/mediastreamer2/src/speexec.c @@ -104,12 +104,27 @@ static void speex_ec_process(MSFilter *f){ int size=msgdsize(m); md = copyb(m); s->size_delay = s->size_delay + size; - ms_queue_put(f->outputs[0],md); + ms_bufferizer_put(&s->speak_delay,md); ms_bufferizer_put(&s->in[0],m); } - while((m=ms_queue_get(f->inputs[1]))!=NULL){ - ms_queue_put(f->outputs[1],m); + /* make sure we always send block with same size */ + while (ms_bufferizer_get_avail(&s->speak_delay)>=nbytes) + { + om0=allocb(nbytes,0); + ms_bufferizer_read(&s->speak_delay,(uint8_t*)om0->b_wptr,nbytes); + om0->b_wptr+=nbytes; + ms_queue_put(f->outputs[0],om0); + } + + /* make sure we always send block with same size */ + ms_bufferizer_put_from_queue(&s->in[1],f->inputs[1]); + while (ms_bufferizer_get_avail(&s->in[1])>=nbytes) + { + om0=allocb(nbytes,0); + ms_bufferizer_read(&s->in[1],(uint8_t*)om0->b_wptr,nbytes); + om0->b_wptr+=nbytes; + ms_queue_put(f->outputs[1],om0); } /* we are now equal and speaker is delayed */ return; @@ -163,7 +178,7 @@ static void speex_ec_process(MSFilter *f){ count=0; } #endif - freeb(om0); + freeb(om0); } if (ms_bufferizer_get_avail(&s->speak_delay)> 4*320*(s->samplerate/8000)) /* above 4*20ms -> useless */