From 6b05067e089b1536a2003d06ddd8bda2de50abb4 Mon Sep 17 00:00:00 2001 From: Benny Prijono Date: Sat, 21 Apr 2012 02:17:07 +0000 Subject: Fixed #1492: The echo options field in the media config and pjsua_set_ec() argument are ignored git-svn-id: http://svn.pjsip.org/repos/pjproject/branches/1.x@4065 74dad513-b988-da41-8d7b-12977e46ad98 --- pjmedia/include/pjmedia/sound_port.h | 15 +++++++++++++++ pjmedia/src/pjmedia/sound_port.c | 22 +++++++++++++++++----- pjsip/src/pjsua-lib/pjsua_media.c | 6 ++++++ 3 files changed, 38 insertions(+), 5 deletions(-) diff --git a/pjmedia/include/pjmedia/sound_port.h b/pjmedia/include/pjmedia/sound_port.h index 4c47da43..61ba66bf 100644 --- a/pjmedia/include/pjmedia/sound_port.h +++ b/pjmedia/include/pjmedia/sound_port.h @@ -75,6 +75,8 @@ enum pjmedia_snd_port_option /** * This structure specifies the parameters to create the sound port. + * Use pjmedia_snd_port_param_default() to initialize this structure with + * default values (mostly zeroes) */ typedef struct pjmedia_snd_port_param { @@ -87,8 +89,21 @@ typedef struct pjmedia_snd_port_param * Sound port creation options. */ unsigned options; + + /** + * Echo cancellation options/flags. + */ + unsigned ec_options; + } pjmedia_snd_port_param; +/** + * Initialize pjmedia_snd_port_param with default values. + * + * @param prm The parameter. + */ +PJ_DECL(void) pjmedia_snd_port_param_default(pjmedia_snd_port_param *prm); + /** * This opaque type describes sound device port connection. * Sound device port is not a media port, but it is used to connect media diff --git a/pjmedia/src/pjmedia/sound_port.c b/pjmedia/src/pjmedia/sound_port.c index cf2890a2..35f91dc9 100644 --- a/pjmedia/src/pjmedia/sound_port.c +++ b/pjmedia/src/pjmedia/sound_port.c @@ -49,6 +49,7 @@ struct pjmedia_snd_port unsigned samples_per_frame; unsigned bits_per_sample; unsigned options; + unsigned prm_ec_options; /* software ec */ pjmedia_echo_state *ec_state; @@ -179,6 +180,12 @@ static pj_status_t rec_cb_ext(void *user_data, pjmedia_frame *frame) return PJ_SUCCESS; } +/* Initialize with default values (zero) */ +PJ_DEF(void) pjmedia_snd_port_param_default(pjmedia_snd_port_param *prm) +{ + pj_bzero(prm, sizeof(*prm)); +} + /* * Start the sound stream. * This may be called even when the sound stream has already been started. @@ -269,7 +276,8 @@ static pj_status_t start_sound_device( pj_pool_t *pool, } status = pjmedia_snd_port_set_ec(snd_port, pool, - snd_port->aud_param.ec_tail_ms, 0); + snd_port->aud_param.ec_tail_ms, + snd_port->prm_ec_options); if (status != PJ_SUCCESS) { pjmedia_aud_stream_destroy(snd_port->aud_stream); snd_port->aud_stream = NULL; @@ -330,7 +338,7 @@ PJ_DEF(pj_status_t) pjmedia_snd_port_create( pj_pool_t *pool, pjmedia_snd_port_param param; pj_status_t status; - PJ_UNUSED_ARG(options); + pjmedia_snd_port_param_default(¶m); status = pjmedia_aud_dev_default_param(rec_id, ¶m.base); if (status != PJ_SUCCESS) @@ -344,6 +352,7 @@ PJ_DEF(pj_status_t) pjmedia_snd_port_create( pj_pool_t *pool, param.base.samples_per_frame = samples_per_frame; param.base.bits_per_sample = bits_per_sample; param.options = options; + param.ec_options = 0; return pjmedia_snd_port_create2(pool, ¶m, p_port); } @@ -363,7 +372,7 @@ PJ_DEF(pj_status_t) pjmedia_snd_port_create_rec( pj_pool_t *pool, pjmedia_snd_port_param param; pj_status_t status; - PJ_UNUSED_ARG(options); + pjmedia_snd_port_param_default(¶m); status = pjmedia_aud_dev_default_param(dev_id, ¶m.base); if (status != PJ_SUCCESS) @@ -376,6 +385,7 @@ PJ_DEF(pj_status_t) pjmedia_snd_port_create_rec( pj_pool_t *pool, param.base.samples_per_frame = samples_per_frame; param.base.bits_per_sample = bits_per_sample; param.options = options; + param.ec_options = 0; return pjmedia_snd_port_create2(pool, ¶m, p_port); } @@ -396,7 +406,7 @@ PJ_DEF(pj_status_t) pjmedia_snd_port_create_player( pj_pool_t *pool, pjmedia_snd_port_param param; pj_status_t status; - PJ_UNUSED_ARG(options); + pjmedia_snd_port_param_default(¶m); status = pjmedia_aud_dev_default_param(dev_id, ¶m.base); if (status != PJ_SUCCESS) @@ -409,6 +419,7 @@ PJ_DEF(pj_status_t) pjmedia_snd_port_create_player( pj_pool_t *pool, param.base.samples_per_frame = samples_per_frame; param.base.bits_per_sample = bits_per_sample; param.options = options; + param.ec_options = 0; return pjmedia_snd_port_create2(pool, ¶m, p_port); } @@ -436,8 +447,9 @@ PJ_DEF(pj_status_t) pjmedia_snd_port_create2(pj_pool_t *pool, snd_port->channel_count = prm->base.channel_count; snd_port->samples_per_frame = prm->base.samples_per_frame; snd_port->bits_per_sample = prm->base.bits_per_sample; - pj_memcpy(&snd_port->aud_param, prm, sizeof(snd_port->aud_param)); + pj_memcpy(&snd_port->aud_param, &prm->base, sizeof(snd_port->aud_param)); snd_port->options = prm->options; + snd_port->prm_ec_options = prm->ec_options; /* Start sound device immediately. * If there's no port connected, the sound callback will return diff --git a/pjsip/src/pjsua-lib/pjsua_media.c b/pjsip/src/pjsua-lib/pjsua_media.c index 2a9927a7..f887b31f 100644 --- a/pjsip/src/pjsua-lib/pjsua_media.c +++ b/pjsip/src/pjsua-lib/pjsua_media.c @@ -2028,6 +2028,9 @@ PJ_DEF(pj_status_t) pjsua_conf_connect( pjsua_conf_port_id source, if (pjsua_var.cap_dev != NULL_SND_DEV_ID) { pjmedia_snd_port_param param; + pjmedia_snd_port_param_default(¶m); + param.ec_options = pjsua_var.media_cfg.ec_options; + /* Create parameter based on peer info */ status = create_aud_param(¶m.base, pjsua_var.cap_dev, pjsua_var.play_dev, @@ -2952,6 +2955,8 @@ PJ_DEF(pj_status_t) pjsua_set_snd_dev( int capture_dev, samples_per_frame = alt_cr[i] * pjsua_var.media_cfg.audio_frame_ptime * pjsua_var.media_cfg.channel_count / 1000; + pjmedia_snd_port_param_default(¶m); + param.ec_options = pjsua_var.media_cfg.ec_options; status = create_aud_param(¶m.base, capture_dev, playback_dev, alt_cr[i], pjsua_var.media_cfg.channel_count, samples_per_frame, 16); @@ -3080,6 +3085,7 @@ PJ_DEF(pj_status_t) pjsua_set_ec(unsigned tail_ms, unsigned options) PJSUA_LOCK(); pjsua_var.media_cfg.ec_tail_len = tail_ms; + pjsua_var.media_cfg.ec_options = options; if (pjsua_var.snd_port) status = pjmedia_snd_port_set_ec(pjsua_var.snd_port, pjsua_var.pool, -- cgit v1.2.3