[asterisk-commits] file: trunk r51408 - in /trunk: ./ apps/app_mixmonitor.c

asterisk-commits at lists.digium.com asterisk-commits at lists.digium.com
Mon Jan 22 12:22:08 MST 2007


Author: file
Date: Mon Jan 22 13:22:07 2007
New Revision: 51408

URL: http://svn.digium.com/view/asterisk?view=rev&rev=51408
Log:
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)

........

................

Modified:
    trunk/   (props changed)
    trunk/apps/app_mixmonitor.c

Propchange: trunk/
------------------------------------------------------------------------------
Binary property 'branch-1.4-merged' - no diff available.

Modified: trunk/apps/app_mixmonitor.c
URL: http://svn.digium.com/view/asterisk/trunk/apps/app_mixmonitor.c?view=diff&rev=51408&r1=51407&r2=51408
==============================================================================
--- trunk/apps/app_mixmonitor.c (original)
+++ trunk/apps/app_mixmonitor.c Mon Jan 22 13:22:07 2007
@@ -93,7 +93,7 @@
 
 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 @@
 {
 	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 @@
 			*/
 			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 @@
 		ast_safe_system(mixmonitor->post_process);
 	}
 		
-	ast_closestream(mixmonitor->fs);
+	if (fs)
+		ast_closestream(fs);
 
 	free(mixmonitor);
 
@@ -208,12 +231,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)) {
@@ -245,23 +266,8 @@
 		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 @@
 			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;
 	}



More information about the asterisk-commits mailing list