home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / listings / v_02_12 / 2n12044a < prev    next >
Text File  |  1991-07-15  |  2KB  |  87 lines

  1. /*
  2.  * Listing 2: U2BIN.C
  3.  * Convert a Mu-Law encoded file to offset binary.
  4.  * Written for Turbo C 2.0, by Bob Bybee, 7/91
  5.  *
  6.  * Usage: u2bin <infile> <outfile> [expon] [clip]
  7.  *
  8.  *   infile    is Mu-Law encoded file
  9.  *   outfile   is offset binary file for TOSPKR
  10.  *   expon     is exponent for uncompression (optional)
  11.  *   clip      is clipping factor (optional)
  12.  *
  13.  * Defaults of expon = 3, clip = 5 seem to sound good.
  14.  */
  15. #include <stdio.h>
  16. #include <stdlib.h>
  17. #include <math.h>
  18.  
  19. #define DEFAULT_EXP  3.0
  20. #define DEFAULT_CLIP 5.0
  21.  
  22. int xlat[128];
  23.  
  24. void main( int ac, char **av )
  25.     {
  26.     int c_in, c_out, sign, i;
  27.     FILE *in_fp, *out_fp;
  28.     float mag, expon, clip;
  29.  
  30.     /* See if <infile> and <outfile> were given,
  31.      * open them if so.
  32.      */
  33.     --ac, ++av;
  34.     if (ac < 2)
  35.         {
  36.         printf("usage: u2bin <infile> <outfile> "
  37.             "[expon] [clip]\n");
  38.         exit(1);
  39.         }
  40.  
  41.     if ((in_fp = fopen(*av, "rb")) == NULL ||
  42.         (out_fp = fopen(av[1], "wb")) == NULL)
  43.         {
  44.         printf("can't open files!\n");
  45.         exit(1);
  46.         }
  47.  
  48.     if (ac >= 3 && (expon = atof(av[2])) > 0.0)
  49.         ;   /* use command-line exponent */
  50.     else
  51.         expon = DEFAULT_EXP;
  52.  
  53.     if (ac >= 4 && (clip = atof(av[3])) > 1.0)
  54.         ;   /* use command-line clipping */
  55.     else
  56.         clip = DEFAULT_CLIP;
  57.  
  58.     /* Create data translation table for these
  59.      * values of expon and clip.
  60.      */
  61.     for (i = 0; i <= 127; ++i)
  62.         {
  63.         mag = clip * 127.0 * pow((127 - i) / 127.0, expon);
  64.         if (mag > 127.0)
  65.             mag = 127.0;    /* clip */
  66.         xlat[i] = (int)mag;
  67.         }
  68.  
  69.     /* Read in the file and translate each byte.
  70.      */
  71.     while ((c_in = getc(in_fp)) != EOF)
  72.         {
  73.         if (c_in <= 127)
  74.             sign = 1;
  75.         else
  76.             sign = -1;
  77.  
  78.         c_out = (sign * xlat[c_in & 127]) + 127;
  79.         putc(c_out, out_fp);
  80.         }
  81.  
  82.     fclose(in_fp);
  83.     fclose(out_fp);
  84.     exit(0);
  85.     }
  86.  
  87.