Merged revisions 51407 via svnmerge from
authorJoshua Colp <jcolp@digium.com>
Mon, 22 Jan 2007 19:22:07 +0000 (19:22 +0000)
committerJoshua Colp <jcolp@digium.com>
Mon, 22 Jan 2007 19:22:07 +0000 (19:22 +0000)
https://origsvn.digium.com/svn/asterisk/branches/1.4

................
r51407 | file | 2007-01-22 14:13:44 -0500 (Mon, 22 Jan 2007) | 10 lines

Merged revisions 51406 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.2

........
r51406 | file | 2007-01-22 14:08:52 -0500 (Mon, 22 Jan 2007) | 2 lines

Move filestream creation to Mixmonitor loop. This will prevent a blank file from being created if no frames ever pass through to be recorded. (issue #7589 reported by steve_mcneil)

........

................

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@51408 65c4cc65-6c06-0410-ace0-fbb531ad65f3

apps/app_mixmonitor.c

index 210e189..6af76d2 100644 (file)
@@ -93,7 +93,7 @@ static const char *mixmonitor_spy_type = "MixMonitor";
 
 struct mixmonitor {
        struct ast_channel_spy spy;
-       struct ast_filestream *fs;
+       char *filename;
        char *post_process;
        char *name;
        unsigned int flags;
@@ -146,8 +146,11 @@ static void *mixmonitor_thread(void *obj)
 {
        struct mixmonitor *mixmonitor = obj;
        struct ast_frame *f = NULL;
-       
-       
+       struct ast_filestream *fs = NULL;
+       unsigned int oflags;
+       char *ext;
+       int errflag = 0;
+
        if (option_verbose > 1)
                ast_verbose(VERBOSE_PREFIX_2 "Begin MixMonitor Recording %s\n", mixmonitor->name);
        
@@ -174,8 +177,27 @@ static void *mixmonitor_thread(void *obj)
                        */
                        for (; f; f = next) {
                                next = AST_LIST_NEXT(f, frame_list);
-                               if (write)
-                                       ast_writestream(mixmonitor->fs, f);
+                               if (write && errflag == 0) {
+                                       if (!fs) {
+                                               /* Determine creation flags and filename plus extension for filestream */
+                                               oflags = O_CREAT | O_WRONLY;
+                                               oflags |= ast_test_flag(mixmonitor, MUXFLAG_APPEND) ? O_APPEND : O_TRUNC;
+
+                                               if ((ext = strrchr(mixmonitor->filename, '.')))
+                                                       *(ext++) = '\0';
+                                               else
+                                                       ext = "raw";
+
+                                               /* Move onto actually creating the filestream */
+                                               if (!(fs = ast_writefile(mixmonitor->filename, ext, NULL, oflags, 0, 0644))) {
+                                                       ast_log(LOG_ERROR, "Cannot open %s.%s\n", mixmonitor->filename, ext);
+                                                       errflag = 1;
+                                               }
+
+                                       }
+                                       if (fs)
+                                               ast_writestream(fs, f);
+                               }
                                ast_frame_free(f, 0);
                        }
                }
@@ -194,7 +216,8 @@ static void *mixmonitor_thread(void *obj)
                ast_safe_system(mixmonitor->post_process);
        }
                
-       ast_closestream(mixmonitor->fs);
+       if (fs)
+               ast_closestream(fs);
 
        free(mixmonitor);
 
@@ -208,12 +231,10 @@ static void launch_monitor_thread(struct ast_channel *chan, const char *filename
        pthread_attr_t attr;
        pthread_t thread;
        struct mixmonitor *mixmonitor;
-       char *file_name, *ext;
        char postprocess2[1024] = "";
-       unsigned int oflags;
        size_t len;
 
-       len = sizeof(*mixmonitor) + strlen(chan->name) + 1;
+       len = sizeof(*mixmonitor) + strlen(chan->name) + strlen(filename) + 2;
 
        /* If a post process system command is given attach it to the structure */
        if (!ast_strlen_zero(post_process)) {
@@ -245,23 +266,8 @@ static void launch_monitor_thread(struct ast_channel *chan, const char *filename
                strcpy(mixmonitor->post_process, postprocess2);
        }
 
-       /* Determine creation flags and filename plus extension for filestream */
-       oflags = O_CREAT | O_WRONLY;
-       oflags |= ast_test_flag(mixmonitor, MUXFLAG_APPEND) ? O_APPEND : O_TRUNC;
-       file_name = ast_strdupa(filename);
-       if ((ext = strrchr(file_name, '.'))) {
-               *(ext++) = '\0';
-       } else {
-               ext = "raw";
-       }
-
-       /* Move onto actually creating the filestream */
-       mixmonitor->fs = ast_writefile(file_name, ext, NULL, oflags, 0, AST_FILE_MODE);
-       if (!mixmonitor->fs) {
-               ast_log(LOG_ERROR, "Cannot open %s.%s\n", file_name, ext);
-               free(mixmonitor);
-               return;
-       }
+       mixmonitor->filename = (char *) mixmonitor + sizeof(*mixmonitor) + strlen(chan->name) + 1;
+       strcpy(mixmonitor->filename, filename);
 
        /* Setup the actual spy before creating our thread */
        ast_set_flag(&mixmonitor->spy, CHANSPY_FORMAT_AUDIO);
@@ -285,7 +291,6 @@ static void launch_monitor_thread(struct ast_channel *chan, const char *filename
                        mixmonitor->spy.type, chan->name);
                /* Since we couldn't add ourselves - bail out! */
                ast_mutex_destroy(&mixmonitor->spy.lock);
-               ast_closestream(mixmonitor->fs);
                free(mixmonitor);
                return;
        }