mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-05 04:11:08 +00:00
Merged revisions 7709 via svnmerge from
/branches/1.2 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@7710 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
@@ -86,6 +86,7 @@ LOCAL_USER_DECL;
|
||||
static const char *mixmonitor_spy_type = "MixMonitor";
|
||||
|
||||
struct mixmonitor {
|
||||
AST_LIST_ENTRY(mixmonitor) list;
|
||||
struct ast_channel *chan;
|
||||
char *filename;
|
||||
char *post_process;
|
||||
@@ -94,12 +95,15 @@ struct mixmonitor {
|
||||
int writevol;
|
||||
};
|
||||
|
||||
AST_LIST_HEAD_STATIC(monitors, mixmonitor);
|
||||
|
||||
enum {
|
||||
MUXFLAG_APPEND = (1 << 1),
|
||||
MUXFLAG_BRIDGED = (1 << 2),
|
||||
MUXFLAG_VOLUME = (1 << 3),
|
||||
MUXFLAG_READVOLUME = (1 << 4),
|
||||
MUXFLAG_WRITEVOLUME = (1 << 5),
|
||||
FLAG_STOP = (1 << 6),
|
||||
} mixmonitor_flags;
|
||||
|
||||
enum {
|
||||
@@ -164,6 +168,10 @@ static void *mixmonitor_thread(void *obj)
|
||||
|
||||
STANDARD_INCREMENT_USECOUNT;
|
||||
|
||||
AST_LIST_LOCK(&monitors);
|
||||
AST_LIST_INSERT_HEAD(&monitors, mixmonitor, list);
|
||||
AST_LIST_UNLOCK(&monitors);
|
||||
|
||||
name = ast_strdupa(mixmonitor->chan->name);
|
||||
|
||||
oflags = O_CREAT|O_WRONLY;
|
||||
@@ -218,7 +226,7 @@ static void *mixmonitor_thread(void *obj)
|
||||
|
||||
ast_channel_spy_trigger_wait(&spy);
|
||||
|
||||
if (ast_check_hangup(mixmonitor->chan) || spy.status != CHANSPY_RUNNING) {
|
||||
if (ast_check_hangup(mixmonitor->chan) || spy.status != CHANSPY_RUNNING || ast_test_flag(mixmonitor, FLAG_STOP)) {
|
||||
ast_mutex_unlock(&spy.lock);
|
||||
break;
|
||||
}
|
||||
@@ -244,6 +252,8 @@ static void *mixmonitor_thread(void *obj)
|
||||
ast_mutex_unlock(&spy.lock);
|
||||
}
|
||||
|
||||
stopmon(mixmonitor->chan, &spy);
|
||||
|
||||
if (mixmonitor->post_process) {
|
||||
char *p;
|
||||
|
||||
@@ -255,8 +265,6 @@ static void *mixmonitor_thread(void *obj)
|
||||
pbx_substitute_variables_helper(mixmonitor->chan, mixmonitor->post_process, post_process, sizeof(post_process) - 1);
|
||||
}
|
||||
|
||||
stopmon(mixmonitor->chan, &spy);
|
||||
|
||||
if (option_verbose > 1)
|
||||
ast_verbose(VERBOSE_PREFIX_2 "End MixMonitor Recording %s\n", name);
|
||||
|
||||
@@ -273,6 +281,10 @@ out2:
|
||||
ast_closestream(fs);
|
||||
|
||||
out:
|
||||
AST_LIST_LOCK(&monitors);
|
||||
AST_LIST_REMOVE(&monitors, mixmonitor, list);
|
||||
AST_LIST_UNLOCK(&monitors);
|
||||
|
||||
free(mixmonitor);
|
||||
|
||||
STANDARD_DECREMENT_USECOUNT;
|
||||
@@ -403,6 +415,7 @@ static int mixmonitor_exec(struct ast_channel *chan, void *data)
|
||||
static int mixmonitor_cli(int fd, int argc, char **argv)
|
||||
{
|
||||
struct ast_channel *chan;
|
||||
struct mixmonitor *mon;
|
||||
|
||||
if (argc < 3)
|
||||
return RESULT_SHOWUSAGE;
|
||||
@@ -414,8 +427,13 @@ static int mixmonitor_cli(int fd, int argc, char **argv)
|
||||
|
||||
if (!strcasecmp(argv[1], "start"))
|
||||
mixmonitor_exec(chan, argv[3]);
|
||||
else if (!strcasecmp(argv[1], "stop"))
|
||||
ast_channel_spy_stop_by_type(chan, mixmonitor_spy_type);
|
||||
else if (!strcasecmp(argv[1], "stop")) {
|
||||
AST_LIST_TRAVERSE_SAFE_BEGIN(&monitors, mon, list) {
|
||||
if (chan == mon->chan)
|
||||
ast_set_flag(mon, FLAG_STOP);
|
||||
}
|
||||
AST_LIST_TRAVERSE_SAFE_END;
|
||||
}
|
||||
|
||||
ast_mutex_unlock(&chan->lock);
|
||||
|
||||
|
Reference in New Issue
Block a user