diff options
Diffstat (limited to 'main')
-rw-r--r-- | main/audiohook.c | 12 | ||||
-rw-r--r-- | main/channel.c | 10 |
2 files changed, 21 insertions, 1 deletions
diff --git a/main/audiohook.c b/main/audiohook.c index 905141850..1e0841dd5 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 62b774a66..f060fdb59 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; } |