aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordvossel <dvossel@f38db490-d61c-443f-a65b-d21fe96a405b>2010-07-27 20:33:40 +0000
committerdvossel <dvossel@f38db490-d61c-443f-a65b-d21fe96a405b>2010-07-27 20:33:40 +0000
commitcdcc8cbbb5336886b347b12a9969c6bc733e08fd (patch)
tree340c691b4ae2ee8e1c034c9b9fb9f4ecd2dab7d7
parentdf9cd44e2ab99a1fd54e0d755a748094060e8077 (diff)
remove empty audiohook write list on channel
If a channel has an audiohook write list created on it, that list stays on the channel until the channel is destroyed. There is no reason to keep that list on the channel if it becomes empty. If it is empty that just means we are doing needless translating for every ast_read and ast_write. This patch removes the audiohook list from the channel once it is detected to be empty on either a read or write. If a audiohook is added back to the channel after this list is destroyed, the list just gets recreated as if it never existed to begin with. (closes issue #17630) Reported by: manvirr Review: https://reviewboard.asterisk.org/r/799/ git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.4@279945 f38db490-d61c-443f-a65b-d21fe96a405b
-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;
}