From 19308da7aa0e17ca3d819210a093169bd2e8c892 Mon Sep 17 00:00:00 2001 From: Nanang Izzuddin Date: Mon, 1 Jun 2009 13:56:09 +0000 Subject: Ticket #834: - Added calls to delay buf destructor in conference.c and echo_common.c. - Moved mutex creation to the end of pjmedia_delay_buf_create(). - Deprecated pjmedia_conf_add_passive_port(). git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@2728 74dad513-b988-da41-8d7b-12977e46ad98 --- pjmedia/src/pjmedia/conference.c | 39 ++++++++++++++++++++++++++++++++++++--- pjmedia/src/pjmedia/delaybuf.c | 13 ++++++++----- pjmedia/src/pjmedia/echo_common.c | 6 ++++++ 3 files changed, 50 insertions(+), 8 deletions(-) (limited to 'pjmedia/src') diff --git a/pjmedia/src/pjmedia/conference.c b/pjmedia/src/pjmedia/conference.c index 166247b7..fd237aa4 100644 --- a/pjmedia/src/pjmedia/conference.c +++ b/pjmedia/src/pjmedia/conference.c @@ -571,13 +571,17 @@ PJ_DEF(pj_status_t) pjmedia_conf_create( pj_pool_t *pool, /* Create port zero for sound device. */ status = create_sound_port(pool, conf); - if (status != PJ_SUCCESS) + if (status != PJ_SUCCESS) { + pjmedia_conf_destroy(conf); return status; + } /* Create mutex. */ status = pj_mutex_create_recursive(pool, "conf", &conf->mutex); - if (status != PJ_SUCCESS) + if (status != PJ_SUCCESS) { + pjmedia_conf_destroy(conf); return status; + } /* If sound device was created, connect sound device to the * master port. @@ -626,6 +630,8 @@ static pj_status_t resume_sound( pjmedia_conf *conf ) */ PJ_DEF(pj_status_t) pjmedia_conf_destroy( pjmedia_conf *conf ) { + unsigned i, ci; + PJ_ASSERT_RETURN(conf != NULL, PJ_EINVAL); /* Destroy sound device port. */ @@ -634,8 +640,24 @@ PJ_DEF(pj_status_t) pjmedia_conf_destroy( pjmedia_conf *conf ) conf->snd_dev_port = NULL; } + /* Destroy delay buf of all (passive) ports. */ + for (i=0, ci=0; imax_ports && ciport_cnt; ++i) { + struct conf_port *cport; + + cport = conf->ports[i]; + if (!cport) + continue; + + ++ci; + if (cport->delay_buf) { + pjmedia_delay_buf_destroy(cport->delay_buf); + cport->delay_buf = NULL; + } + } + /* Destroy mutex */ - pj_mutex_destroy(conf->mutex); + if (conf->mutex) + pj_mutex_destroy(conf->mutex); return PJ_SUCCESS; } @@ -793,6 +815,9 @@ PJ_DEF(pj_status_t) pjmedia_conf_add_passive_port( pjmedia_conf *conf, pj_str_t tmp; pj_status_t status; + PJ_LOG(1, (THIS_FILE, "This API has been deprecated since 1.3 and will " + "be removed in the future release!")); + PJ_ASSERT_RETURN(conf && pool, PJ_EINVAL); /* For this version of PJMEDIA, channel(s) number MUST be: @@ -1123,6 +1148,14 @@ PJ_DEF(pj_status_t) pjmedia_conf_remove_port( pjmedia_conf *conf, --conf->connect_cnt; } + /* Destroy pjmedia port if this conf port is passive port, + * i.e: has delay buf. + */ + if (conf_port->delay_buf) { + pjmedia_port_destroy(conf_port->port); + conf_port->port = NULL; + } + /* Remove the port. */ conf->ports[port] = NULL; --conf->port_cnt; diff --git a/pjmedia/src/pjmedia/delaybuf.c b/pjmedia/src/pjmedia/delaybuf.c index df075043..e39cda79 100644 --- a/pjmedia/src/pjmedia/delaybuf.c +++ b/pjmedia/src/pjmedia/delaybuf.c @@ -121,20 +121,23 @@ PJ_DEF(pj_status_t) pjmedia_delay_buf_create( pj_pool_t *pool, b->eff_cnt = b->max_cnt >> 1; b->recalc_timer = RECALC_TIME; - status = pj_lock_create_recursive_mutex(pool, b->obj_name, - &b->lock); - if (status != PJ_SUCCESS) - return status; - + /* Create circular buffer */ status = pjmedia_circ_buf_create(pool, b->max_cnt, &b->circ_buf); if (status != PJ_SUCCESS) return status; + /* Create WSOLA */ status = pjmedia_wsola_create(pool, clock_rate, samples_per_frame, 1, 0, &b->wsola); if (status != PJ_SUCCESS) return status; + /* Finally, create mutex */ + status = pj_lock_create_recursive_mutex(pool, b->obj_name, + &b->lock); + if (status != PJ_SUCCESS) + return status; + *p_b = b; TRACE__((b->obj_name,"Delay buffer created")); diff --git a/pjmedia/src/pjmedia/echo_common.c b/pjmedia/src/pjmedia/echo_common.c index 8d77920d..920988d2 100644 --- a/pjmedia/src/pjmedia/echo_common.c +++ b/pjmedia/src/pjmedia/echo_common.c @@ -239,6 +239,12 @@ PJ_DEF(pj_status_t) pjmedia_echo_create2(pj_pool_t *pool, PJ_DEF(pj_status_t) pjmedia_echo_destroy(pjmedia_echo_state *echo ) { (*echo->op->ec_destroy)(echo->state); + + if (echo->delay_buf) { + pjmedia_delay_buf_destroy(echo->delay_buf); + echo->delay_buf = NULL; + } + pj_pool_release(echo->pool); return PJ_SUCCESS; } -- cgit v1.2.3