[Asterisk-cvs] asterisk/channels chan_agent.c,1.128,1.129

kpfleming at lists.digium.com kpfleming at lists.digium.com
Tue Apr 5 16:37:40 CDT 2005


Update of /usr/cvsroot/asterisk/channels
In directory mongoose.digium.com:/tmp/cvs-serv9989/channels

Modified Files:
	chan_agent.c 
Log Message:
optimize frame handling in agent_read()
ensure that the call is marked acknowledged when it goes to AST_STATE_UP even if AST_CONTROL_ANSWER is not received (if ackcall is disabled)


Index: chan_agent.c
===================================================================
RCS file: /usr/cvsroot/asterisk/channels/chan_agent.c,v
retrieving revision 1.128
retrieving revision 1.129
diff -u -d -r1.128 -r1.129
--- chan_agent.c	28 Mar 2005 20:48:24 -0000	1.128
+++ chan_agent.c	5 Apr 2005 21:30:24 -0000	1.129
@@ -379,7 +379,7 @@
 	} else
 		f = &null_frame;
 	if (!f) {
-		/* If there's a channel, hang it up  (if it's on a callback) make it NULL */
+		/* If there's a channel, hang it up (if it's on a callback) make it NULL */
 		if (p->chan) {
 			p->chan->_bridge = NULL;
 			/* Note that we don't hangup if it's not a callback because Asterisk will do it
@@ -401,41 +401,48 @@
 			p->chan = NULL;
 			p->acknowledged = 0;
 		}
-	}
-	if (p->chan && f && (f->frametype == AST_FRAME_CONTROL) && (f->subclass == AST_CONTROL_ANSWER)) {
-/* TC */
-		ast_log(LOG_DEBUG, "Got answer on %s\n", p->chan->name);
-		if (p->ackcall) {
-			if (option_verbose > 2)
-				ast_verbose(VERBOSE_PREFIX_3 "%s answered, waiting for '#' to acknowledge\n", p->chan->name);
-			/* Don't pass answer along */
-			ast_frfree(f);
-			f = &null_frame;
-		} else {
-			p->acknowledged = 1;
-			ast_frfree(f);
-			f = &answer_frame;
-        }
-	}
-	if (f && (f->frametype == AST_FRAME_DTMF) && (f->subclass == '#')) {
-		if (!p->acknowledged) {
-			if (option_verbose > 2)
-				ast_verbose(VERBOSE_PREFIX_3 "%s acknowledged\n", p->chan->name);
-			p->acknowledged = 1;
-			ast_frfree(f);
-			f = &answer_frame;
-		}
-	}
-	if (f && (f->frametype == AST_FRAME_DTMF) && (f->subclass == '*')) {
-		/* * terminates call */
-		ast_frfree(f);
-		f = NULL;
-	}
-	if (f && (f->frametype == AST_FRAME_VOICE) && !p->acknowledged) {
-		/* Don't pass along agent audio until call is acknowledged */
-		ast_frfree(f);
-		f = &null_frame;
-	}
+ 	} else {
+ 		/* if acknowledgement is not required, and the channel is up, we may have missed
+ 		   an AST_CONTROL_ANSWER (if there was one), so mark the call acknowledged anyway */
+ 		if (!p->ackcall && !p->acknowledged && p->chan->_state == AST_STATE_UP)
+  			p->acknowledged = 1;
+ 		switch (f->frametype) {
+ 		case AST_FRAME_CONTROL:
+ 			if (f->subclass == AST_CONTROL_ANSWER) {
+ 				if (p->ackcall) {
+ 					if (option_verbose > 2)
+ 						ast_verbose(VERBOSE_PREFIX_3 "%s answered, waiting for '#' to acknowledge\n", p->chan->name);
+ 					/* Don't pass answer along */
+ 					ast_frfree(f);
+ 					f = &null_frame;
+ 				} else {
+ 					p->acknowledged = 1;
+ 				}
+ 			}
+ 			break;
+ 		case AST_FRAME_DTMF:
+ 			if (!p->acknowledged && (f->subclass == '#')) {
+ 				if (option_verbose > 2)
+ 					ast_verbose(VERBOSE_PREFIX_3 "%s acknowledged\n", p->chan->name);
+ 				p->acknowledged = 1;
+ 				ast_frfree(f);
+ 				f = &answer_frame;
+ 			} else if (f->subclass == '*') {
+ 				/* terminates call */
+ 				ast_frfree(f);
+ 				f = NULL;
+ 			}
+ 			break;
+ 		case AST_FRAME_VOICE:
+ 			/* don't pass voice until the call is acknowledged */
+ 			if (!p->acknowledged) {
+ 				ast_frfree(f);
+ 				f = &null_frame;
+ 			}
+ 			break;
+  		}
+  	}
+
 	CLEANUP(ast,p);
 	if (p->chan && !p->chan->_bridge) {
 		if (strcasecmp(p->chan->type, "Local")) {




More information about the svn-commits mailing list