diff options
author | qwell <qwell@f38db490-d61c-443f-a65b-d21fe96a405b> | 2008-04-07 18:00:09 +0000 |
---|---|---|
committer | qwell <qwell@f38db490-d61c-443f-a65b-d21fe96a405b> | 2008-04-07 18:00:09 +0000 |
commit | faddb949839100acea93934d82a69a2a1b403e04 (patch) | |
tree | 6f67c5f8a37606e739cda6129b23cc03e53db35e /channels/chan_skinny.c | |
parent | 310e77ff9e7956200aad94bd36e751b884a12eb5 (diff) |
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.4@113118 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 17c6c82dc..0764e1959 100644 --- a/channels/chan_skinny.c +++ b/channels/chan_skinny.c @@ -1028,6 +1028,7 @@ static struct skinny_device { int lastlineinstance; int lastcallreference; int capability; + int earlyrtp; char exten[AST_MAX_EXTENSION]; struct sockaddr_in addr; struct in_addr ourip; @@ -2100,6 +2101,7 @@ static struct skinny_device *build_device(const char *cat, struct ast_variable * d->lastlineinstance = 1; d->capability = default_capability; d->prefs = default_prefs; + d->earlyrtp = 1; while(v) { if (!strcasecmp(v->name, "host")) { if (ast_get_ip(&d->addr, v->value)) { @@ -2120,6 +2122,8 @@ static struct skinny_device *build_device(const char *cat, struct ast_variable * ast_parse_allow_disallow(&d->prefs, &d->capability, v->value, 0); } else if (!strcasecmp(v->name, "version")) { ast_copy_string(d->version_id, v->value, sizeof(d->version_id)); + } 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")) { @@ -2322,6 +2326,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"); @@ -2746,45 +2753,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: @@ -2800,7 +2823,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; } |