@ -401,10 +401,14 @@ static struct ast_frame *agent_read(struct ast_channel *ast)
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 ) ;
} 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 ) ;
@ -413,29 +417,32 @@ static struct ast_frame *agent_read(struct ast_channel *ast)
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 ) {
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 ;
}
}
if ( f & & ( f - > frametype = = AST_FRAME_DTMF ) & & ( f - > subclass = = ' * ' ) ) {
/* * terminates call */
} else if ( 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 */
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 " ) ) {