/* DACONV converts CDDA data to various other formats */


#include <stdio.h>
#include <stdlib.h>
#include <dos.h>
#include <string.h>
#include <alloc.h>


int *buffer,*buf2;
char *buf3;
int mode,us;

FILE* infp;
FILE* outfp;

#define SIGNED 1
#define UNSIGNED 0

main(int argc, char *argv[])
{
       if(argc > 3)
       {
               buffer = malloc(32768);                         /* Holds 25 Raw sectors of 2352 bytes */

               if(! (infp = fopen(argv[1],"rb")) ) {
                       printf("Can't find %s!\n",argv[1]);
                       exit(1);
               }
               outfp = fopen(argv[2],"wb");

               mode = atoi(argv[3]);

               us = SIGNED;

               if(argc > 4) {
                       if (argv[4][0] == '/') {
                               if(strupr(argv[4])[1] == 'U')
                                       us = UNSIGNED;
                       } else {
                               printf("Unrecognized parameter! Aborting...\n");
                               delay(1000);
                               exit(1);
                       }
               }

               switch (mode) {
                       case 1 : us16_44k_st();break;
                       case 2 : us16_44k_mo();break;
                       case 3 : us8_22k_st();break;
                       case 4 : us8_44k_mo();break;
                       case 5 : us8_22k_mo();break;
                       case 6 : us8_11k_mo();break;
               }

               fclose(infp);
               fclose(outfp);
               free(buffer);
               free(buf2);
               free(buf3);
       }
       else {
               printf("DACONV converts Signed 16 bit 44 KHz CDDA audio data\n");
               printf("Usage: daconv <infile> <outfile> <mode> [/u]\n\n");
               printf("If /u is given, the data is also made unsigned\n\n");
               printf("modes: 1 = 16 bit 44 KHz stereo\n");
               printf("       2 = 16 bit 44 KHz mono\n");
               printf("       3 =  8 bit 22 KHz stereo\n");
               printf("       4 =  8 bit 44 KHz mono\n");
               printf("       5 =  8 bit 22 KHz mono\n");
               printf("       6 =  8 bit 11 KHz mono\n");
       }
}


us16_44k_st()
{
unsigned int numread,i;

       if(us == SIGNED)
               printf("No conversion made (the data is already signed 16 bit 44 Khz).\n");
       else
       {
               do{
                       numread = fread(buffer,1,32768,infp);

                       for(i=0;i < (numread/2);i++)
                               buffer[i] ^= 0x8000;

                       fwrite(buffer,2,numread/2,outfp);
               } while(numread == 32768);
       }
}

us16_44k_mo()
{
unsigned int numread,i,j;

       buf2 = malloc(16384);

       if(us == SIGNED)
       {
               do{
                       numread = fread(buffer,1,32768,infp);

                       j = 0;

                       for(i=0;i < (numread/2);i+=2) {
                               buffer[i] /= 2;
                               buffer[i+1] /= 2;
                               buffer[i] += buffer[i+1];
                               buf2[j++] = buffer[i];
                       }
                       fwrite(buf2,2,numread/4,outfp);
               } while(numread == 32768);
       }
       else
       {
               do{
                       numread = fread(buffer,1,32768,infp);

                       j = 0;

                       for(i=0;i < (numread/2);i+=2) {
                               buffer[i] /= 2;
                               buffer[i+1] /= 2;
                               buffer[i] += buffer[i+1];
                               buffer[i] ^=  0x8000;
                               buf2[j++] = buffer[i];
                       }
                       fwrite(buf2,2,numread/4,outfp);
               } while(numread == 32768);
       }
}


us8_22k_st()
{
unsigned int numread,i,j;

       buf3 =malloc(8192);

       if(us == SIGNED)
       {
               do{
                       numread = fread(buffer,1,32768,infp);

                       j = 0;

                       for(i=0;i < (numread/2);i+=4) {
                               buffer[i] >>= 8;               /* 16 bit -> 8 bit */
                               buffer[i+1] >>= 8;
                               buf3[j++] = (unsigned char)buffer[i];
                               buf3[j++] = (unsigned char)buffer[i+1];
                       }
                       fwrite(buf3,1,numread/4,outfp);
               } while(numread == 32768);
 }
 else
 {
               do{
                       numread = fread(buffer,1,32768,infp);

                       j = 0;

                       for(i=0;i < (numread/2);i+=4) {
                               buffer[i] ^= 0x8000;           /* Signed -> unsigned */
                               buffer[i+1] ^= 0x8000;
                               buffer[i] >>= 8;               /* 16 bit -> 8 bit */
                               buffer[i+1] >>= 8;
                               buf3[j++] = (unsigned char)buffer[i];
                               buf3[j++] = (unsigned char)buffer[i+1];
                       }
                       fwrite(buf3,1,numread/4,outfp);
               } while(numread == 32768);
       }
}

us8_44k_mo()
{
unsigned int numread,i,j;

       buf3 = malloc(8192);

       if(us == SIGNED)
       {
               do{
                       numread = fread(buffer,1,32768,infp);

                       j = 0;

                       for(i=0;i < (numread/2);i+=2) {
                               buffer[i] /= 2;
                               buffer[i+1] /= 2;
                               buffer[i] += buffer[i+1];
                               buffer[i] >>= 8;
                               buf3[j++] = (unsigned char)buffer[i];
                       }
                       fwrite(buf3,1,numread/4,outfp);
               } while(numread == 32768);
       }
       else
       {
               do{
                       numread = fread(buffer,1,32768,infp);

                       j = 0;

                       for(i=0;i < (numread/2);i+=2) {
                               buffer[i] /= 2;
                               buffer[i+1] /= 2;
                               buffer[i] += buffer[i+1];
                               buffer[i] ^= 0x8000;
                               buffer[i] >>= 8;
                               buf3[j++] = (unsigned char)buffer[i];
                       }
                       fwrite(buf3,1,numread/4,outfp);
               } while(numread == 32768);
       }
}


us8_22k_mo(int mode)
{
unsigned int numread,i,j;

       buf3 = malloc(4096);

       if(us == SIGNED)
       {
               do{
                       numread = fread(buffer,1,32768,infp);

                       j = 0;

                       for(i=0;i < (numread/2);i+=4) {
                               buffer[i] /= 2;
                               buffer[i+1] /= 2;
                               buffer[i] += buffer[i+1];
                               buffer[i] >>= 8;
                               buf3[j++] = (unsigned char)buffer[i];
                       }
                       fwrite(buf3,1,numread/8,outfp);
               } while(numread == 32768);
       }
       else
       {
               do{
                       numread = fread(buffer,1,32768,infp);

                       j = 0;

                       for(i=0;i < (numread/2);i+=4) {
                               buffer[i] /= 2;
                               buffer[i+1] /= 2;
                               buffer[i] += buffer[i+1];
                               buffer[i] ^= 0x8000;
                               buffer[i] >>= 8;
                               buf3[j++] = (unsigned char)buffer[i];
                       }
                       fwrite(buf3,1,numread/8,outfp);
               } while(numread == 32768);
       }
}


us8_11k_mo(int mode)
{
unsigned int numread,i,j;

       buf3 = malloc(4096);

       if(us == SIGNED)
       {
               do{
                       numread = fread(buffer,1,32768,infp);

                       j = 0;

                       for(i=0;i < (numread/2);i+=8) {
                               buffer[i] /= 2;
                               buffer[i+1] /= 2;
                               buffer[i] += buffer[i+1];
                               buffer[i] >>= 8;
                               buf3[j++] = (unsigned char)buffer[i];
                       }
                       fwrite(buf3,1,numread/16,outfp);
               } while(numread == 32768);
       }
       else
       {
               do{
                       numread = fread(buffer,1,32768,infp);

                       j = 0;

                       for(i=0;i < (numread/2);i+=8) {
                               buffer[i] /= 2;
                               buffer[i+1] /= 2;
                               buffer[i] += buffer[i+1];
                               buffer[i] ^= 0x8000;
                               buffer[i] >>= 8;
                               buf3[j++] = (unsigned char)buffer[i];
                       }
                       fwrite(buf3,1,numread/16,outfp);
               } while(numread == 32768);
       }
}