revert my pass through the tree to remove checks of the result of ast_strdupa
[asterisk/asterisk.git] / apps / app_mixmonitor.c
index 743e699..279f0e6 100644 (file)
@@ -2,7 +2,7 @@
  * Asterisk -- An open source telephony toolkit.
  *
  * Copyright (C) 2005, Anthony Minessale II
- * Copyright (C) 2005, Digium, Inc.
+ * Copyright (C) 2005 - 2006, Digium, Inc.
  *
  * Mark Spencer <markster@digium.com>
  * Kevin P. Fleming <kpfleming@digium.com>
@@ -53,6 +53,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
 #include "asterisk/options.h"
 #include "asterisk/app.h"
 #include "asterisk/linkedlists.h"
+#include "asterisk/utils.h"
 
 #define get_volfactor(x) x ? ((x > 0) ? (1 << x) : ((1 << abs(x)) * -1)) : 0
 
@@ -86,7 +87,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;
@@ -95,15 +95,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 {
@@ -123,9 +120,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)
@@ -168,10 +165,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;
@@ -226,7 +219,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;
                }
@@ -252,8 +245,6 @@ static void *mixmonitor_thread(void *obj)
                ast_mutex_unlock(&spy.lock);
        }
        
-       stopmon(mixmonitor->chan, &spy);
-
        if (mixmonitor->post_process) {
                char *p;
 
@@ -265,6 +256,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);
 
@@ -281,10 +274,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;
@@ -304,8 +293,7 @@ static void launch_monitor_thread(struct ast_channel *chan, const char *filename
        if (!ast_strlen_zero(post_process))
                len += strlen(post_process) + 1;
 
-       if (!(mixmonitor = calloc(1, len))) {
-               ast_log(LOG_ERROR, "Memory Error!\n");
+       if (!(mixmonitor = ast_calloc(1, len))) {
                return;
        }
 
@@ -415,7 +403,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;
@@ -427,13 +414,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);