From b0f9569b5c4007721c216a8080b4dce113ad1fd6 Mon Sep 17 00:00:00 2001 From: Jeremy McNamara <jj@nufone.net> Date: Mon, 31 May 2004 02:49:53 +0000 Subject: [PATCH] make sending indications more robust and proper git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@3116 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- channels/chan_skinny.c | 43 +++++++++++++++++++++++++++++++++--------- 1 file changed, 34 insertions(+), 9 deletions(-) diff --git a/channels/chan_skinny.c b/channels/chan_skinny.c index bd86147f1e..22b07c5977 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; -- GitLab