Skip to content
Snippets Groups Projects
Commit b5d18c50 authored by Tilghman Lesher's avatar Tilghman Lesher
Browse files

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
parent 7aad6506
No related branches found
No related tags found
No related merge requests found
...@@ -86,6 +86,7 @@ LOCAL_USER_DECL; ...@@ -86,6 +86,7 @@ LOCAL_USER_DECL;
static const char *mixmonitor_spy_type = "MixMonitor"; static const char *mixmonitor_spy_type = "MixMonitor";
struct mixmonitor { struct mixmonitor {
AST_LIST_ENTRY(mixmonitor) list;
struct ast_channel *chan; struct ast_channel *chan;
char *filename; char *filename;
char *post_process; char *post_process;
...@@ -94,12 +95,15 @@ struct mixmonitor { ...@@ -94,12 +95,15 @@ struct mixmonitor {
int writevol; int writevol;
}; };
AST_LIST_HEAD_STATIC(monitors, mixmonitor);
enum { enum {
MUXFLAG_APPEND = (1 << 1), MUXFLAG_APPEND = (1 << 1),
MUXFLAG_BRIDGED = (1 << 2), MUXFLAG_BRIDGED = (1 << 2),
MUXFLAG_VOLUME = (1 << 3), MUXFLAG_VOLUME = (1 << 3),
MUXFLAG_READVOLUME = (1 << 4), MUXFLAG_READVOLUME = (1 << 4),
MUXFLAG_WRITEVOLUME = (1 << 5), MUXFLAG_WRITEVOLUME = (1 << 5),
FLAG_STOP = (1 << 6),
} mixmonitor_flags; } mixmonitor_flags;
enum { enum {
...@@ -164,6 +168,10 @@ static void *mixmonitor_thread(void *obj) ...@@ -164,6 +168,10 @@ static void *mixmonitor_thread(void *obj)
STANDARD_INCREMENT_USECOUNT; STANDARD_INCREMENT_USECOUNT;
AST_LIST_LOCK(&monitors);
AST_LIST_INSERT_HEAD(&monitors, mixmonitor, list);
AST_LIST_UNLOCK(&monitors);
name = ast_strdupa(mixmonitor->chan->name); name = ast_strdupa(mixmonitor->chan->name);
oflags = O_CREAT|O_WRONLY; oflags = O_CREAT|O_WRONLY;
...@@ -218,7 +226,7 @@ static void *mixmonitor_thread(void *obj) ...@@ -218,7 +226,7 @@ static void *mixmonitor_thread(void *obj)
ast_channel_spy_trigger_wait(&spy); 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); ast_mutex_unlock(&spy.lock);
break; break;
} }
...@@ -244,6 +252,8 @@ static void *mixmonitor_thread(void *obj) ...@@ -244,6 +252,8 @@ static void *mixmonitor_thread(void *obj)
ast_mutex_unlock(&spy.lock); ast_mutex_unlock(&spy.lock);
} }
stopmon(mixmonitor->chan, &spy);
if (mixmonitor->post_process) { if (mixmonitor->post_process) {
char *p; char *p;
...@@ -255,8 +265,6 @@ static void *mixmonitor_thread(void *obj) ...@@ -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); pbx_substitute_variables_helper(mixmonitor->chan, mixmonitor->post_process, post_process, sizeof(post_process) - 1);
} }
stopmon(mixmonitor->chan, &spy);
if (option_verbose > 1) if (option_verbose > 1)
ast_verbose(VERBOSE_PREFIX_2 "End MixMonitor Recording %s\n", name); ast_verbose(VERBOSE_PREFIX_2 "End MixMonitor Recording %s\n", name);
...@@ -273,6 +281,10 @@ out2: ...@@ -273,6 +281,10 @@ out2:
ast_closestream(fs); ast_closestream(fs);
out: out:
AST_LIST_LOCK(&monitors);
AST_LIST_REMOVE(&monitors, mixmonitor, list);
AST_LIST_UNLOCK(&monitors);
free(mixmonitor); free(mixmonitor);
STANDARD_DECREMENT_USECOUNT; STANDARD_DECREMENT_USECOUNT;
...@@ -403,6 +415,7 @@ static int mixmonitor_exec(struct ast_channel *chan, void *data) ...@@ -403,6 +415,7 @@ static int mixmonitor_exec(struct ast_channel *chan, void *data)
static int mixmonitor_cli(int fd, int argc, char **argv) static int mixmonitor_cli(int fd, int argc, char **argv)
{ {
struct ast_channel *chan; struct ast_channel *chan;
struct mixmonitor *mon;
if (argc < 3) if (argc < 3)
return RESULT_SHOWUSAGE; return RESULT_SHOWUSAGE;
...@@ -414,8 +427,13 @@ static int mixmonitor_cli(int fd, int argc, char **argv) ...@@ -414,8 +427,13 @@ static int mixmonitor_cli(int fd, int argc, char **argv)
if (!strcasecmp(argv[1], "start")) if (!strcasecmp(argv[1], "start"))
mixmonitor_exec(chan, argv[3]); mixmonitor_exec(chan, argv[3]);
else if (!strcasecmp(argv[1], "stop")) else if (!strcasecmp(argv[1], "stop")) {
ast_channel_spy_stop_by_type(chan, mixmonitor_spy_type); 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); ast_mutex_unlock(&chan->lock);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment