| 
									
										
										
										
											2005-01-21 03:56:22 +00:00
										 |  |  | /****************************************************************************
 | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Programs for processing sound files in raw- or WAV-format. | 
					
						
							|  |  |  |  * -- Merge two mono WAV-files to one stereo WAV-file. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Name:    stereorize.c | 
					
						
							|  |  |  |  * Version: 1.1 | 
					
						
							|  |  |  |  * Author:  Mark Roberts <mark@manumark.de> | 
					
						
							|  |  |  |  *	    Michael Labuschke <michael@labuschke.de> | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  ****************************************************************************/ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-07-14 20:28:54 +00:00
										 |  |  | /*** MODULEINFO
 | 
					
						
							|  |  |  | 	<support_level>extended</support_level> | 
					
						
							|  |  |  |  ***/ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-01-21 03:56:22 +00:00
										 |  |  | #include <stdio.h>
 | 
					
						
							|  |  |  | #include <stdlib.h>
 | 
					
						
							|  |  |  | #include <string.h>
 | 
					
						
							|  |  |  | #include <errno.h>
 | 
					
						
							|  |  |  | #include <time.h>
 | 
					
						
							|  |  |  | #include <assert.h>
 | 
					
						
							|  |  |  | #include "frame.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static char *Version = "stereorize 1.1, November 5th 2000"; | 
					
						
							|  |  |  | static char *Usage = | 
					
						
							|  |  |  | "Usage: stereorize [options] infile-left infile-right outfile\n\n" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | "Example:\n" | 
					
						
							|  |  |  | " stereorize left.wav right.wav stereo.wav -h\n\n" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | "Creates stereo.wav (with WAV-header, option -h) from data in mono files\n" | 
					
						
							|  |  |  | "left.wav and right.wav.\n" | 
					
						
							|  |  |  | ; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int main( int argcount, char *args[]) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |    int i, k[2], maxk, stdin_in_use=FALSE; | 
					
						
							|  |  |  |    short *leftsample, *rightsample, *stereosample; | 
					
						
							|  |  |  |    FILE *channel[2]; | 
					
						
							|  |  |  |    char *filename[2], *tempname; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    version = Version; | 
					
						
							|  |  |  |    usage = Usage; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    channel[0] = NULL; | 
					
						
							|  |  |  |    channel[1] = NULL; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    parseargs( argcount, args, NOFILES | NOCOMPLAIN); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    for (i = 0; i < 2; i++) | 
					
						
							|  |  |  |      { | 
					
						
							|  |  |  |        filename[i] = parsefilearg( argcount, args); | 
					
						
							|  |  |  |        if (filename[i] == NULL) | 
					
						
							|  |  |  | 	 argerrornum( NULL, ME_NOTENOUGHFILES); | 
					
						
							|  |  |  |        if (strcmp (filename[i], "-") == 0) | 
					
						
							|  |  |  | 	 { | 
					
						
							|  |  |  | 	   if (stdin_in_use) | 
					
						
							|  |  |  | 	     argerrortxt( filename[i] + 1, | 
					
						
							|  |  |  | 			  "Cannot use <stdin> for both input files"); | 
					
						
							|  |  |  | 	   filename[i] = "<stdin>"; | 
					
						
							|  |  |  | 	   channel[i] = stdin; | 
					
						
							|  |  |  | 	   stdin_in_use = TRUE; | 
					
						
							|  |  |  | 	 } | 
					
						
							|  |  |  |        else | 
					
						
							|  |  |  | 	 { | 
					
						
							|  |  |  | 	   channel[i] = fopen(filename[i], "rb"); | 
					
						
							|  |  |  | 	 } | 
					
						
							|  |  |  |        if (channel[i] == NULL) | 
					
						
							|  |  |  | 	   fatalerror( "Error opening input file '%s': %s\n", filename[i],strerror(errno)); | 
					
						
							|  |  |  |        else | 
					
						
							|  |  |  | 	 inform("Using file '%s' as input\n", filename[i]); | 
					
						
							|  |  |  |      } | 
					
						
							|  |  |  |    for (i = 0; i < 2; i++) | 
					
						
							|  |  |  |      { | 
					
						
							|  |  |  |        assert ( channel[i] != NULL); | 
					
						
							|  |  |  |        readwavheader( channel[i]); | 
					
						
							|  |  |  |        if (iswav && channels != 1) | 
					
						
							|  |  |  | 	 inform("Warning: '%s' is no mono file\n", filename[i]); | 
					
						
							|  |  |  |      } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    outfilename = parsefilearg( argcount, args); | 
					
						
							|  |  |  |    if (outfilename == NULL) argerrornum( NULL, ME_NOOUTFILE); | 
					
						
							|  |  |  |    if (strcmp (outfilename, "-") == 0) | 
					
						
							|  |  |  |      { | 
					
						
							|  |  |  |        outfilename = "<stdout>"; | 
					
						
							|  |  |  |        out = stdout; | 
					
						
							|  |  |  |      } | 
					
						
							|  |  |  |    else | 
					
						
							|  |  |  |      { | 
					
						
							|  |  |  |        out = fopen(outfilename, "wb"); | 
					
						
							|  |  |  |      } | 
					
						
							|  |  |  |    if (out == NULL) | 
					
						
							|  |  |  |      fatalerror( "Error opening output file '%s': %s\n", outfilename,strerror(errno)); | 
					
						
							|  |  |  |    else | 
					
						
							|  |  |  |      inform("Using file '%s' as output\n", outfilename); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    if ((tempname = parsefilearg( argcount, args)) != NULL) | 
					
						
							|  |  |  |      argerrornum( tempname, ME_TOOMANYFILES); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    checknoargs(argcount, args);      /* Check that no arguments are left */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    leftsample = malloc( sizeof(*leftsample) * BUFFSIZE); | 
					
						
							|  |  |  |    rightsample = malloc( sizeof(*leftsample) * BUFFSIZE); | 
					
						
							|  |  |  |    stereosample = malloc( sizeof(*leftsample) * 2 * BUFFSIZE); | 
					
						
							|  |  |  |    if (leftsample == NULL || rightsample == NULL || stereosample == NULL) | 
					
						
							|  |  |  |      fatalperror (""); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    channels = 2;   /* Output files are stereo */ | 
					
						
							|  |  |  |    if (wavout) | 
					
						
							|  |  |  |      { | 
					
						
							| 
									
										
										
										
											2017-12-22 09:23:22 -05:00
										 |  |  |        if ((strcmp(outfilename,"<stdout>")!=0) && (fseek( out, 0, SEEK_SET) != 0)) | 
					
						
							| 
									
										
										
										
											2005-01-21 03:56:22 +00:00
										 |  |  |     	 fatalerror("Couldn't navigate output file '%s': %s\n",outfilename, strerror(errno)); | 
					
						
							|  |  |  |        makewavheader(); | 
					
						
							|  |  |  |      } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    startstopwatch(); | 
					
						
							|  |  |  |    while (TRUE) | 
					
						
							|  |  |  |    { | 
					
						
							|  |  |  |       maxk = 0; | 
					
						
							|  |  |  |       for (i = 0; i < 2; i++) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 	  k[i] = fread(i==0? leftsample : rightsample, | 
					
						
							|  |  |  | 		       sizeof(*leftsample), | 
					
						
							|  |  |  | 		       BUFFSIZE, | 
					
						
							|  |  |  | 		       channel[i]); | 
					
						
							|  |  |  | 	  if (k[i] == -1) | 
					
						
							|  |  |  | 	    fatalerror("Error reading file '%s': %s\n", filename[i],strerror(errno)); | 
					
						
							|  |  |  | 	  if (k[i] > maxk) | 
					
						
							|  |  |  | 	    maxk = k[i]; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  |       if (maxk == 0) | 
					
						
							|  |  |  | 	myexit (0); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       /*-------------------------------------------------*
 | 
					
						
							|  |  |  |        * First the left channel as far as it goes ...    * | 
					
						
							|  |  |  |        *-------------------------------------------------*/ | 
					
						
							|  |  |  |       for (i = 0; i < k[0]; i++) | 
					
						
							|  |  |  | 	stereosample[2 * i] = leftsample[i]; | 
					
						
							|  |  |  |       /*-------------------------------------------------*
 | 
					
						
							|  |  |  |        * ... and fill up till the end of this buffer.    * | 
					
						
							|  |  |  |        *-------------------------------------------------*/ | 
					
						
							|  |  |  |       for (; i < maxk; i++) | 
					
						
							|  |  |  | 	stereosample[2 * i] = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       /*-------------------------------------------------*
 | 
					
						
							|  |  |  |        * Next the right channel as far as it goes ...    * | 
					
						
							|  |  |  |        *-------------------------------------------------*/ | 
					
						
							|  |  |  |       for (i = 0; i < k[1]; i++) | 
					
						
							|  |  |  | 	stereosample[2 * i + 1] = rightsample[i]; | 
					
						
							|  |  |  |       /*-------------------------------------------------*
 | 
					
						
							|  |  |  |        * ... and fill up till the end of this buffer.    * | 
					
						
							|  |  |  |        *-------------------------------------------------*/ | 
					
						
							|  |  |  |       for (; i < maxk; i++) | 
					
						
							|  |  |  | 	stereosample[2 * i + 1] = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-02 18:52:13 +00:00
										 |  |  |       if (!fwrite(stereosample, sizeof(*leftsample), 2 * maxk, out)) { | 
					
						
							|  |  |  | 	      fatalerror("Error writing to file '%s': %s\n", | 
					
						
							|  |  |  | 			 outfilename, strerror(errno)); | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2005-01-21 03:56:22 +00:00
										 |  |  |    } | 
					
						
							|  |  |  |    /* That was an endless loop. This point is never reached. */ | 
					
						
							| 
									
										
										
										
											2009-06-18 16:37:42 +00:00
										 |  |  |    free(leftsample); | 
					
						
							|  |  |  |    free(rightsample); | 
					
						
							|  |  |  |    free(stereosample); | 
					
						
							| 
									
										
										
										
											2005-01-21 03:56:22 +00:00
										 |  |  | } |