aboutsummaryrefslogtreecommitdiffstats
path: root/channels/chan_skinny.c
diff options
context:
space:
mode:
authorjeremy <jeremy@f38db490-d61c-443f-a65b-d21fe96a405b>2004-05-31 02:49:53 +0000
committerjeremy <jeremy@f38db490-d61c-443f-a65b-d21fe96a405b>2004-05-31 02:49:53 +0000
commitf91947fbe68b00682c8465a6b7671ed7a7ca776d (patch)
tree526a213a4b1d6c320906f795b634acf2d25ea2ec /channels/chan_skinny.c
parent2e83d5fcce96d059cd931ab61048572626446c05 (diff)
make sending indications more robust and proper
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@3116 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels/chan_skinny.c')
-rwxr-xr-xchannels/chan_skinny.c43
1 files changed, 34 insertions, 9 deletions
diff --git a/channels/chan_skinny.c b/channels/chan_skinny.c
index bd86147f1..22b07c597 100755
--- a/channels/chan_skinny.c
+++ b/channels/chan_skinny.c
@@ -617,6 +617,8 @@ struct skinny_subchannel {
struct skinny_line *parent;
struct ast_rtp *rtp;
time_t lastouttime;
+ int progress;
+ int ringing;
int lastout;
int cxmode;
int nat;
@@ -1697,17 +1699,40 @@ static int skinny_indicate(struct ast_channel *ast, int ind)
}
switch(ind) {
case AST_CONTROL_RINGING:
- transmit_tone(s, SKINNY_ALERT);
- transmit_callstate(s, l->instance, SKINNY_PROGRESS, sub->callid);
- break;
+ if (ast->_state == AST_STATE_RINGING) {
+ if (!sub->progress) {
+ transmit_tone(s, SKINNY_ALERT);
+ transmit_callstate(s, l->instance, SKINNY_RINGOUT, sub->callid);
+ sub->ringing = 1;
+ break;
+ }
+ }
+ return -1;
case AST_CONTROL_BUSY:
- transmit_tone(s, SKINNY_BUSYTONE);
- transmit_callstate(s, l->instance, SKINNY_BUSY, sub->callid);
- break;
+ if (ast->_state != AST_STATE_UP) {
+ transmit_tone(s, SKINNY_BUSYTONE);
+ transmit_callstate(s, l->instance, SKINNY_BUSY, sub->callid);
+ sub->alreadygone = 1;
+ ast_softhangup_nolock(ast, AST_SOFTHANGUP_DEV);
+ break;
+ }
+ return -1;
case AST_CONTROL_CONGESTION:
- transmit_tone(s, SKINNY_REORDER);
- transmit_callstate(s, l->instance, SKINNY_CONGESTION, sub->callid);
- break;
+ if (ast->_state != AST_STATE_UP) {
+ transmit_tone(s, SKINNY_REORDER);
+ transmit_callstate(s, l->instance, SKINNY_CONGESTION, sub->callid);
+ sub->alreadygone = 1;
+ ast_softhangup_nolock(ast, AST_SOFTHANGUP_DEV);
+ break;
+ }
+ return -1;
+ case AST_CONTROL_PROGRESS:
+ if ((ast->_state != AST_STATE_UP) && !sub->progress && !sub->outgoing) {
+ transmit_callstate(s, l->instance, SKINNY_PROGRESS, sub->callid);
+ sub->progress = 1;
+ break;
+ }
+ return -1;
case -1:
transmit_tone(s, SKINNY_SILENCE);
break;