diff options
author | Jonathan Rose <jrose@digium.com> | 2014-07-18 16:28:10 +0000 |
---|---|---|
committer | Jonathan Rose <jrose@digium.com> | 2014-07-18 16:28:10 +0000 |
commit | af4cd651431b5a2a0dadebf4331be4fe61389e1b (patch) | |
tree | 989983f58c5a8ebca0b7588c9592a87f26db23db /main/audiohook.c | |
parent | 5c988cc4e6c5693f03080f88e3057cb7a5358597 (diff) |
Channels: Masquerades to automatically move frame/audio hooks
Whenever possible, audiohooks and framehooks will now be copied over
to the channel that the masquerading channel gets cloned into. This
should occur for all audiohooks and most framehooks. As a result,
in Asterisk 12.5 and up, the AUDIOHOOK_INHERIT function is now
deprecated and its behavior is essentially the new default for all
audiohooks, plus some additional audiohooks/framehooks.
Review: https://reviewboard.asterisk.org/r/3721/
........
Merged revisions 418914 from http://svn.asterisk.org/svn/asterisk/branches/12
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@418936 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'main/audiohook.c')
-rw-r--r-- | main/audiohook.c | 49 |
1 files changed, 43 insertions, 6 deletions
diff --git a/main/audiohook.c b/main/audiohook.c index 4dc7c136b..549ad31eb 100644 --- a/main/audiohook.c +++ b/main/audiohook.c @@ -586,15 +586,10 @@ static struct ast_audiohook *find_audiohook_by_source(struct ast_audiohook_list return NULL; } -void ast_audiohook_move_by_source(struct ast_channel *old_chan, struct ast_channel *new_chan, const char *source) +static void audiohook_move(struct ast_channel *old_chan, struct ast_channel *new_chan, struct ast_audiohook *audiohook) { - struct ast_audiohook *audiohook; enum ast_audiohook_status oldstatus; - if (!ast_channel_audiohooks(old_chan) || !(audiohook = find_audiohook_by_source(ast_channel_audiohooks(old_chan), source))) { - return; - } - /* By locking both channels and the audiohook, we can assure that * another thread will not have a chance to read the audiohook's status * as done, even though ast_audiohook_remove signals the trigger @@ -610,6 +605,48 @@ void ast_audiohook_move_by_source(struct ast_channel *old_chan, struct ast_chann ast_audiohook_unlock(audiohook); } +void ast_audiohook_move_by_source(struct ast_channel *old_chan, struct ast_channel *new_chan, const char *source) +{ + struct ast_audiohook *audiohook; + + if (!ast_channel_audiohooks(old_chan)) { + return; + } + + audiohook = find_audiohook_by_source(ast_channel_audiohooks(old_chan), source); + if (!audiohook) { + return; + } + + audiohook_move(old_chan, new_chan, audiohook); +} + +void ast_audiohook_move_all(struct ast_channel *old_chan, struct ast_channel *new_chan) +{ + struct ast_audiohook *audiohook; + struct ast_audiohook_list *audiohook_list; + + audiohook_list = ast_channel_audiohooks(old_chan); + if (!audiohook_list) { + return; + } + + AST_LIST_TRAVERSE_SAFE_BEGIN(&audiohook_list->spy_list, audiohook, list) { + audiohook_move(old_chan, new_chan, audiohook); + } + AST_LIST_TRAVERSE_SAFE_END; + + AST_LIST_TRAVERSE_SAFE_BEGIN(&audiohook_list->whisper_list, audiohook, list) { + audiohook_move(old_chan, new_chan, audiohook); + } + AST_LIST_TRAVERSE_SAFE_END; + + AST_LIST_TRAVERSE_SAFE_BEGIN(&audiohook_list->manipulate_list, audiohook, list) { + audiohook_move(old_chan, new_chan, audiohook); + } + AST_LIST_TRAVERSE_SAFE_END; +} + /*! \brief Detach specified source audiohook from channel * \param chan Channel to detach from * \param source Name of source to detach |