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