#include <stdlib.h>
#include <stdio.h>

#define L_FRAME 80

/***********************************************

File: mixer.c
Usage: mixer file1 file2 patternfile ofile

  file1 and file2 are 16 bit linear pcm speech files.
  patternfile contains 0 or 1. A 0 means select frame from file1, and
  a 1 means from file2. Ofile is the resulting mixed speech file.

  ******************************************/

void Usage() {
  fprintf(stderr,"Usage:\n");
  fprintf(stderr,"  mixer file1 file2 patternfile ofile\n");
}

void main(int argc, char *argv[]) {
  FILE *fp1, *fp2, *pfile, *ofile;
  short in1[L_FRAME], in2[L_FRAME];
  short *out;
  int marker;

  /* process command line arguments */

  if(argc < 5) {
    Usage();
    exit(-1);
  }

  if((fp1 = fopen(argv[1], "r")) == NULL) {
    fprintf(stderr,"Error opening %s\n", argv[1]);
    exit(-1);
  }
  if((fp2 = fopen(argv[2], "r")) == NULL) {
    fprintf(stderr,"Error opening %s\n", argv[2]);
    exit(-1);
  }
  if((pfile = fopen(argv[3], "r")) == NULL) {
    fprintf(stderr,"Error opening %s\n", argv[3]);
    exit(-1);
  }
  if((ofile = fopen(argv[4], "w")) == NULL) {
    fprintf(stderr,"Error opening %s\n", argv[4]);
    exit(-1);
  }

  /* Now just loop and do it */

  while(1) {

    if(fread(in1, sizeof(short), L_FRAME, fp1) != L_FRAME) {
      break;
    }
    if(fread(in2, sizeof(short), L_FRAME, fp2) != L_FRAME) {
      break;
    }

    fscanf(pfile, "%d\n",&marker);

    /* Choose buffer for this frame */

    if(marker == 1)
      out = in2;
    else 
      out = in1;

    /* Now write back */    

    if((fwrite(out, sizeof(short), L_FRAME, ofile)) != L_FRAME) {
      fprintf(stderr," Error writing output file\n");
      exit(-1);
    }
  }

  fclose(fp1);
  fclose(fp2);
  fclose(ofile);
  fclose(pfile);

  exit(0);
}

