summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenny Prijono <bennylp@teluu.com>2012-04-21 02:17:07 +0000
committerBenny Prijono <bennylp@teluu.com>2012-04-21 02:17:07 +0000
commit6b05067e089b1536a2003d06ddd8bda2de50abb4 (patch)
tree0ade364c36a786158a3a6df418fbaa9788e2020f
parent824407dfad66205a82037b8212549a5a45e87195 (diff)
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
-rw-r--r--pjmedia/include/pjmedia/sound_port.h15
-rw-r--r--pjmedia/src/pjmedia/sound_port.c22
-rw-r--r--pjsip/src/pjsua-lib/pjsua_media.c6
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,9 +89,22 @@ 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
* port to the sound device.
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(&param);
status = pjmedia_aud_dev_default_param(rec_id, &param.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, &param, 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(&param);
status = pjmedia_aud_dev_default_param(dev_id, &param.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, &param, 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(&param);
status = pjmedia_aud_dev_default_param(dev_id, &param.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, &param, 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(&param);
+ param.ec_options = pjsua_var.media_cfg.ec_options;
+
/* Create parameter based on peer info */
status = create_aud_param(&param.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(&param);
+ param.ec_options = pjsua_var.media_cfg.ec_options;
status = create_aud_param(&param.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,