aboutsummaryrefslogtreecommitdiffstats
path: root/main
diff options
context:
space:
mode:
Diffstat (limited to 'main')
-rw-r--r--main/audiohook.c12
-rw-r--r--main/channel.c10
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;
}