summaryrefslogtreecommitdiff
path: root/pjsip
diff options
context:
space:
mode:
authorNanang Izzuddin <nanang@teluu.com>2008-06-16 09:52:50 +0000
committerNanang Izzuddin <nanang@teluu.com>2008-06-16 09:52:50 +0000
commit9c5b754daa934f2d80b2333c4eb0ec90965a391d (patch)
treeefdf899e104b01b8a097a23eeb142e62368c5216 /pjsip
parentc6958062522190e9ee210d9184c52bc228155c2f (diff)
More ticket #540: updated snd-auto-close to work friendly with call
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@2027 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjsip')
-rw-r--r--pjsip/src/pjsua-lib/pjsua_call.c13
-rw-r--r--pjsip/src/pjsua-lib/pjsua_media.c60
2 files changed, 47 insertions, 26 deletions
diff --git a/pjsip/src/pjsua-lib/pjsua_call.c b/pjsip/src/pjsua-lib/pjsua_call.c
index 8c1041eb..f20fea0f 100644
--- a/pjsip/src/pjsua-lib/pjsua_call.c
+++ b/pjsip/src/pjsua-lib/pjsua_call.c
@@ -348,6 +348,19 @@ PJ_DEF(pj_status_t) pjsua_call_make_call( pjsua_acc_id acc_id,
PJSUA_LOCK();
+ /* Create sound port if none is instantiated */
+ if (pjsua_var.snd_port==NULL && pjsua_var.null_snd==NULL &&
+ !pjsua_var.no_snd)
+ {
+ pj_status_t status;
+
+ status = pjsua_set_snd_dev(pjsua_var.cap_dev, pjsua_var.play_dev);
+ if (status != PJ_SUCCESS) {
+ PJSUA_UNLOCK();
+ return status;
+ }
+ }
+
acc = &pjsua_var.acc[acc_id];
if (!acc->valid) {
pjsua_perror(THIS_FILE, "Unable to make call because account "
diff --git a/pjsip/src/pjsua-lib/pjsua_media.c b/pjsip/src/pjsua-lib/pjsua_media.c
index 0f923452..c678341d 100644
--- a/pjsip/src/pjsua-lib/pjsua_media.c
+++ b/pjsip/src/pjsua-lib/pjsua_media.c
@@ -425,6 +425,30 @@ on_error:
return status;
}
+/* Check if sound device is idle. */
+static void check_snd_dev_idle()
+{
+
+ /* Activate sound device auto-close timer if sound device is idle.
+ * It is idle when there is no port connection in the bridge.
+ */
+ if ((pjsua_var.snd_port!=NULL || pjsua_var.null_snd!=NULL) &&
+ pjsua_var.snd_idle_timer.id == PJ_FALSE &&
+ pjmedia_conf_get_connect_count(pjsua_var.mconf) == 0 &&
+ pjsua_var.media_cfg.snd_auto_close_time >= 0)
+ {
+ pj_time_val delay;
+
+ delay.msec = 0;
+ delay.sec = pjsua_var.media_cfg.snd_auto_close_time;
+
+ pjsua_var.snd_idle_timer.id = PJ_TRUE;
+ pjsip_endpt_schedule_timer(pjsua_var.endpt, &pjsua_var.snd_idle_timer,
+ &delay);
+ }
+}
+
+
/* Timer callback to close sound device */
static void close_snd_timer_cb( pj_timer_heap_t *th,
pj_timer_entry *entry)
@@ -965,7 +989,7 @@ static void stop_media_session(pjsua_call_id call_id)
if (call->conf_slot != PJSUA_INVALID_ID) {
if (pjsua_var.mconf) {
- pjmedia_conf_remove_port(pjsua_var.mconf, call->conf_slot);
+ pjsua_conf_remove_port(call->conf_slot);
}
call->conf_slot = PJSUA_INVALID_ID;
}
@@ -1325,7 +1349,12 @@ PJ_DEF(pj_status_t) pjsua_conf_add_port( pj_pool_t *pool,
*/
PJ_DEF(pj_status_t) pjsua_conf_remove_port(pjsua_conf_port_id id)
{
- return pjmedia_conf_remove_port(pjsua_var.mconf, (unsigned)id);
+ pj_status_t status;
+
+ status = pjmedia_conf_remove_port(pjsua_var.mconf, (unsigned)id);
+ check_snd_dev_idle();
+
+ return status;
}
@@ -1367,26 +1396,7 @@ PJ_DEF(pj_status_t) pjsua_conf_disconnect( pjsua_conf_port_id source,
pj_status_t status;
status = pjmedia_conf_disconnect_port(pjsua_var.mconf, source, sink);
- if (status != PJ_SUCCESS)
- return status;
-
- /* If no port is connected, sound device must be idle. Activate sound
- * device auto-close timer.
- */
- if ((pjsua_var.snd_port!=NULL || pjsua_var.null_snd!=NULL) &&
- pjsua_var.snd_idle_timer.id==PJ_FALSE &&
- pjmedia_conf_get_connect_count(pjsua_var.mconf) == 0 &&
- pjsua_var.media_cfg.snd_auto_close_time >= 0)
- {
- pj_time_val delay;
-
- delay.msec = 0;
- delay.sec = pjsua_var.media_cfg.snd_auto_close_time;
-
- pjsua_var.snd_idle_timer.id = PJ_TRUE;
- pjsip_endpt_schedule_timer(pjsua_var.endpt, &pjsua_var.snd_idle_timer,
- &delay);
- }
+ check_snd_dev_idle();
return status;
}
@@ -1648,8 +1658,7 @@ PJ_DEF(pj_status_t) pjsua_player_destroy(pjsua_player_id id)
PJSUA_LOCK();
if (pjsua_var.player[id].port) {
- pjmedia_conf_remove_port(pjsua_var.mconf,
- pjsua_var.player[id].slot);
+ pjsua_conf_remove_port(pjsua_var.player[id].slot);
pjmedia_port_destroy(pjsua_var.player[id].port);
pjsua_var.player[id].port = NULL;
pjsua_var.player[id].slot = 0xFFFF;
@@ -1824,8 +1833,7 @@ PJ_DEF(pj_status_t) pjsua_recorder_destroy(pjsua_recorder_id id)
PJSUA_LOCK();
if (pjsua_var.recorder[id].port) {
- pjmedia_conf_remove_port(pjsua_var.mconf,
- pjsua_var.recorder[id].slot);
+ pjsua_conf_remove_port(pjsua_var.recorder[id].slot);
pjmedia_port_destroy(pjsua_var.recorder[id].port);
pjsua_var.recorder[id].port = NULL;
pjsua_var.recorder[id].slot = 0xFFFF;