home *** CD-ROM | disk | FTP | other *** search
/ Dream 52 / Amiga_Dream_52.iso / Amiga / Workbench / Archivers / gsmPPC.lha / gsmPPC / src / toast_audio.c < prev    next >
C/C++ Source or Header  |  1998-04-27  |  3KB  |  114 lines

  1. /*
  2.  * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
  3.  * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
  4.  * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
  5.  */
  6.  
  7. /* $Header: /tmp_amd/presto/export/kbs/jutta/src/gsm/RCS/toast_audio.c,v 1.6 1995/03/07 21:21:24 jutta Exp $ */
  8.  
  9. #include    "toast.h"
  10.  
  11. /*  toast_audio -- functions to manipulate SunOS audio files.
  12.  *
  13.  *  This is reverse engineered from our present soundfiles
  14.  *  and in no way portable, durable or aesthetically pleasing.
  15.  */
  16.  
  17. extern FILE    * in,       * out;
  18. extern char    * inname;
  19. extern char    * progname;
  20.  
  21. extern int    (*output) P((gsm_signal *)),
  22.         (*input ) P((gsm_signal *));
  23.  
  24. extern int    alaw_input   P((gsm_signal *)),
  25.         ulaw_input   P((gsm_signal *)),
  26.         linear_input P((gsm_signal *));
  27.  
  28. extern int    ulaw_output P((gsm_signal *));
  29.  
  30. static int put_u32 P2((f, u), FILE * f, unsigned long u)
  31. {
  32.     /*  Write a 32-bit unsigned value msb first. 
  33.      */
  34.     if (  putc( (char)((u>>24) & 0x0FF), f) == EOF
  35.        || putc( (char)((u>>16) & 0x0FF), f) == EOF
  36.        || putc( (char)((u>> 8) & 0x0FF), f) == EOF
  37.        || putc( (char)( u      & 0x0FF), f) == EOF) return -1;
  38.  
  39.     return 0;
  40. }
  41.  
  42. static int get_u32 P2((f, up), FILE * f, unsigned long * up)
  43. {
  44.     /*  Read a 32-bit unsigned value msb first.
  45.      */
  46.     int        i;
  47.     unsigned long     u;
  48.  
  49.     if (                        (i = getc(f)) == EOF
  50.        || ((u =        (unsigned char)i), (i = getc(f)) == EOF)
  51.        || ((u = (u<<8)|(unsigned char)i), (i = getc(f)) == EOF)
  52.        || ((u = (u<<8)|(unsigned char)i), (i = getc(f)) == EOF)) return -1;
  53.     *up =         (u<<8)|(unsigned char)i;
  54.     return 0;
  55. }
  56.  
  57. int audio_init_input P0()
  58. {
  59.     unsigned long    len, enc;    /* unsigned 32 bits    */
  60.  
  61.     if (  fgetc(in) != '.' 
  62.        || fgetc(in) != 's'
  63.        || fgetc(in) != 'n'
  64.        || fgetc(in) != 'd'
  65.        || get_u32( in, &len )
  66.        || get_u32( in, &enc )    /* skip this */
  67.        || get_u32( in, &enc )) {
  68.         fprintf(stderr, 
  69.     "%s: bad (missing?) header in Sun audio file \"%s\";\n\
  70.     Try one of -u, -a, -l instead (%s -h for help).\n",
  71.             progname, inname ? inname : "stdin", progname);
  72.         return -1;
  73.     }
  74.  
  75.     switch (enc) {
  76.     case 1:    input = ulaw_input;      break;
  77.     case 2: input = alaw_input;      break;
  78.     case 3: input = linear_input;     break;
  79.     default:
  80.         fprintf(stderr,
  81. "%s: warning: file format #%lu for %s not implemented, defaulting to u-law.\n",
  82.             progname, enc, inname);
  83.         input = ulaw_input;
  84.         break;
  85.     }
  86.  
  87.     while (len > 4*4)
  88.         if (getc(in) == EOF) {
  89.             fprintf(stderr, 
  90.             "%s: EOF in header of Sun audio file \"%s\";\n\
  91.             Try one of -u, -a, -l instead (%s -h for help).\n",
  92.                 progname, inname ? inname : "stdin", progname);
  93.             return -1;
  94.         }
  95.         else len--;
  96.  
  97.     return 0;
  98. }
  99.  
  100. int audio_init_output P0()
  101. {
  102.     if (  fputs(".snd", out) == EOF
  103.        || put_u32(out, 32)
  104.        || put_u32(out, ~(unsigned long)0)
  105.        || put_u32(out, 1)
  106.        || put_u32(out, 8000)
  107.        || put_u32(out, 1)
  108.        || put_u32(out, 0)
  109.        || put_u32(out, 0)) return -1;
  110.  
  111.     return 0;
  112. }
  113.  
  114.