diff options
author | jeremy <jeremy@f38db490-d61c-443f-a65b-d21fe96a405b> | 2004-05-31 02:49:53 +0000 |
---|---|---|
committer | jeremy <jeremy@f38db490-d61c-443f-a65b-d21fe96a405b> | 2004-05-31 02:49:53 +0000 |
commit | f91947fbe68b00682c8465a6b7671ed7a7ca776d (patch) | |
tree | 526a213a4b1d6c320906f795b634acf2d25ea2ec /channels/chan_skinny.c | |
parent | 2e83d5fcce96d059cd931ab61048572626446c05 (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-x | channels/chan_skinny.c | 43 |
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; |