diff options
author | Benny Prijono <bennylp@teluu.com> | 2008-01-19 09:39:52 +0000 |
---|---|---|
committer | Benny Prijono <bennylp@teluu.com> | 2008-01-19 09:39:52 +0000 |
commit | 288b15dcff2f25d22582a8523e09d916a25d6596 (patch) | |
tree | 1fa440f21b12f6dffb005ff19230583e152c3c5b /pjmedia | |
parent | d820bcd653fecf06bae3e835d805c8f560b00961 (diff) |
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
Diffstat (limited to 'pjmedia')
-rw-r--r-- | pjmedia/include/pjmedia/config.h | 17 | ||||
-rw-r--r-- | pjmedia/src/pjmedia/conference.c | 8 | ||||
-rw-r--r-- | pjmedia/src/pjmedia/delaybuf.c | 25 | ||||
-rw-r--r-- | pjmedia/src/pjmedia/echo_speex.c | 2 | ||||
-rw-r--r-- | pjmedia/src/pjmedia/sound_port.c | 3 | ||||
-rw-r--r-- | pjmedia/src/pjmedia/splitcomb.c | 8 |
6 files changed, 41 insertions, 22 deletions
diff --git a/pjmedia/include/pjmedia/config.h b/pjmedia/include/pjmedia/config.h index c39c7172..4c7b26be 100644 --- a/pjmedia/include/pjmedia/config.h +++ b/pjmedia/include/pjmedia/config.h @@ -97,6 +97,9 @@ * The delay buffer also performs the best delay calculation * for the sound device, and will try to limit the delay caused * by uneven callback calls to this delay. + * + * When this setting is enabled, the PJMEDIA_SOUND_BUFFER_COUNT + * macro will specify the maximum size of the delay buffer. */ #ifndef PJMEDIA_SOUND_USE_DELAYBUF # define PJMEDIA_SOUND_USE_DELAYBUF 0 @@ -104,17 +107,6 @@ /** - * Whenever delay buffer is enabled for sound device, - * PJMEDIA_SOUND_BUFFER_COUNT is better to be set to 1, - * because sound callbacks will be called evenly thus - * there's no need to have this buffer. - */ -#if defined(PJMEDIA_SOUND_USE_DELAYBUF) && PJMEDIA_SOUND_USE_DELAYBUF!=0 -# define PJMEDIA_SOUND_BUFFER_COUNT 1 -#endif - - -/** * Specify number of sound buffers. Larger number is better for sound * stability and to accommodate sound devices that are unable to send frames * in timely manner, however it would probably cause more audio delay (and @@ -124,9 +116,6 @@ * The setting here currently is used by the conference bridge, the splitter * combiner port, and dsound.c. * - * Note that when PJMEDIA_SOUND_USE_DELAYBUF is enabled, it's best to - * set PJMEDIA_SOUND_BUFFER_COUNT to 1 to reduce voice latency. - * * Default: 6 */ #ifndef PJMEDIA_SOUND_BUFFER_COUNT 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) |