diff options
author | Olle Johansson <oej@edvina.net> | 2008-05-12 18:39:09 +0000 |
---|---|---|
committer | Olle Johansson <oej@edvina.net> | 2008-05-12 18:39:09 +0000 |
commit | e30c26c689bcfbb836c23cf4d70c6f806afc00cf (patch) | |
tree | b3130ae0ee2829d90e8ac3e0129bbb44326ef093 /main/features.c | |
parent | 2e054642d5b6ea5f265c261f9d51155ed6cbc749 (diff) |
Add support for playing an audio file for caller and callee at start and stop of monitoring (one-touch monitor).
Keep messages short, since the other party is waiting while one party hear the message...
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@115784 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'main/features.c')
-rw-r--r-- | main/features.c | 51 |
1 files changed, 43 insertions, 8 deletions
diff --git a/main/features.c b/main/features.c index 528d32b19..106a850b5 100644 --- a/main/features.c +++ b/main/features.c @@ -751,6 +751,34 @@ static int builtin_parkcall(struct ast_channel *chan, struct ast_channel *peer, } +/*! \brief Play message to both caller and callee in bridged call, plays synchronously, autoservicing the + other channel during the message, so please don't use this for very long messages + */ +static int play_message_in_bridged_call(struct ast_channel *caller_chan, struct ast_channel *callee_chan, const char *audiofile) +{ + /* First play for caller, put other channel on auto service */ + if (ast_autoservice_start(callee_chan)) + return -1; + if (ast_stream_and_wait(caller_chan, audiofile, "")) { + ast_log(LOG_WARNING, "Failed to play automon message!\n"); + ast_autoservice_stop(callee_chan); + return -1; + } + if (ast_autoservice_stop(callee_chan)) + return -1; + /* Then play for callee, put other channel on auto service */ + if (ast_autoservice_start(caller_chan)) + return -1; + if (ast_stream_and_wait(callee_chan, audiofile, "")) { + ast_log(LOG_WARNING, "Failed to play automon message !\n"); + ast_autoservice_stop(caller_chan); + return -1; + } + if (ast_autoservice_stop(caller_chan)) + return -1; + return(0); +} + /*! * \brief Monitor a channel by DTMF * \param chan channel requesting monitor @@ -771,6 +799,8 @@ static int builtin_automonitor(struct ast_channel *chan, struct ast_channel *pee int x = 0; size_t len; struct ast_channel *caller_chan, *callee_chan; + const char *automon_message_start = NULL; + const char *automon_message_stop = NULL; if (!monitor_ok) { ast_log(LOG_ERROR,"Cannot record the call. The monitor application is disabled.\n"); @@ -784,21 +814,22 @@ static int builtin_automonitor(struct ast_channel *chan, struct ast_channel *pee } set_peers(&caller_chan, &callee_chan, peer, chan, sense); + if (caller_chan) { /* Find extra messages */ + automon_message_start = pbx_builtin_getvar_helper(caller_chan, "TOUCH_MONITOR_MESSAGE_START"); + automon_message_stop = pbx_builtin_getvar_helper(caller_chan, "TOUCH_MONITOR_MESSAGE_STOP"); + } - if (!ast_strlen_zero(courtesytone)) { - if (ast_autoservice_start(callee_chan)) - return -1; - if (ast_stream_and_wait(caller_chan, courtesytone, "")) { - ast_log(LOG_WARNING, "Failed to play courtesy tone!\n"); - ast_autoservice_stop(callee_chan); + if (!ast_strlen_zero(courtesytone)) { /* Play courtesy tone if configured */ + if(play_message_in_bridged_call(caller_chan, callee_chan, courtesytone) == -1) { return -1; } - if (ast_autoservice_stop(callee_chan)) - return -1; } if (callee_chan->monitor) { ast_verb(4, "User hit '%s' to stop recording call.\n", code); + if (!ast_strlen_zero(automon_message_stop)) { + play_message_in_bridged_call(caller_chan, callee_chan, automon_message_stop); + } callee_chan->monitor->stop(callee_chan, 1); return AST_FEATURE_RETURN_SUCCESS; } @@ -843,6 +874,10 @@ static int builtin_automonitor(struct ast_channel *chan, struct ast_channel *pee pbx_exec(callee_chan, monitor_app, args); pbx_builtin_setvar_helper(callee_chan, "TOUCH_MONITOR_OUTPUT", touch_filename); pbx_builtin_setvar_helper(caller_chan, "TOUCH_MONITOR_OUTPUT", touch_filename); + + if (!ast_strlen_zero(automon_message_start)) { /* Play start message for both channels */ + play_message_in_bridged_call(caller_chan, callee_chan, automon_message_start); + } return AST_FEATURE_RETURN_SUCCESS; } |