aboutsummaryrefslogtreecommitdiffstats
path: root/channels
diff options
context:
space:
mode:
authorqwell <qwell@f38db490-d61c-443f-a65b-d21fe96a405b>2008-04-07 18:00:09 +0000
committerqwell <qwell@f38db490-d61c-443f-a65b-d21fe96a405b>2008-04-07 18:00:09 +0000
commitfaddb949839100acea93934d82a69a2a1b403e04 (patch)
tree6f67c5f8a37606e739cda6129b23cc03e53db35e /channels
parent310e77ff9e7956200aad94bd36e751b884a12eb5 (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')
-rw-r--r--channels/chan_skinny.c51
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;
}