diff options
author | file <file@f38db490-d61c-443f-a65b-d21fe96a405b> | 2007-01-22 19:08:52 +0000 |
---|---|---|
committer | file <file@f38db490-d61c-443f-a65b-d21fe96a405b> | 2007-01-22 19:08:52 +0000 |
commit | 2e0d713af224e4a4f9ee23fe5a2211a2c5135e76 (patch) | |
tree | 4eb09743048c1399a4941f6e37a07390c05cfc8e /apps | |
parent | 47a5da3f29ecc29cbc536b2b625a4a4787e8e991 (diff) |
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: http://svn.digium.com/svn/asterisk/branches/1.2@51406 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'apps')
-rw-r--r-- | apps/app_mixmonitor.c | 57 |
1 files changed, 32 insertions, 25 deletions
diff --git a/apps/app_mixmonitor.c b/apps/app_mixmonitor.c index caff40181..3fa0468ab 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; } |