Index: apps/app_mixmonitor.c =================================================================== --- apps/app_mixmonitor.c (revision 42536) +++ apps/app_mixmonitor.c (working copy) @@ -80,7 +80,7 @@ struct mixmonitor { struct ast_channel_spy spy; - struct ast_filestream *fs; + char *filename; char *post_process; char *name; unsigned int flags; @@ -133,7 +133,12 @@ { struct mixmonitor *mixmonitor = obj; struct ast_frame *f = NULL; + struct ast_filestream *fs = NULL; + unsigned int oflags; + char *ext; + int errflag = 0; + STANDARD_INCREMENT_USECOUNT; if (option_verbose > 1) @@ -162,8 +167,28 @@ */ for (; f; f = next) { next = f->next; - if (write) - ast_writestream(mixmonitor->fs, f); + if (write && errflag == 0) { + if (fs == NULL) { + /* 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 */ + fs = ast_writefile(mixmonitor->filename, ext, NULL, oflags, 0, 0644); + if (!fs) { + ast_log(LOG_ERROR, "Cannot open %s.%s\n", mixmonitor->filename, ext); + errflag = 1; + } + + } + if(fs) + ast_writestream(fs, f); + } ast_frfree(f); } } @@ -182,7 +207,8 @@ ast_safe_system(mixmonitor->post_process); } - ast_closestream(mixmonitor->fs); + if (fs) + ast_closestream(fs); free(mixmonitor); @@ -197,12 +223,10 @@ 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)) { @@ -235,24 +259,9 @@ 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"; - } + mixmonitor->filename = (char *) mixmonitor + sizeof(*mixmonitor) + strlen(chan->name) + 1; + strcpy(mixmonitor->filename, filename); - /* Move onto actually creating the filestream */ - mixmonitor->fs = ast_writefile(file_name, ext, NULL, oflags, 0, 0644); - if (!mixmonitor->fs) { - ast_log(LOG_ERROR, "Cannot open %s.%s\n", file_name, ext); - free(mixmonitor); - return; - } - /* Setup the actual spy before creating our thread */ ast_set_flag(&mixmonitor->spy, CHANSPY_FORMAT_AUDIO); ast_set_flag(&mixmonitor->spy, CHANSPY_MIXAUDIO); @@ -275,7 +284,6 @@ 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; }