Skip to content
Snippets Groups Projects
stereorize.c 4.79 KiB
Newer Older
  • Learn to ignore specific revisions
  • /****************************************************************************
     *
     * 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>
     *
     ****************************************************************************/
    
    #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)
         {
           if ((strcmp(outfilename,"<stdout>")!=0) && (fseek( out, 0, SEEK_SET) != 0)) 
        	 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;
    
    
          if (!fwrite(stereosample, sizeof(*leftsample), 2 * maxk, out)) {
    	      fatalerror("Error writing to file '%s': %s\n",
    			 outfilename, strerror(errno));
          }
    
       }
       /* That was an endless loop. This point is never reached. */
    
       free(leftsample);
       free(rightsample);
       free(stereosample);