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

FILE* inFile;
char chunkName[5];
int chunkSize;
int i, j;
int channels, rate, bits;
char* data;
char* buff;

int getChunkName()
{
  for (i=0; i<5; i++) chunkName[i] = 0;
  return fread(chunkName, 1, 4, inFile);
}

int getValue(int m)
{
  int k = 0;
  fread(&k, 1, m, inFile);
  return(k);
}

int main(int argc, char** argv)
{
  if (argc < 2)
  {
    printf("Usage inFile.wav outFile.dat");
    return(1);
  }

  inFile = fopen(argv[1], "r");             // open input file
  if (inFile == 0)
  {
    printf("Cannot open file %s for reading.\n", argv[1]);
    return(1);
  }

  while (getChunkName())                    // loop over file chunks
  {
    fread(&chunkSize, 1, 4, inFile);        // get chunk size
    printf("Chunk \"%s\":  (%d bytes)\n", chunkName, chunkSize);
    if (strcmp(chunkName, "RIFF") == 0)
    {
      printf("File size = %d\n", (chunkSize+8));
      fread(chunkName, 1, 4, inFile);
      printf("File format = %s\n", chunkName);
      continue;
    }

    if (strcmp(chunkName, "fmt ") == 0)
    {
      printf("Audio Format = %d\n", getValue(2));
      channels = getValue(2);
      printf("# of channels = %d\n", channels);
      rate = getValue(4);
      printf("Sample rate = %d\n", rate);
      printf("Byte rate = %d\n", getValue(4));
      printf("Block align = %d\n", getValue(2));
      bits = getValue(2);
      printf("# of bits/sample = %d\n", bits);
      if ((channels != 1) || (rate != 8000) || (bits != 8))
      {
        printf("Wrong file format!\n");
        return(1);
      }
      if (chunkSize > 16)
      {
        int restBytes = chunkSize-16;
        char* buff = malloc(restBytes);
        fread(buff, 1, restBytes, inFile);
        free(buff);
      }
      continue;
    }

    if (strcmp(chunkName, "data") == 0)
    {
      FILE* outFile = fopen(argv[2], "w");   // open output file
      if (outFile == 0)
      {
        printf("Cannot open file %s for writing.\n", argv[2]);
        return(1);
      }

      fwrite(&chunkSize, 1, 4, outFile);     // writing data length
      data = malloc(chunkSize);        // request memory for data
      if (data == NULL)
      {
        printf("Insufficient memory\n");
        return(1);
      }
      fread(data, 1, chunkSize, inFile);      // read data

      j = 0;
      for (i=0; i<chunkSize; i++)
      {
        if (data[i] == 13)
          j = 1;
        else if (data[i] == 10 && j == 1)
          data[i] = 11;
        else
          j = 0;
      }

      fwrite(data, 1, chunkSize, outFile);
      fclose(outFile);
      free(data);
      break;
    };

    buff = malloc(chunkSize);           // ignore all other chunks
    fread(buff, 1, chunkSize, inFile);
    free(buff);
  }
  fclose(inFile);

  printf("File %s is ready\n", argv[2]);
  return(0);
}

