123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167 |
- /****************************************************************************
- *
- * 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);
- }
|