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")) {

_______________________________________________
Asterisk-Cvs mailing list
[email protected]
http://lists.digium.com/mailman/listinfo/asterisk-cvs

Reply via email to