diff options
author | qwell <qwell@f38db490-d61c-443f-a65b-d21fe96a405b> | 2008-04-07 19:10:45 +0000 |
---|---|---|
committer | qwell <qwell@f38db490-d61c-443f-a65b-d21fe96a405b> | 2008-04-07 19:10:45 +0000 |
commit | 02c47605bda4df8fe9fcb380ad9b136ae4a53326 (patch) | |
tree | 4b58f02238534ee2b1bd808a831f01ca4419e0fc /channels/chan_skinny.c | |
parent | c2419f9cd423e5412361deb80a708755a0f6b5a2 (diff) |
Merged revisions 113119 via svnmerge from
https://origsvn.digium.com/svn/asterisk/trunk
................
r113119 | qwell | 2008-04-07 13:02:51 -0500 (Mon, 07 Apr 2008) | 16 lines
Merged revisions 113118 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.4
........
r113118 | qwell | 2008-04-07 13:00:09 -0500 (Mon, 07 Apr 2008) | 8 lines
Allow playback with noanswer (and add earlyrtp option).
(closes issue #9077)
Reported by: pj
Patches:
earlyrtp.diff uploaded by wedhorn (license 30)
Tested by: pj, qwell, DEA, wedhorn
........
................
git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.6.0@113174 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels/chan_skinny.c')
-rw-r--r-- | channels/chan_skinny.c | 51 |
1 files changed, 37 insertions, 14 deletions
diff --git a/channels/chan_skinny.c b/channels/chan_skinny.c index b100a5c32..ca8ec8158 100644 --- a/channels/chan_skinny.c +++ b/channels/chan_skinny.c @@ -1223,6 +1223,7 @@ static struct skinny_device { int lastlineinstance; int lastcallreference; int capability; + int earlyrtp; struct sockaddr_in addr; struct in_addr ourip; struct skinny_line *lines; @@ -2902,6 +2903,7 @@ static struct skinny_device *build_device(const char *cat, struct ast_variable * else memset(device_vmexten, 0, sizeof(device_vmexten)); + d->earlyrtp = 1; while(v) { if (!strcasecmp(v->name, "host")) { if (ast_get_ip(&d->addr, v->value)) { @@ -2928,6 +2930,8 @@ static struct skinny_device *build_device(const char *cat, struct ast_variable * ast_copy_string(d->version_id, v->value, sizeof(d->version_id)); } else if (!strcasecmp(v->name, "canreinvite")) { canreinvite = ast_true(v->value); + } else if (!strcasecmp(v->name, "earlyrtp")) { + d->earlyrtp = ast_true(v->value); } else if (!strcasecmp(v->name, "nat")) { nat = ast_true(v->value); } else if (!strcasecmp(v->name, "callerid")) { @@ -3148,6 +3152,9 @@ static void *skinny_newcall(void *data) l->hidecallerid ? "" : l->cid_name, c->cid.cid_ani ? NULL : l->cid_num); ast_setstate(c, AST_STATE_RING); + if (!sub->rtp) { + start_rtp(sub); + } res = ast_pbx_run(c); if (res) { ast_log(LOG_WARNING, "PBX exited non-zero\n"); @@ -3602,45 +3609,61 @@ static int skinny_indicate(struct ast_channel *ast, int ind, const void *data, s case AST_CONTROL_RINGING: if (ast->_state != AST_STATE_UP) { if (!sub->progress) { - transmit_tone(s, SKINNY_ALERT, l->instance, sub->callid); + if (!d->earlyrtp) { + transmit_tone(s, SKINNY_ALERT, l->instance, sub->callid); + } transmit_callstate(s, l->instance, SKINNY_RINGOUT, sub->callid); transmit_dialednumber(s, exten, l->instance, sub->callid); transmit_displaypromptstatus(s, "Ring Out", 0, l->instance, sub->callid); transmit_callinfo(s, ast->cid.cid_name, ast->cid.cid_num, exten, exten, l->instance, sub->callid, 2); /* 2 = outgoing from phone */ sub->ringing = 1; - break; + if (!d->earlyrtp) { + break; + } } } - return -1; + return -1; /* Tell asterisk to provide inband signalling */ case AST_CONTROL_BUSY: if (ast->_state != AST_STATE_UP) { - transmit_tone(s, SKINNY_BUSYTONE, l->instance, sub->callid); + if (!d->earlyrtp) { + transmit_tone(s, SKINNY_BUSYTONE, l->instance, sub->callid); + } transmit_callstate(s, l->instance, SKINNY_BUSY, sub->callid); sub->alreadygone = 1; ast_softhangup_nolock(ast, AST_SOFTHANGUP_DEV); - break; + if (!d->earlyrtp) { + break; + } } - return -1; + return -1; /* Tell asterisk to provide inband signalling */ case AST_CONTROL_CONGESTION: if (ast->_state != AST_STATE_UP) { - transmit_tone(s, SKINNY_REORDER, l->instance, sub->callid); + if (!d->earlyrtp) { + transmit_tone(s, SKINNY_REORDER, l->instance, sub->callid); + } transmit_callstate(s, l->instance, SKINNY_CONGESTION, sub->callid); sub->alreadygone = 1; ast_softhangup_nolock(ast, AST_SOFTHANGUP_DEV); - break; + if (!d->earlyrtp) { + break; + } } - return -1; + return -1; /* Tell asterisk to provide inband signalling */ case AST_CONTROL_PROGRESS: if ((ast->_state != AST_STATE_UP) && !sub->progress && !sub->outgoing) { - transmit_tone(s, SKINNY_ALERT, l->instance, sub->callid); + if (!d->earlyrtp) { + transmit_tone(s, SKINNY_ALERT, l->instance, sub->callid); + } transmit_callstate(s, l->instance, SKINNY_PROGRESS, sub->callid); transmit_displaypromptstatus(s, "Call Progress", 0, l->instance, sub->callid); transmit_callinfo(s, ast->cid.cid_name, ast->cid.cid_num, exten, exten, l->instance, sub->callid, 2); /* 2 = outgoing from phone */ sub->progress = 1; - break; + if (!d->earlyrtp) { + break; + } } - return -1; - case -1: + return -1; /* Tell asterisk to provide inband signalling */ + case -1: /* STOP_TONE */ transmit_tone(s, SKINNY_SILENCE, l->instance, sub->callid); break; case AST_CONTROL_HOLD: @@ -3656,7 +3679,7 @@ static int skinny_indicate(struct ast_channel *ast, int ind, const void *data, s break; default: ast_log(LOG_WARNING, "Don't know how to indicate condition %d\n", ind); - return -1; + return -1; /* Tell asterisk to provide inband signalling */ } return 0; } |