home *** CD-ROM | disk | FTP | other *** search
/ CD Action 16 B / cdactioncoverdisc / slam / slam.rar / WAV / WAV.C < prev    next >
C/C++ Source or Header  |  1996-05-02  |  6KB  |  302 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. struct riffHeader
  5. {
  6.     char riffId[4];
  7.     unsigned long len;
  8. };
  9.  
  10. struct waveHeader
  11. {
  12.     char waveId[4];
  13.     char fmtId[4];
  14.     unsigned long len;
  15.     unsigned short format;
  16.     unsigned short channels;
  17.     unsigned long freq;
  18.     unsigned long bps;
  19.     unsigned short blockAlign;
  20.     unsigned short fspec;
  21. };
  22.  
  23. struct dataHeader
  24. {
  25.     char dataId[4];
  26.     unsigned long dataLen;
  27. };
  28.  
  29. struct riffHeader rHead;
  30. struct waveHeader wHead;
  31. struct dataHeader dHead;
  32. int bits;
  33.  
  34. char tempName[80];
  35. char tempName2[80];
  36.  
  37. int shorten=0;
  38. int loop=0;
  39. long fadeRate=-0x80000000; /* instant cut-off */
  40.  
  41. signed short logTable[256]=
  42. {
  43.     0      ,14     ,28     ,42     ,57     ,72     ,88     ,104    ,
  44.     121    ,139    ,157    ,176    ,196    ,216    ,237    ,259    ,
  45.     282    ,305    ,329    ,354    ,380    ,407    ,435    ,464    ,
  46.     494    ,524    ,557    ,590    ,624    ,660    ,696    ,735    ,
  47.     774    ,815    ,857    ,901    ,947    ,994    ,1043   ,1093   ,
  48.     1145   ,1199   ,1256   ,1314   ,1374   ,1436   ,1501   ,1567   ,
  49.     1637   ,1708   ,1783   ,1859   ,1939   ,2021   ,2107   ,2195   ,
  50.     2287   ,2382   ,2480   ,2582   ,2687   ,2796   ,2909   ,3026   ,
  51.     3147   ,3273   ,3403   ,3538   ,3677   ,3821   ,3971   ,4126   ,
  52.     4286   ,4452   ,4625   ,4803   ,4987   ,5178   ,5376   ,5581   ,
  53.     5794   ,6014   ,6241   ,6477   ,6721   ,6974   ,7236   ,7508   ,
  54.     7789   ,8080   ,8381   ,8693   ,9016   ,9351   ,9698   ,10057  ,
  55.     10429  ,10814  ,11213  ,11626  ,12054  ,12497  ,12956  ,13431  ,
  56.     13923  ,14433  ,14961  ,15508  ,16074  ,16660  ,17267  ,17896  ,
  57.     18548  ,19222  ,19921  ,20645  ,21394  ,22170  ,22974  ,23806  ,
  58.     24668  ,25561  ,26486  ,27443  ,28435  ,29462  ,30526  ,31628  ,
  59.     -32767 ,-31628 ,-30526 ,-29462 ,-28435 ,-27443 ,-26486 ,-25561 ,
  60.     -24668 ,-23806 ,-22974 ,-22170 ,-21394 ,-20645 ,-19921 ,-19222 ,
  61.     -18548 ,-17896 ,-17267 ,-16660 ,-16074 ,-15508 ,-14961 ,-14433 ,
  62.     -13923 ,-13431 ,-12956 ,-12497 ,-12054 ,-11626 ,-11213 ,-10814 ,
  63.     -10429 ,-10057 ,-9698  ,-9351  ,-9016  ,-8693  ,-8381  ,-8080  ,
  64.     -7789  ,-7508  ,-7236  ,-6974  ,-6721  ,-6477  ,-6241  ,-6014  ,
  65.     -5794  ,-5581  ,-5376  ,-5178  ,-4987  ,-4803  ,-4625  ,-4452  ,
  66.     -4286  ,-4126  ,-3971  ,-3821  ,-3677  ,-3538  ,-3403  ,-3273  ,
  67.     -3147  ,-3026  ,-2909  ,-2796  ,-2687  ,-2582  ,-2480  ,-2382  ,
  68.     -2287  ,-2195  ,-2107  ,-2021  ,-1939  ,-1859  ,-1783  ,-1708  ,
  69.     -1637  ,-1567  ,-1501  ,-1436  ,-1374  ,-1314  ,-1256  ,-1199  ,
  70.     -1145  ,-1093  ,-1043  ,-994   ,-947   ,-901   ,-857   ,-815   ,
  71.     -774   ,-735   ,-696   ,-660   ,-624   ,-590   ,-557   ,-524   ,
  72.     -494   ,-464   ,-435   ,-407   ,-380   ,-354   ,-329   ,-305   ,
  73.     -282   ,-259   ,-237   ,-216   ,-196   ,-176   ,-157   ,-139   ,
  74.     -121   ,-104   ,-88    ,-72    ,-57    ,-42    ,-28    ,-14
  75. };
  76.  
  77. unsigned char tempTable[65536];
  78.  
  79. void BuildTable(void)
  80. {
  81.     int i,j,k,q,l,n;
  82.     signed short p;
  83.     FILE *stream;
  84.  
  85.     stream=fopen("temptab.dat","rb");
  86.     if(stream)
  87.     {
  88.         fread(tempTable,1,65536,stream);
  89.         fclose(stream);
  90.         return;
  91.     }
  92.  
  93.     for(j=0;j<65536;j++)
  94.     {
  95.         int a,b,c,d;
  96.  
  97.         p=(signed short)(j&0xFFFF);
  98.         q=p;
  99.  
  100.         for(i=0;i<256;i++)
  101.         {
  102.             d=q-logTable[i];
  103.             if(d<0) d=-d;
  104.  
  105.             if(i==0 || d<b)
  106.             {
  107.                 b=d;
  108.                 a=i;
  109.             }
  110.         }
  111.  
  112.         tempTable[j]=a;
  113.     }
  114.  
  115.     stream=fopen("temptab.dat","wb");
  116.     if(stream)
  117.     {
  118.         fwrite(tempTable,1,65536,stream);
  119.         fclose(stream);
  120.     }
  121. }
  122.  
  123.  
  124. void ParseCmd(int argc, char **argv)
  125. {
  126.     int i;
  127.  
  128.     for(i=2;i<argc;i++)
  129.     {
  130.         if(argv[i][0]=='-')
  131.         {
  132.             if(!stricmp(argv[i]+1,"shorten"))
  133.             {
  134.                 shorten=atoi(argv[i+1]);
  135.                 i++;
  136.             }
  137.             else if(!stricmp(argv[i]+1,"loop"))
  138.             {
  139.                 loop=1;
  140.             }
  141.             else if(!stricmp(argv[i]+1,"fade"))
  142.             {
  143.                 fadeRate=atoi(argv[i+1]);
  144.                 i++;
  145.             }
  146.             else
  147.             {
  148.                 printf("Invalid argument: %s\n",argv[i]);
  149.                 exit(1);
  150.             }
  151.         }
  152.     }
  153. }
  154.  
  155. void main(int argc,char **argv)
  156. {
  157.     FILE *in,*out,*out2;
  158.     int i,j;
  159.     unsigned long hi;
  160.     signed char lo;
  161.  
  162.     BuildTable();
  163.  
  164.     ParseCmd(argc,argv);
  165.  
  166.  
  167.     in=fopen(argv[1],"rb");
  168.     if(!in) exit(1);
  169.  
  170.     for(i=0;argv[1][i];i++)
  171.     {
  172.         if(i==':') break;
  173.     }
  174.     if(!argv[1][i]) i=0;
  175.     else i++;
  176.     j=0;
  177.     for(;argv[1][i] && argv[1][i]!='.';i++)
  178.     {
  179.         tempName[j++]=argv[1][i];
  180.     }
  181.     tempName[j]=0;
  182.  
  183.  
  184.     sprintf(tempName2,"%s.08",tempName);
  185.  
  186.     out=fopen(tempName2,"wb");
  187.     if(!out)
  188.     {
  189.         printf("can't open output for 8-bit\n");
  190.         exit(1);
  191.     }
  192.  
  193.     sprintf(tempName2,"%s.16",tempName);
  194.     out2=fopen(tempName2,"wb");
  195.     if(!out)
  196.     {
  197.         printf("can't open output for 16-bit\n");
  198.         exit(1);
  199.     }
  200.  
  201.     fread(&rHead,1,sizeof(struct riffHeader),in);
  202.  
  203.     if(rHead.riffId[0]!='R' ||
  204.        rHead.riffId[1]!='I' ||
  205.        rHead.riffId[2]!='F' ||
  206.        rHead.riffId[3]!='F')
  207.     {
  208.         printf("Not a RIFF file\n");
  209.         exit(1);
  210.     }
  211.  
  212.     fread(&wHead,1,sizeof(struct waveHeader),in);
  213.  
  214.     if(wHead.waveId[0]!='W' ||
  215.        wHead.waveId[1]!='A' ||
  216.        wHead.waveId[2]!='V' ||
  217.        wHead.waveId[3]!='E')
  218.     {
  219.         printf("Not a WAVE file\n");
  220.         exit(1);
  221.     }
  222.  
  223.     printf("Format      : %04x\n",wHead.format);
  224.     printf("Channels    : %d\n",wHead.channels);
  225.     printf("Freq        : %d\n",wHead.freq);
  226.     printf("BPS         : %d\n",wHead.bps);
  227.     printf("Block align : %d\n",wHead.blockAlign);
  228.     printf("Format-spec : %04x\n",wHead.fspec);
  229.  
  230.     if(wHead.format!=1)
  231.     {
  232.         printf("Unknown format\n");
  233.         exit(1);
  234.     }
  235.  
  236.     bits=(wHead.blockAlign * 8);
  237.     printf("%d bits per sample\n",bits);
  238.  
  239.     fread(&dHead,1,sizeof(struct dataHeader),in);
  240.     if(dHead.dataId[0]!='d' ||
  241.        dHead.dataId[1]!='a' ||
  242.        dHead.dataId[2]!='t' ||
  243.        dHead.dataId[3]!='a')
  244.     {
  245.         printf("Invalid DATA header\n");
  246.         exit(1);
  247.     }
  248.  
  249.     fwrite("BS08",1,4,out);
  250.     fwrite("BS16",1,4,out2);
  251.  
  252.     i=dHead.dataLen/wHead.blockAlign;
  253.     fwrite(&i,1,4,out);
  254.     fwrite(&i,1,4,out2);
  255.  
  256.     i=0;
  257.     fwrite(&i,1,4,out);
  258.     fwrite(&i,1,4,out2);
  259.  
  260.     if(!loop)
  261.     {
  262.         i=0;
  263.         fwrite(&i,1,4,out);
  264.         fwrite(&i,1,4,out2);
  265.     }
  266.     else
  267.     {
  268.         i=dHead.dataLen/wHead.blockAlign;
  269.         fwrite(&i,1,4,out);
  270.         fwrite(&i,1,4,out2);
  271.     }
  272.     fwrite(&wHead.freq,1,4,out);
  273.     fwrite(&wHead.freq,1,4,out2);
  274.  
  275.     fwrite(&fadeRate,1,4,out);
  276.     fwrite(&fadeRate,1,4,out2);
  277.  
  278.     for(i=0;i<dHead.dataLen-(shorten * wHead.blockAlign);i+=wHead.blockAlign)
  279.     {
  280.         if(bits==8)
  281.         {
  282.             j=fgetc(in);
  283.             hi=((unsigned long)j)<<8;
  284.             lo=j;
  285.         }
  286.         else
  287.         {
  288.             j=fgetc(in); j+=fgetc(in)<<8;
  289.             hi=j;
  290.             lo=j>>8;
  291.         }
  292.  
  293.         fputc(lo,out);
  294.         fputc(tempTable[hi],out2);
  295.     }
  296.  
  297.     fclose(out);
  298.     fclose(out2);
  299.     fclose(in);
  300. }
  301.  
  302.