[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