aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/asterisk/audiohook.h7
-rw-r--r--main/audiohook.c12
-rw-r--r--main/channel.c10
3 files changed, 28 insertions, 1 deletions
diff --git a/include/asterisk/audiohook.h b/include/asterisk/audiohook.h
index 7163b9446..4bf041f03 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 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;
}