From c2d852485b8591782c9b371f6b277d4a4d0cd35f Mon Sep 17 00:00:00 2001 From: Nanang Izzuddin Date: Wed, 3 Mar 2010 14:47:35 +0000 Subject: Ticket #1042, minor updates related to AEC: - Added requirement of AEC minimal latency between reference and echo in aectest sample app. - Modified AEC latency in sound port to 3/4 of playback latency. - Few cleaned up echo_common.c: unused vars, a bit stricter latency check (to be at least as much as PTIME). git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@3115 74dad513-b988-da41-8d7b-12977e46ad98 --- pjmedia/src/pjmedia/echo_common.c | 30 ++++++++++++++---------------- pjmedia/src/pjmedia/sound_port.c | 5 ++++- 2 files changed, 18 insertions(+), 17 deletions(-) (limited to 'pjmedia') diff --git a/pjmedia/src/pjmedia/echo_common.c b/pjmedia/src/pjmedia/echo_common.c index 962e975b..82eec6ea 100644 --- a/pjmedia/src/pjmedia/echo_common.c +++ b/pjmedia/src/pjmedia/echo_common.c @@ -24,6 +24,7 @@ #include #include #include +#include #include #include "echo_internal.h" @@ -46,8 +47,6 @@ struct pjmedia_echo_state ec_operations *op; pj_bool_t lat_ready; /* lat_buf has been filled in. */ - unsigned lat_target_cnt;/* Target number of frames in lat_buf */ - unsigned lat_buf_cnt; /* Actual number of frames in lat_buf */ struct frame lat_buf; /* Frame queue for delayed playback */ struct frame lat_free; /* Free frame list. */ @@ -144,7 +143,7 @@ PJ_DEF(pj_status_t) pjmedia_echo_create2(pj_pool_t *pool, unsigned options, pjmedia_echo_state **p_echo ) { - unsigned ptime; + unsigned ptime, lat_cnt; pjmedia_echo_state *ec; pj_status_t status; @@ -194,22 +193,21 @@ PJ_DEF(pj_status_t) pjmedia_echo_create2(pj_pool_t *pool, /* Create latency buffers */ ptime = samples_per_frame * 1000 / clock_rate; - if (latency_ms == 0) { + if (latency_ms > ptime) { + /* Normalize latency with delaybuf/WSOLA latency */ + latency_ms -= PJ_MIN(ptime, PJMEDIA_WSOLA_DELAY_MSEC); + } + if (latency_ms < ptime) { /* Give at least one frame delay to simplify programming */ latency_ms = ptime; } - ec->lat_target_cnt = latency_ms / ptime; - if (ec->lat_target_cnt != 0) { - unsigned i; - for (i=0; i < ec->lat_target_cnt; ++i) { - struct frame *frm; - - frm = (struct frame*) pj_pool_alloc(pool, (samples_per_frame<<1) + - sizeof(struct frame)); - pj_list_push_back(&ec->lat_free, frm); - } - } else { - ec->lat_ready = PJ_TRUE; + lat_cnt = latency_ms / ptime; + while (lat_cnt--) { + struct frame *frm; + + frm = (struct frame*) pj_pool_alloc(pool, (samples_per_frame<<1) + + sizeof(struct frame)); + pj_list_push_back(&ec->lat_free, frm); } /* Create delay buffer to compensate drifts */ diff --git a/pjmedia/src/pjmedia/sound_port.c b/pjmedia/src/pjmedia/sound_port.c index 70c71215..1029fc3d 100644 --- a/pjmedia/src/pjmedia/sound_port.c +++ b/pjmedia/src/pjmedia/sound_port.c @@ -563,7 +563,10 @@ PJ_DEF(pj_status_t) pjmedia_snd_port_set_ec( pjmedia_snd_port *snd_port, //since actual input latency should be zero. //delay_ms = (si.rec_latency + si.play_latency) * 1000 / // snd_port->clock_rate; - delay_ms = prm.output_latency_ms; + /* Set EC latency to 3/4 of output latency to reduce the + * possibility of missing/late reference frame. + */ + delay_ms = prm.output_latency_ms * 3/4; status = pjmedia_echo_create2(pool, snd_port->clock_rate, snd_port->channel_count, snd_port->samples_per_frame, -- cgit v1.2.3