mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-06 12:36:58 +00:00
Merge anthm's monitor patch with minor mods (bug #2383)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@3797 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
@@ -90,6 +90,9 @@ static char *descrip2 = "Park(exten):"
|
|||||||
"into the dialplan, although you should include the 'parkedcalls'\n"
|
"into the dialplan, although you should include the 'parkedcalls'\n"
|
||||||
"context.\n";
|
"context.\n";
|
||||||
|
|
||||||
|
static struct ast_app *monitor_app=NULL;
|
||||||
|
static int monitor_ok=1;
|
||||||
|
|
||||||
struct parkeduser {
|
struct parkeduser {
|
||||||
struct ast_channel *chan;
|
struct ast_channel *chan;
|
||||||
struct timeval start;
|
struct timeval start;
|
||||||
@@ -297,7 +300,18 @@ int ast_bridge_call(struct ast_channel *chan,struct ast_channel *peer,struct ast
|
|||||||
struct timeval start, end;
|
struct timeval start, end;
|
||||||
char *transferer_real_context;
|
char *transferer_real_context;
|
||||||
int allowdisconnect_in,allowdisconnect_out,allowredirect_in,allowredirect_out;
|
int allowdisconnect_in,allowdisconnect_out,allowredirect_in,allowredirect_out;
|
||||||
|
char *monitor_exec;
|
||||||
|
|
||||||
|
if(monitor_ok) {
|
||||||
|
if(!monitor_app)
|
||||||
|
if(!(monitor_app = pbx_findapp("Monitor")))
|
||||||
|
monitor_ok=0;
|
||||||
|
if((monitor_exec = pbx_builtin_getvar_helper(chan,"AUTO_MONITOR")))
|
||||||
|
pbx_exec(chan, monitor_app, monitor_exec, 1);
|
||||||
|
else if((monitor_exec = pbx_builtin_getvar_helper(peer,"AUTO_MONITOR")))
|
||||||
|
pbx_exec(peer, monitor_app, monitor_exec, 1);
|
||||||
|
}
|
||||||
|
|
||||||
allowdisconnect_in = config->allowdisconnect_in;
|
allowdisconnect_in = config->allowdisconnect_in;
|
||||||
allowdisconnect_out = config->allowdisconnect_out;
|
allowdisconnect_out = config->allowdisconnect_out;
|
||||||
allowredirect_in = config->allowredirect_in;
|
allowredirect_in = config->allowredirect_in;
|
||||||
|
@@ -42,9 +42,14 @@ static char *monitor_descrip = "Monitor([file_format|[fname_base]|[options]]):\n
|
|||||||
" soxmix and the raw leg files will NOT be deleted automatically.\n"
|
" soxmix and the raw leg files will NOT be deleted automatically.\n"
|
||||||
" soxmix or MONITOR_EXEC is handed 3 arguments, the two leg files\n"
|
" soxmix or MONITOR_EXEC is handed 3 arguments, the two leg files\n"
|
||||||
" and a target mixed file name which is the same as the leg file names\n"
|
" and a target mixed file name which is the same as the leg file names\n"
|
||||||
" only without the in/out designator.\n\n"
|
" only without the in/out designator.\n"
|
||||||
|
" If MONITOR_EXEC_ARGS is set, the contents will be passed on as\n"
|
||||||
|
" additional arguements to MONITOR_EXEC\n"
|
||||||
" Both MONITOR_EXEC and the Mix flag can be set from the\n"
|
" Both MONITOR_EXEC and the Mix flag can be set from the\n"
|
||||||
" administrator interface\n";
|
" administrator interface\n\n"
|
||||||
|
"\n"
|
||||||
|
" 'b' - Don't begin recording unless a call is bridged to another channel\n"
|
||||||
|
;
|
||||||
|
|
||||||
static char *stopmonitor_synopsis = "Stop monitoring a channel";
|
static char *stopmonitor_synopsis = "Stop monitoring a channel";
|
||||||
|
|
||||||
@@ -172,8 +177,8 @@ int ast_monitor_start( struct ast_channel *chan, const char *format_spec,
|
|||||||
/* Stop monitoring a channel */
|
/* Stop monitoring a channel */
|
||||||
int ast_monitor_stop( struct ast_channel *chan, int need_lock )
|
int ast_monitor_stop( struct ast_channel *chan, int need_lock )
|
||||||
{
|
{
|
||||||
char *execute;
|
char *execute,*execute_args;
|
||||||
int soxmix =0;
|
int delfiles =0;
|
||||||
|
|
||||||
if (need_lock) {
|
if (need_lock) {
|
||||||
if (ast_mutex_lock(&chan->lock)) {
|
if (ast_mutex_lock(&chan->lock)) {
|
||||||
@@ -226,10 +231,15 @@ int ast_monitor_stop( struct ast_channel *chan, int need_lock )
|
|||||||
execute=pbx_builtin_getvar_helper(chan,"MONITOR_EXEC");
|
execute=pbx_builtin_getvar_helper(chan,"MONITOR_EXEC");
|
||||||
if (!execute || ast_strlen_zero(execute)) {
|
if (!execute || ast_strlen_zero(execute)) {
|
||||||
execute = "nice -n 19 soxmix";
|
execute = "nice -n 19 soxmix";
|
||||||
soxmix = 1;
|
delfiles = 1;
|
||||||
}
|
}
|
||||||
snprintf(tmp, sizeof(tmp), "%s %s/%s-in.%s %s/%s-out.%s %s/%s.%s &", execute, dir, name, format, dir, name, format, dir, name, format);
|
execute_args = pbx_builtin_getvar_helper(chan,"MONITOR_EXEC_ARGS");
|
||||||
if (soxmix) {
|
if (!execute_args || ast_strlen_zero(execute_args)) {
|
||||||
|
execute_args = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
snprintf(tmp, sizeof(tmp), "%s %s/%s-in.%s %s/%s-out.%s %s/%s.%s %s &", execute, dir, name, format, dir, name, format, dir, name, format,execute_args);
|
||||||
|
if (delfiles) {
|
||||||
snprintf(tmp2,sizeof(tmp2), "( %s& rm -f %s/%s-* ) &",tmp, dir ,name); /* remove legs when done mixing */
|
snprintf(tmp2,sizeof(tmp2), "( %s& rm -f %s/%s-* ) &",tmp, dir ,name); /* remove legs when done mixing */
|
||||||
strncpy(tmp, tmp2, sizeof(tmp) - 1);
|
strncpy(tmp, tmp2, sizeof(tmp) - 1);
|
||||||
}
|
}
|
||||||
@@ -291,12 +301,14 @@ static int start_monitor_exec(struct ast_channel *chan, void *data)
|
|||||||
char *format = NULL;
|
char *format = NULL;
|
||||||
char *fname_base = NULL;
|
char *fname_base = NULL;
|
||||||
char *options = NULL;
|
char *options = NULL;
|
||||||
|
char *delay = NULL;
|
||||||
int joinfiles = 0;
|
int joinfiles = 0;
|
||||||
int res;
|
int waitforbridge = 0;
|
||||||
|
int res = 0;
|
||||||
|
|
||||||
/* Parse arguments. */
|
/* Parse arguments. */
|
||||||
if (data && strlen((char*)data)) {
|
if (data && strlen((char*)data)) {
|
||||||
arg = strdup((char*)data);
|
arg = ast_strdupa((char*)data);
|
||||||
format = arg;
|
format = arg;
|
||||||
fname_base = strchr(arg, '|');
|
fname_base = strchr(arg, '|');
|
||||||
if (fname_base) {
|
if (fname_base) {
|
||||||
@@ -307,9 +319,29 @@ static int start_monitor_exec(struct ast_channel *chan, void *data)
|
|||||||
options++;
|
options++;
|
||||||
if (strchr(options, 'm'))
|
if (strchr(options, 'm'))
|
||||||
joinfiles = 1;
|
joinfiles = 1;
|
||||||
|
if (strchr(options, 'b'))
|
||||||
|
waitforbridge = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(waitforbridge) {
|
||||||
|
/* We must remove the "b" option if listed. In principle none of
|
||||||
|
the following could give NULL results, but we check just to
|
||||||
|
be pedantic. Reconstructing with checks for 'm' option does not
|
||||||
|
work if we end up adding more options than 'm' in the future. */
|
||||||
|
delay = ast_strdupa((char*)data);
|
||||||
|
if (delay) {
|
||||||
|
options = strrchr(delay, '|');
|
||||||
|
if (options) {
|
||||||
|
arg = strchr(options, 'b');
|
||||||
|
if (arg) {
|
||||||
|
*arg = 'X';
|
||||||
|
pbx_builtin_setvar_helper(chan,"AUTO_MONITOR",delay);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
res = ast_monitor_start(chan, format, fname_base, 1);
|
res = ast_monitor_start(chan, format, fname_base, 1);
|
||||||
@@ -317,9 +349,6 @@ static int start_monitor_exec(struct ast_channel *chan, void *data)
|
|||||||
res = ast_monitor_change_fname( chan, fname_base, 1 );
|
res = ast_monitor_change_fname( chan, fname_base, 1 );
|
||||||
ast_monitor_setjoinfiles(chan, joinfiles);
|
ast_monitor_setjoinfiles(chan, joinfiles);
|
||||||
|
|
||||||
if (arg)
|
|
||||||
free( arg );
|
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user