diff options
author | kpfleming <kpfleming@f38db490-d61c-443f-a65b-d21fe96a405b> | 2006-01-03 17:24:56 +0000 |
---|---|---|
committer | kpfleming <kpfleming@f38db490-d61c-443f-a65b-d21fe96a405b> | 2006-01-03 17:24:56 +0000 |
commit | 2cc0ea1c32b5a6da301eff9c04a3b42bd0ed7aed (patch) | |
tree | 50b036cb54846a5d4e16015c7982c7e3888b80e1 | |
parent | 777abded5cb9b855fcad13b033ece785fe4a4971 (diff) |
revert incorrect fix for bug #6048 from revision 7709
put in correct (simpler) fix
add doxygen docs for channel spy 'state' values
git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.2@7740 f38db490-d61c-443f-a65b-d21fe96a405b
-rw-r--r-- | apps/app_chanspy.c | 4 | ||||
-rw-r--r-- | apps/app_mixmonitor.c | 32 | ||||
-rw-r--r-- | channel.c | 2 | ||||
-rw-r--r-- | include/asterisk/chanspy.h | 7 |
4 files changed, 14 insertions, 31 deletions
diff --git a/apps/app_chanspy.c b/apps/app_chanspy.c index ddec58967..299c58efc 100644 --- a/apps/app_chanspy.c +++ b/apps/app_chanspy.c @@ -208,9 +208,9 @@ static int start_spying(struct ast_channel *chan, struct ast_channel *spychan, s static void stop_spying(struct ast_channel *chan, struct ast_channel_spy *spy) { - /* If our status has changed, then the channel we're spying on is gone.... + /* If our status has changed to DONE, then the channel we're spying on is gone.... DON'T TOUCH IT!!! RUN AWAY!!! */ - if (spy->status != CHANSPY_RUNNING) + if (spy->status == CHANSPY_DONE) return; if (!chan) diff --git a/apps/app_mixmonitor.c b/apps/app_mixmonitor.c index 593213fe0..1c3b49d99 100644 --- a/apps/app_mixmonitor.c +++ b/apps/app_mixmonitor.c @@ -79,7 +79,6 @@ 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; @@ -88,15 +87,12 @@ 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 { @@ -116,9 +112,9 @@ AST_APP_OPTIONS(mixmonitor_opts, { static void stopmon(struct ast_channel *chan, struct ast_channel_spy *spy) { - /* If our status has changed, then the channel we're spying on is gone.... + /* If our status has changed to DONE, then the channel we're spying on is gone.... DON'T TOUCH IT!!! RUN AWAY!!! */ - if (spy->status != CHANSPY_RUNNING) + if (spy->status == CHANSPY_DONE) return; if (!chan) @@ -161,10 +157,6 @@ 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; @@ -219,7 +211,7 @@ static void *mixmonitor_thread(void *obj) ast_channel_spy_trigger_wait(&spy); - if (ast_check_hangup(mixmonitor->chan) || spy.status != CHANSPY_RUNNING || ast_test_flag(mixmonitor, FLAG_STOP)) { + if (ast_check_hangup(mixmonitor->chan) || spy.status != CHANSPY_RUNNING) { ast_mutex_unlock(&spy.lock); break; } @@ -245,8 +237,6 @@ static void *mixmonitor_thread(void *obj) ast_mutex_unlock(&spy.lock); } - stopmon(mixmonitor->chan, &spy); - if (mixmonitor->post_process) { char *p; @@ -258,6 +248,8 @@ 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); @@ -274,10 +266,6 @@ out2: ast_closestream(fs); out: - AST_LIST_LOCK(&monitors); - AST_LIST_REMOVE(&monitors, mixmonitor, list); - AST_LIST_UNLOCK(&monitors); - free(mixmonitor); STANDARD_DECREMENT_USECOUNT; @@ -408,7 +396,6 @@ 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; @@ -420,13 +407,8 @@ 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_LIST_TRAVERSE_SAFE_BEGIN(&monitors, mon, list) { - if (chan == mon->chan) - ast_set_flag(mon, FLAG_STOP); - } - AST_LIST_TRAVERSE_SAFE_END; - } + else if (!strcasecmp(argv[1], "stop")) + ast_channel_spy_stop_by_type(chan, mixmonitor_spy_type); ast_mutex_unlock(&chan->lock); @@ -1024,7 +1024,7 @@ void ast_channel_spy_stop_by_type(struct ast_channel *chan, const char *type) AST_LIST_TRAVERSE(&chan->spies->list, spy, list) { ast_mutex_lock(&spy->lock); if ((spy->type == type) && (spy->status == CHANSPY_RUNNING)) { - spy->status = CHANSPY_DONE; + spy->status = CHANSPY_STOP; if (ast_test_flag(spy, CHANSPY_TRIGGER_MODE) != CHANSPY_TRIGGER_NONE) ast_cond_signal(&spy->trigger); } diff --git a/include/asterisk/chanspy.h b/include/asterisk/chanspy.h index 4973763b2..5b2f5df18 100644 --- a/include/asterisk/chanspy.h +++ b/include/asterisk/chanspy.h @@ -30,9 +30,10 @@ extern "C" { #include "asterisk/linkedlists.h" enum chanspy_states { - CHANSPY_NEW = 0, - CHANSPY_RUNNING = 1, - CHANSPY_DONE = 2, + CHANSPY_NEW = 0, /*!< spy not yet operating */ + CHANSPY_RUNNING = 1, /*!< normal operation, spy is still operating */ + CHANSPY_DONE = 2, /*!< spy is stopped and already removed from channel */ + CHANSPY_STOP = 3, /*!< spy requested to stop, still attached to channel */ }; enum chanspy_flags { |