diff options
Diffstat (limited to 'pjsip')
-rw-r--r-- | pjsip/include/pjsua-lib/pjsua.h | 7 | ||||
-rw-r--r-- | pjsip/include/pjsua-lib/pjsua_internal.h | 1 | ||||
-rw-r--r-- | pjsip/src/pjsua-lib/pjsua_media.c | 19 |
3 files changed, 25 insertions, 2 deletions
diff --git a/pjsip/include/pjsua-lib/pjsua.h b/pjsip/include/pjsua-lib/pjsua.h index fe1b1a70..5ca718ce 100644 --- a/pjsip/include/pjsua-lib/pjsua.h +++ b/pjsip/include/pjsua-lib/pjsua.h @@ -2128,6 +2128,12 @@ struct pjsua_media_config */ unsigned rx_drop_pct; + /** + * Echo canceller tail length, in miliseconds. + * + * Default: 256 + */ + unsigned ec_tail_len; }; @@ -2146,6 +2152,7 @@ PJ_INLINE(void) pjsua_media_config_default(pjsua_media_config *cfg) cfg->thread_cnt = 1; cfg->quality = 6; cfg->ilbc_mode = 20; + cfg->ec_tail_len = 256; } diff --git a/pjsip/include/pjsua-lib/pjsua_internal.h b/pjsip/include/pjsua-lib/pjsua_internal.h index c862219f..95c5c40e 100644 --- a/pjsip/include/pjsua-lib/pjsua_internal.h +++ b/pjsip/include/pjsua-lib/pjsua_internal.h @@ -204,6 +204,7 @@ struct pjsua_data pjmedia_conf *mconf; /**< Conference bridge. */ int cap_dev; /**< Capture device ID. */ int play_dev; /**< Playback device ID. */ + pjmedia_port *aec_port; /**< AEC port to conf bridge. */ pj_bool_t no_snd; /**< No sound (app will manage it) */ pjmedia_snd_port *snd_port; /**< Sound port. */ pjmedia_master_port *null_snd; /**< Master port for null sound. */ diff --git a/pjsip/src/pjsua-lib/pjsua_media.c b/pjsip/src/pjsua-lib/pjsua_media.c index d92d0cb9..284cdb58 100644 --- a/pjsip/src/pjsua-lib/pjsua_media.c +++ b/pjsip/src/pjsua-lib/pjsua_media.c @@ -968,8 +968,23 @@ PJ_DEF(pj_status_t) pjsua_set_snd_dev( int capture_dev, conf_port = pjmedia_conf_get_master_port(pjsua_var.mconf); pj_assert(conf_port != NULL); - /* Connect to the conference port */ - status = pjmedia_snd_port_connect(pjsua_var.snd_port, conf_port); + /* Create AEC if it's not created */ + if (pjsua_var.aec_port == NULL) { + status = pjmedia_aec_port_create(pjsua_var.pool, conf_port, + conf_port->info.clock_rate * + pjsua_var.media_cfg.ec_tail_len / + 1000, + &pjsua_var.aec_port); + if (status != PJ_SUCCESS) { + pjsua_perror(THIS_FILE, "Unable to create AEC port", status); + pjmedia_snd_port_destroy(pjsua_var.snd_port); + pjsua_var.snd_port = NULL; + return status; + } + } + + /* Connect to the AEC port */ + status = pjmedia_snd_port_connect(pjsua_var.snd_port, pjsua_var.aec_port); if (status != PJ_SUCCESS) { pjsua_perror(THIS_FILE, "Unable to connect conference port to " "sound device", status); |