diff --git a/include/asterisk/audiohook.h b/include/asterisk/audiohook.h index 7163b94461..4bf041f037 100644 --- a/include/asterisk/audiohook.h +++ b/include/asterisk/audiohook.h @@ -191,6 +191,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 905141850c..1e0841dd51 100644 --- a/main/audiohook.c +++ b/main/audiohook.c @@ -725,6 +725,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 @@ -742,7 +753,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 62b774a666..f060fdb597 100644 --- a/main/channel.c +++ b/main/channel.c @@ -2612,6 +2612,11 @@ static struct ast_frame *__ast_read(struct ast_channel *chan, int dropaudio) chan->fin = FRAMECOUNT_INC(chan->fin); 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 f; } @@ -3285,6 +3290,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; }