mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-10-26 06:26:41 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			167 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			167 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /****************************************************************************
 | |
|  *
 | |
|  * 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>
 | |
|  *
 | |
|  ****************************************************************************/
 | |
| 
 | |
| /*** MODULEINFO
 | |
| 	<support_level>extended</support_level>
 | |
|  ***/
 | |
| 
 | |
| #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);
 | |
| }
 |