/* split_audio.c - Split right/left channels of an audio file */
/* Some audio books use one channel at a time as a means of fitting */
/* more on one tape. On a 90 minute tape they can fit 2*90/60=3hrs */
/* of audio. The drawback is that you have to listen to the book */
/* one speaker at a time, left and then right. This program splits */
/* the input audio file (obtained from the audio book) into two */
/* output audio files, i.e. left and right channels. The left input */
/* channel is copied to both channels of the "left" output file and */
/* the right input channel is copied to both channels of the "right"*/
/* output file. */
/* */
/* Usage: split_audio file_name.[raw|wav] */
/* */
/* The output file type is the same as the input type. */
/* David Edwards <dee.engineering@usa.net> */
// Make with: gcc [-ggdb] -o split_audio split_audio.c
// Or with any ANSI C compiler...
/********************** REVISION HISTORY ****************************
11-20-00: Original release
12-04-00: Changed name from split_raw to split_audio with addition
of wav file support.
*********************************************************************/
#define BUFSIZE 1024 // Read in BUFSIZE bytes of file
#include <stdio.h>
#include <string.h>
int main(int argc,char **argv)
{
FILE *fin, *fleft, *fright;
char fnbase[BUFSIZE], fnleft[BUFSIZE], fnright[BUFSIZE];
char *sptr;
int i, byte;
int Lmsb, Llsb, Rmsb, Rlsb;
/*********************************
Initialization Portion of Program
**********************************/
// Error handling
if (argc != 2) {
fprintf(stderr,"\nSplit an audio file into two left/right files."
" /DEE 12-04-00 Rev 1.1\n"
"\n Usage: split_audio filename.[raw|wav]\n"
"\n Output: filename.left.[raw|wav] and filename.right.[raw|wav]\n\n");
return 1;
}
// Open the input file
if ((fin = fopen(argv[1], "rb")) == NULL) {
fprintf(stderr, "\nCannot open input file: %s\n",argv[1]);
return 1;
}
// Get the base name (without extension) of the input file name
strcpy(fnbase,argv[1]);
if ((sptr=strrchr(fnbase,'.')) != NULL) {
sptr[0]=0;
} else {
fprintf(stderr,"\nInput file must have a .raw or .wav extension\n");
fclose(fin);
return 1;
}
// Prepare strings for opening/creating output files
strcpy(fnleft,fnbase);
strcpy(fnright,fnbase);
// Handle wav headers & setup output names
sptr=strrchr(argv[1],'.');
if (strncasecmp(sptr, ".RAW",4) == 0) {
strcat(fnleft,".left.raw");
strcat(fnright,".right.raw");
// Open/create the left output file
if ((fleft = fopen(fnleft, "wb")) == NULL) {
fprintf(stderr, "\nCannot open output file: %s\n",fnleft);
fclose(fin);
return 1;
}
// Open/create the right output file
if ((fright = fopen(fnright, "wb")) == NULL) {
fprintf(stderr, "\nCannot open output file: %s\n",fnright);
fclose(fin);
return 1;
}
} else if (strncasecmp(sptr,".WAV",4) == 0) {
strcat(fnleft,".left.wav");
strcat(fnright,".right.wav");
// Open/create the left output file
if ((fleft = fopen(fnleft, "wb")) == NULL) {
fprintf(stderr, "\nCannot open output file: %s\n",fnleft);
fclose(fin);
return 1;
}
// Open/create the right output file
if ((fright = fopen(fnright, "wb")) == NULL) {
fprintf(stderr, "\nCannot open output file: %s\n",fnright);
fclose(fin);
return 1;
}
for (i=0; i<44; i++) {
byte=fgetc(fin);
fputc(byte,fleft);
fputc(byte,fright);
}
} else {
fprintf(stderr,"\nInput file must have a .raw or .wav extension\n");
fclose(fin);
return 1;
}
fprintf(stdout,"\nSplitting %s into:\n\n"
" %s\n"
" %s\n\n",argv[1],fnleft,fnright);
/*********************************
Write the output files
See the README file for logic
**********************************/
while ((Llsb=fgetc(fin)) != EOF) {
Lmsb=fgetc(fin);
fputc(Llsb,fleft); /* LSB left output */
fputc(Lmsb,fleft); /* MSB left output */
fputc(Llsb,fleft); /* LSB right output */
fputc(Lmsb,fleft); /* MSB right output */
Rlsb=fgetc(fin);
Rmsb=fgetc(fin);
fputc(Rlsb,fright); /* LSB left output */
fputc(Rmsb,fright); /* MSB left output */
fputc(Rlsb,fright); /* LSB right output */
fputc(Rmsb,fright); /* MSB right output */
}
fclose(fin);
fclose(fleft);
fclose(fright);
return 1;
}