diff --git a/include/asterisk/audiohook.h b/include/asterisk/audiohook.h index 6d773bf90..abf6ca345 100644 --- a/include/asterisk/audiohook.h +++ b/include/asterisk/audiohook.h @@ -202,6 +202,13 @@ int ast_audiohook_detach_source(struct ast_channel *chan, const char *source); */ int ast_audiohook_remove(struct ast_channel *chan, struct ast_audiohook *audiohook); +/*! + * \brief determines if a audiohook_list is empty or not. + * + * retval 0 false, 1 true + */ +int ast_audiohook_write_list_empty(struct ast_audiohook_list *audiohook_list); + /*! \brief Pass a frame off to be handled by the audiohook core * \param chan Channel that the list is coming off of * \param audiohook_list List of audiohooks diff --git a/main/audiohook.c b/main/audiohook.c index 031f36e7e..ad977ecbc 100644 --- a/main/audiohook.c +++ b/main/audiohook.c @@ -735,6 +735,17 @@ static struct ast_frame *audio_audiohook_write_list(struct ast_channel *chan, st return end_frame; } +int ast_audiohook_write_list_empty(struct ast_audiohook_list *audiohook_list) +{ + if (AST_LIST_EMPTY(&audiohook_list->spy_list) && + AST_LIST_EMPTY(&audiohook_list->whisper_list) && + AST_LIST_EMPTY(&audiohook_list->manipulate_list)) { + + return 1; + } + return 0; +} + /*! \brief Pass a frame off to be handled by the audiohook core * \param chan Channel that the list is coming off of * \param audiohook_list List of audiohooks @@ -752,7 +763,6 @@ struct ast_frame *ast_audiohook_write_list(struct ast_channel *chan, struct ast_ else return frame; } - /*! \brief Wait for audiohook trigger to be triggered * \param audiohook Audiohook to wait on diff --git a/main/channel.c b/main/channel.c index 00f3f7863..fc7ade985 100644 --- a/main/channel.c +++ b/main/channel.c @@ -4064,6 +4064,11 @@ done: if (chan->music_state && chan->generator && chan->generator->digit && f && f->frametype == AST_FRAME_DTMF_END) chan->generator->digit(chan, f->subclass.integer); + if (chan->audiohooks && ast_audiohook_write_list_empty(chan->audiohooks)) { + /* The list gets recreated if audiohooks are added again later */ + ast_audiohook_detach_list(chan->audiohooks); + chan->audiohooks = NULL; + } ast_channel_unlock(chan); return f; } @@ -4801,6 +4806,11 @@ int ast_write(struct ast_channel *chan, struct ast_frame *fr) chan->fout = FRAMECOUNT_INC(chan->fout); } done: + if (chan->audiohooks && ast_audiohook_write_list_empty(chan->audiohooks)) { + /* The list gets recreated if audiohooks are added again later */ + ast_audiohook_detach_list(chan->audiohooks); + chan->audiohooks = NULL; + } ast_channel_unlock(chan); return res; }