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: https://origsvn.digium.com/svn/asterisk/trunk@51408 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
Joshua Colp
2007-01-22 19:22:07 +00:00
parent 1a5dfca2a1
commit ea17720d1e

View 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;
}