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