mirror of
https://github.com/asterisk/asterisk.git
synced 2025-10-11 23:28:59 +00:00
audiohook signal trigger on every status change
(issue #14618) Review: https://reviewboard.asterisk.org/r/434/ git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@230583 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
@@ -202,6 +202,12 @@ int ast_audiohook_remove(struct ast_channel *chan, struct ast_audiohook *audioho
|
|||||||
*/
|
*/
|
||||||
struct ast_frame *ast_audiohook_write_list(struct ast_channel *chan, struct ast_audiohook_list *audiohook_list, enum ast_audiohook_direction direction, struct ast_frame *frame);
|
struct ast_frame *ast_audiohook_write_list(struct ast_channel *chan, struct ast_audiohook_list *audiohook_list, enum ast_audiohook_direction direction, struct ast_frame *frame);
|
||||||
|
|
||||||
|
/*! \brief Update audiohook's status
|
||||||
|
* \param audiohook Audiohook structure
|
||||||
|
* \param audiohook status enum
|
||||||
|
*/
|
||||||
|
void ast_audiohook_update_status(struct ast_audiohook *audiohook, enum ast_audiohook_status status);
|
||||||
|
|
||||||
/*! \brief Wait for audiohook trigger to be triggered
|
/*! \brief Wait for audiohook trigger to be triggered
|
||||||
* \param audiohook Audiohook to wait on
|
* \param audiohook Audiohook to wait on
|
||||||
*/
|
*/
|
||||||
|
@@ -79,7 +79,7 @@ int ast_audiohook_init(struct ast_audiohook *audiohook, enum ast_audiohook_type
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Since we are just starting out... this audiohook is new */
|
/* Since we are just starting out... this audiohook is new */
|
||||||
audiohook->status = AST_AUDIOHOOK_STATUS_NEW;
|
ast_audiohook_update_status(audiohook, AST_AUDIOHOOK_STATUS_NEW);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -351,13 +351,27 @@ int ast_audiohook_attach(struct ast_channel *chan, struct ast_audiohook *audioho
|
|||||||
AST_LIST_INSERT_TAIL(&chan->audiohooks->manipulate_list, audiohook, list);
|
AST_LIST_INSERT_TAIL(&chan->audiohooks->manipulate_list, audiohook, list);
|
||||||
|
|
||||||
/* Change status over to running since it is now attached */
|
/* Change status over to running since it is now attached */
|
||||||
audiohook->status = AST_AUDIOHOOK_STATUS_RUNNING;
|
ast_audiohook_update_status(audiohook, AST_AUDIOHOOK_STATUS_RUNNING);
|
||||||
|
|
||||||
ast_channel_unlock(chan);
|
ast_channel_unlock(chan);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*! \brief Update audiohook's status
|
||||||
|
* \param audiohook status enum
|
||||||
|
* \param audiohook Audiohook structure
|
||||||
|
*/
|
||||||
|
void ast_audiohook_update_status(struct ast_audiohook *audiohook, enum ast_audiohook_status status)
|
||||||
|
{
|
||||||
|
ast_audiohook_lock(audiohook);
|
||||||
|
if (audiohook->status != AST_AUDIOHOOK_STATUS_DONE) {
|
||||||
|
audiohook->status = status;
|
||||||
|
ast_cond_signal(&audiohook->trigger);
|
||||||
|
}
|
||||||
|
ast_audiohook_unlock(audiohook);
|
||||||
|
}
|
||||||
|
|
||||||
/*! \brief Detach audiohook from channel
|
/*! \brief Detach audiohook from channel
|
||||||
* \param audiohook Audiohook structure
|
* \param audiohook Audiohook structure
|
||||||
* \return Returns 0 on success, -1 on failure
|
* \return Returns 0 on success, -1 on failure
|
||||||
@@ -367,7 +381,7 @@ int ast_audiohook_detach(struct ast_audiohook *audiohook)
|
|||||||
if (audiohook->status == AST_AUDIOHOOK_STATUS_NEW || audiohook->status == AST_AUDIOHOOK_STATUS_DONE)
|
if (audiohook->status == AST_AUDIOHOOK_STATUS_NEW || audiohook->status == AST_AUDIOHOOK_STATUS_DONE)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
audiohook->status = AST_AUDIOHOOK_STATUS_SHUTDOWN;
|
ast_audiohook_update_status(audiohook, AST_AUDIOHOOK_STATUS_SHUTDOWN);
|
||||||
|
|
||||||
while (audiohook->status != AST_AUDIOHOOK_STATUS_DONE)
|
while (audiohook->status != AST_AUDIOHOOK_STATUS_DONE)
|
||||||
ast_audiohook_trigger_wait(audiohook);
|
ast_audiohook_trigger_wait(audiohook);
|
||||||
@@ -386,25 +400,17 @@ int ast_audiohook_detach_list(struct ast_audiohook_list *audiohook_list)
|
|||||||
|
|
||||||
/* Drop any spies */
|
/* Drop any spies */
|
||||||
while ((audiohook = AST_LIST_REMOVE_HEAD(&audiohook_list->spy_list, list))) {
|
while ((audiohook = AST_LIST_REMOVE_HEAD(&audiohook_list->spy_list, list))) {
|
||||||
ast_audiohook_lock(audiohook);
|
ast_audiohook_update_status(audiohook, AST_AUDIOHOOK_STATUS_DONE);
|
||||||
audiohook->status = AST_AUDIOHOOK_STATUS_DONE;
|
|
||||||
ast_cond_signal(&audiohook->trigger);
|
|
||||||
ast_audiohook_unlock(audiohook);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Drop any whispering sources */
|
/* Drop any whispering sources */
|
||||||
while ((audiohook = AST_LIST_REMOVE_HEAD(&audiohook_list->whisper_list, list))) {
|
while ((audiohook = AST_LIST_REMOVE_HEAD(&audiohook_list->whisper_list, list))) {
|
||||||
ast_audiohook_lock(audiohook);
|
ast_audiohook_update_status(audiohook, AST_AUDIOHOOK_STATUS_DONE);
|
||||||
audiohook->status = AST_AUDIOHOOK_STATUS_DONE;
|
|
||||||
ast_cond_signal(&audiohook->trigger);
|
|
||||||
ast_audiohook_unlock(audiohook);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Drop any manipulaters */
|
/* Drop any manipulaters */
|
||||||
while ((audiohook = AST_LIST_REMOVE_HEAD(&audiohook_list->manipulate_list, list))) {
|
while ((audiohook = AST_LIST_REMOVE_HEAD(&audiohook_list->manipulate_list, list))) {
|
||||||
ast_audiohook_lock(audiohook);
|
ast_audiohook_update_status(audiohook, AST_AUDIOHOOK_STATUS_DONE);
|
||||||
audiohook->status = AST_AUDIOHOOK_STATUS_DONE;
|
|
||||||
ast_audiohook_unlock(audiohook);
|
|
||||||
audiohook->manipulate_callback(audiohook, NULL, NULL, 0);
|
audiohook->manipulate_callback(audiohook, NULL, NULL, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -490,7 +496,7 @@ int ast_audiohook_detach_source(struct ast_channel *chan, const char *source)
|
|||||||
ast_channel_unlock(chan);
|
ast_channel_unlock(chan);
|
||||||
|
|
||||||
if (audiohook && audiohook->status != AST_AUDIOHOOK_STATUS_DONE)
|
if (audiohook && audiohook->status != AST_AUDIOHOOK_STATUS_DONE)
|
||||||
audiohook->status = AST_AUDIOHOOK_STATUS_SHUTDOWN;
|
ast_audiohook_update_status(audiohook, AST_AUDIOHOOK_STATUS_SHUTDOWN);
|
||||||
|
|
||||||
return (audiohook ? 0 : -1);
|
return (audiohook ? 0 : -1);
|
||||||
}
|
}
|
||||||
@@ -521,10 +527,7 @@ int ast_audiohook_remove(struct ast_channel *chan, struct ast_audiohook *audioho
|
|||||||
else if (audiohook->type == AST_AUDIOHOOK_TYPE_MANIPULATE)
|
else if (audiohook->type == AST_AUDIOHOOK_TYPE_MANIPULATE)
|
||||||
AST_LIST_REMOVE(&chan->audiohooks->manipulate_list, audiohook, list);
|
AST_LIST_REMOVE(&chan->audiohooks->manipulate_list, audiohook, list);
|
||||||
|
|
||||||
ast_audiohook_lock(audiohook);
|
ast_audiohook_update_status(audiohook, AST_AUDIOHOOK_STATUS_DONE);
|
||||||
audiohook->status = AST_AUDIOHOOK_STATUS_DONE;
|
|
||||||
ast_cond_signal(&audiohook->trigger);
|
|
||||||
ast_audiohook_unlock(audiohook);
|
|
||||||
|
|
||||||
ast_channel_unlock(chan);
|
ast_channel_unlock(chan);
|
||||||
|
|
||||||
@@ -546,7 +549,7 @@ static struct ast_frame *dtmf_audiohook_write_list(struct ast_channel *chan, str
|
|||||||
ast_audiohook_lock(audiohook);
|
ast_audiohook_lock(audiohook);
|
||||||
if (audiohook->status != AST_AUDIOHOOK_STATUS_RUNNING) {
|
if (audiohook->status != AST_AUDIOHOOK_STATUS_RUNNING) {
|
||||||
AST_LIST_REMOVE_CURRENT(list);
|
AST_LIST_REMOVE_CURRENT(list);
|
||||||
audiohook->status = AST_AUDIOHOOK_STATUS_DONE;
|
ast_audiohook_update_status(audiohook, AST_AUDIOHOOK_STATUS_DONE);
|
||||||
ast_audiohook_unlock(audiohook);
|
ast_audiohook_unlock(audiohook);
|
||||||
audiohook->manipulate_callback(audiohook, NULL, NULL, 0);
|
audiohook->manipulate_callback(audiohook, NULL, NULL, 0);
|
||||||
continue;
|
continue;
|
||||||
@@ -594,8 +597,7 @@ static struct ast_frame *audio_audiohook_write_list(struct ast_channel *chan, st
|
|||||||
ast_audiohook_lock(audiohook);
|
ast_audiohook_lock(audiohook);
|
||||||
if (audiohook->status != AST_AUDIOHOOK_STATUS_RUNNING) {
|
if (audiohook->status != AST_AUDIOHOOK_STATUS_RUNNING) {
|
||||||
AST_LIST_REMOVE_CURRENT(list);
|
AST_LIST_REMOVE_CURRENT(list);
|
||||||
audiohook->status = AST_AUDIOHOOK_STATUS_DONE;
|
ast_audiohook_update_status(audiohook, AST_AUDIOHOOK_STATUS_DONE);
|
||||||
ast_cond_signal(&audiohook->trigger);
|
|
||||||
ast_audiohook_unlock(audiohook);
|
ast_audiohook_unlock(audiohook);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -613,8 +615,7 @@ static struct ast_frame *audio_audiohook_write_list(struct ast_channel *chan, st
|
|||||||
ast_audiohook_lock(audiohook);
|
ast_audiohook_lock(audiohook);
|
||||||
if (audiohook->status != AST_AUDIOHOOK_STATUS_RUNNING) {
|
if (audiohook->status != AST_AUDIOHOOK_STATUS_RUNNING) {
|
||||||
AST_LIST_REMOVE_CURRENT(list);
|
AST_LIST_REMOVE_CURRENT(list);
|
||||||
audiohook->status = AST_AUDIOHOOK_STATUS_DONE;
|
ast_audiohook_update_status(audiohook, AST_AUDIOHOOK_STATUS_DONE);
|
||||||
ast_cond_signal(&audiohook->trigger);
|
|
||||||
ast_audiohook_unlock(audiohook);
|
ast_audiohook_unlock(audiohook);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -638,7 +639,7 @@ static struct ast_frame *audio_audiohook_write_list(struct ast_channel *chan, st
|
|||||||
ast_audiohook_lock(audiohook);
|
ast_audiohook_lock(audiohook);
|
||||||
if (audiohook->status != AST_AUDIOHOOK_STATUS_RUNNING) {
|
if (audiohook->status != AST_AUDIOHOOK_STATUS_RUNNING) {
|
||||||
AST_LIST_REMOVE_CURRENT(list);
|
AST_LIST_REMOVE_CURRENT(list);
|
||||||
audiohook->status = AST_AUDIOHOOK_STATUS_DONE;
|
ast_audiohook_update_status(audiohook, AST_AUDIOHOOK_STATUS_DONE);
|
||||||
ast_audiohook_unlock(audiohook);
|
ast_audiohook_unlock(audiohook);
|
||||||
/* We basically drop all of our links to the manipulate audiohook and prod it to do it's own destructive things */
|
/* We basically drop all of our links to the manipulate audiohook and prod it to do it's own destructive things */
|
||||||
audiohook->manipulate_callback(audiohook, chan, NULL, direction);
|
audiohook->manipulate_callback(audiohook, chan, NULL, direction);
|
||||||
|
Reference in New Issue
Block a user