@ -1486,6 +1486,7 @@ struct ast_frame *ast_dsp_process(struct ast_channel *chan, struct ast_dsp *dsp,
memset ( & dsp - > f , 0 , sizeof ( dsp - > f ) ) ;
dsp - > f . frametype = AST_FRAME_NULL ;
ast_frfree ( af ) ;
ast_set_flag ( & dsp - > f , AST_FRFLAG_FROM_DSP ) ;
return & dsp - > f ;
}
if ( ( dsp - > features & DSP_FEATURE_BUSY_DETECT ) & & ast_dsp_busydetect ( dsp ) ) {
@ -1494,7 +1495,7 @@ struct ast_frame *ast_dsp_process(struct ast_channel *chan, struct ast_dsp *dsp,
dsp - > f . frametype = AST_FRAME_CONTROL ;
dsp - > f . subclass = AST_CONTROL_BUSY ;
ast_frfree ( af ) ;
ast_ log( LOG_DEBUG , " Requesting Hangup because the busy tone was detected on channel %s \n " , chan - > name ) ;
ast_ set_flag( & dsp - > f , AST_FRFLAG_FROM_DSP ) ;
return & dsp - > f ;
}
if ( ( dsp - > features & DSP_FEATURE_DTMF_DETECT ) ) {
@ -1516,6 +1517,7 @@ struct ast_frame *ast_dsp_process(struct ast_channel *chan, struct ast_dsp *dsp,
if ( chan )
ast_queue_frame ( chan , af ) ;
ast_frfree ( af ) ;
ast_set_flag ( & dsp - > f , AST_FRFLAG_FROM_DSP ) ;
return & dsp - > f ;
}
} else {
@ -1542,6 +1544,7 @@ struct ast_frame *ast_dsp_process(struct ast_channel *chan, struct ast_dsp *dsp,
ast_queue_frame ( chan , af ) ;
ast_frfree ( af ) ;
}
ast_set_flag ( & dsp - > f , AST_FRFLAG_FROM_DSP ) ;
return & dsp - > f ;
} else {
memset ( & dsp - > f , 0 , sizeof ( dsp - > f ) ) ;
@ -1559,6 +1562,7 @@ struct ast_frame *ast_dsp_process(struct ast_channel *chan, struct ast_dsp *dsp,
if ( chan )
ast_queue_frame ( chan , af ) ;
ast_frfree ( af ) ;
ast_set_flag ( & dsp - > f , AST_FRFLAG_FROM_DSP ) ;
return & dsp - > f ;
}
}
@ -1575,6 +1579,7 @@ struct ast_frame *ast_dsp_process(struct ast_channel *chan, struct ast_dsp *dsp,
if ( chan )
ast_queue_frame ( chan , af ) ;
ast_frfree ( af ) ;
ast_set_flag ( & dsp - > f , AST_FRFLAG_FROM_DSP ) ;
return & dsp - > f ;
}
} else {
@ -1588,6 +1593,7 @@ struct ast_frame *ast_dsp_process(struct ast_channel *chan, struct ast_dsp *dsp,
if ( chan )
ast_queue_frame ( chan , af ) ;
ast_frfree ( af ) ;
ast_set_flag ( & dsp - > f , AST_FRFLAG_FROM_DSP ) ;
return & dsp - > f ;
}
}
@ -1658,6 +1664,17 @@ void ast_dsp_set_features(struct ast_dsp *dsp, int features)
void ast_dsp_free ( struct ast_dsp * dsp )
{
if ( ast_test_flag ( & dsp - > f , AST_FRFLAG_FROM_DSP ) ) {
/* If this flag is still set, that means that the dsp's destruction
* been torn down , while we still have a frame out there being used .
* When ast_frfree ( ) gets called on that frame , this ast_trans_pvt
* will get destroyed , too . */
/* Set the magic hint that this has been requested to be destroyed. */
dsp - > freqcount = - 1 ;
return ;
}
free ( dsp ) ;
}
@ -1786,3 +1803,17 @@ int ast_dsp_get_tcount(struct ast_dsp *dsp)
{
return dsp - > tcount ;
}
void ast_dsp_frame_freed ( struct ast_frame * fr )
{
struct ast_dsp * dsp ;
ast_clear_flag ( fr , AST_FRFLAG_FROM_DSP ) ;
dsp = ( struct ast_dsp * ) ( ( ( char * ) fr ) - offsetof ( struct ast_dsp , f ) ) ;
if ( dsp - > freqcount ! = - 1 )
return ;
ast_dsp_free ( dsp ) ;
}