From edca3010a49d061629b17268e59ab1b0b09c4048 Mon Sep 17 00:00:00 2001 From: Joshua Colp Date: Mon, 22 Jan 2007 19:08:52 +0000 Subject: [PATCH] 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/branches/1.2@51406 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- apps/app_mixmonitor.c | 57 ++++++++++++++++++++++++------------------- 1 file changed, 32 insertions(+), 25 deletions(-) diff --git a/apps/app_mixmonitor.c b/apps/app_mixmonitor.c index caff401812..3fa0468ab0 100644 --- a/apps/app_mixmonitor.c +++ b/apps/app_mixmonitor.c @@ -80,7 +80,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; @@ -133,6 +133,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; + STANDARD_INCREMENT_USECOUNT; @@ -162,8 +167,27 @@ static void *mixmonitor_thread(void *obj) */ for (; f; f = next) { next = f->next; - 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_frfree(f); } } @@ -182,7 +206,8 @@ static void *mixmonitor_thread(void *obj) ast_safe_system(mixmonitor->post_process); } - ast_closestream(mixmonitor->fs); + if (fs) + ast_closestream(fs); free(mixmonitor); @@ -197,12 +222,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)) { @@ -235,23 +258,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, 0644); - 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); @@ -275,7 +283,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; }