From 288b15dcff2f25d22582a8523e09d916a25d6596 Mon Sep 17 00:00:00 2001 From: Benny Prijono Date: Sat, 19 Jan 2008 09:39:52 +0000 Subject: More work on ticket #438: Workaround for frame bursts from audio devices. See the ticket for more information git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@1715 74dad513-b988-da41-8d7b-12977e46ad98 --- pjmedia/src/pjmedia/conference.c | 8 +++++++- pjmedia/src/pjmedia/delaybuf.c | 25 +++++++++++++++++++++---- pjmedia/src/pjmedia/echo_speex.c | 2 +- pjmedia/src/pjmedia/sound_port.c | 3 ++- pjmedia/src/pjmedia/splitcomb.c | 8 +++++++- 5 files changed, 38 insertions(+), 8 deletions(-) (limited to 'pjmedia/src') diff --git a/pjmedia/src/pjmedia/conference.c b/pjmedia/src/pjmedia/conference.c index a0a0d16f..4999b7fe 100644 --- a/pjmedia/src/pjmedia/conference.c +++ b/pjmedia/src/pjmedia/conference.c @@ -55,7 +55,13 @@ static FILE *fhnd_rec; #define THIS_FILE "conference.c" -#define RX_BUF_COUNT PJMEDIA_SOUND_BUFFER_COUNT + +/* When delay buffer is used, we only need 1 frame buffering */ +#if defined(PJMEDIA_SOUND_USE_DELAYBUF) && PJMEDIA_SOUND_USE_DELAYBUF!=0 +# define RX_BUF_COUNT 1 +#else +# define RX_BUF_COUNT PJMEDIA_SOUND_BUFFER_COUNT +#endif #define BYTES_PER_SAMPLE 2 diff --git a/pjmedia/src/pjmedia/delaybuf.c b/pjmedia/src/pjmedia/delaybuf.c index 6af8ce59..1495e070 100644 --- a/pjmedia/src/pjmedia/delaybuf.c +++ b/pjmedia/src/pjmedia/delaybuf.c @@ -40,8 +40,25 @@ enum OP /* The following macros represent cycles of test. */ /* Since there are two operations performed (get & put), */ /* these macros value must be minimum 2 and should be even number */ -#define WAITING_COUNT 8 -#define LEARN_COUNT 8 +#define WAITING_COUNT 4 +#define LEARN_COUNT 16 + +/* Number of buffers to add to learnt level for additional stability */ +#define SAFE_MARGIN 2 + +/* + * Some experimental data (with SAFE_MARGIN=1): + * + * System 1: + * - XP, WMME, 10ms ptime, + * - Sennheiser Headset+USB sound card + * - Stable delaybuf level: 6, on WAITING_COUNT=4 and LEARNING_COUNT=48 + * + * System 2: + * - XP, WMME, 10ms ptime + * - Onboard SoundMAX Digital Audio + * - Stable delaybuf level: 6, on WAITING_COUNT=4 and LEARNING_COUNT=48 + */ struct pjmedia_delay_buf { @@ -133,8 +150,8 @@ static void update(pjmedia_delay_buf *b, enum OP op) b->op[other].level = 0; b->state_count++; if (b->state_count == LEARN_COUNT) { - /* give ONE frame compensation */ - b->max_level += 1; + /* give SAFE_MARGIN compensation for added stability */ + b->max_level += SAFE_MARGIN; PJ_LOG(5,(b->obj_name,"Delay buffer start running, level=%u", b->max_level)); diff --git a/pjmedia/src/pjmedia/echo_speex.c b/pjmedia/src/pjmedia/echo_speex.c index 3e0d4812..13f5e2fc 100644 --- a/pjmedia/src/pjmedia/echo_speex.c +++ b/pjmedia/src/pjmedia/echo_speex.c @@ -31,7 +31,7 @@ #include "echo_internal.h" #define THIS_FILE "echo_speex.c" -#define BUF_COUNT 16 +#define BUF_COUNT PJMEDIA_SOUND_BUFFER_COUNT #define MIN_PREFETCH 2 #define MAX_PREFETCH (BUF_COUNT*2/3) diff --git a/pjmedia/src/pjmedia/sound_port.c b/pjmedia/src/pjmedia/sound_port.c index bfe1c564..760d79f0 100644 --- a/pjmedia/src/pjmedia/sound_port.c +++ b/pjmedia/src/pjmedia/sound_port.c @@ -363,7 +363,8 @@ PJ_DEF(pj_status_t) pjmedia_snd_port_create( pj_pool_t *pool, #if PJMEDIA_SOUND_USE_DELAYBUF status = pjmedia_delay_buf_create(pool, "snd_buff", samples_per_frame, - 16, -1, &snd_port->delay_buf); + PJMEDIA_SOUND_BUFFER_COUNT, -1, + &snd_port->delay_buf); PJ_ASSERT_RETURN(status == PJ_SUCCESS, status); #else PJ_UNUSED_ARG(status); diff --git a/pjmedia/src/pjmedia/splitcomb.c b/pjmedia/src/pjmedia/splitcomb.c index cf729d01..3beef551 100644 --- a/pjmedia/src/pjmedia/splitcomb.c +++ b/pjmedia/src/pjmedia/splitcomb.c @@ -27,7 +27,13 @@ #define SIGNATURE_PORT PJMEDIA_PORT_SIGNATURE('S', 'p', 'C', 'P') #define THIS_FILE "splitcomb.c" #define TMP_SAMP_TYPE pj_int16_t -#define MAX_BUF_CNT PJMEDIA_SOUND_BUFFER_COUNT + +/* When delay buffer is used, we only need 1 frame buffering */ +#if defined(PJMEDIA_SOUND_USE_DELAYBUF) && PJMEDIA_SOUND_USE_DELAYBUF!=0 +# define MAX_BUF_CNT 1 +#else +# define MAX_BUF_CNT PJMEDIA_SOUND_BUFFER_COUNT +#endif #if 0 # define TRACE_UP_(x) PJ_LOG(5,x) -- cgit v1.2.3