diff options
author | file <file@f38db490-d61c-443f-a65b-d21fe96a405b> | 2007-01-22 19:22:07 +0000 |
---|---|---|
committer | file <file@f38db490-d61c-443f-a65b-d21fe96a405b> | 2007-01-22 19:22:07 +0000 |
commit | e50a0640bdaa76e89719e5ee6ee9f5f857a01c8f (patch) | |
tree | d7c9648e01c1f53e27577971c169335995211ef9 /apps/app_mixmonitor.c | |
parent | 0bf83c44b8e4a902a6489ce47940f9284f842375 (diff) |
Merged revisions 51407 via svnmerge from
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: http://svn.digium.com/svn/asterisk/trunk@51408 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'apps/app_mixmonitor.c')
-rw-r--r-- | apps/app_mixmonitor.c | 59 |
1 files changed, 32 insertions, 27 deletions
diff --git a/apps/app_mixmonitor.c b/apps/app_mixmonitor.c index 210e18968..6af76d2f5 100644 --- a/apps/app_mixmonitor.c +++ b/apps/app_mixmonitor.c @@ -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; } |