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