Logo Search packages:      
Sourcecode: libgsm version File versions

toast_audio.c

/*
 * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
 * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
 * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
 */

/* $Header: /tmp_amd/presto/export/kbs/jutta/src/gsm/RCS/toast_audio.c,v 1.6 1995/03/07 21:21:24 jutta Exp $ */

#include    "toast.h"

/*  toast_audio -- functions to manipulate SunOS audio files.
 *
 *  This is reverse engineered from our present soundfiles
 *  and in no way portable, durable or aesthetically pleasing.
 */

extern FILE * in,         * out;
extern char * inname;
extern char * progname;

extern int  (*output) P((gsm_signal *)),
            (*input ) P((gsm_signal *));

extern int  alaw_input   P((gsm_signal *)),
            ulaw_input   P((gsm_signal *)),
            linear_input P((gsm_signal *));

extern int  ulaw_output P((gsm_signal *));

static int put_u32 P2((f, u), FILE * f, unsigned long u)
{
      /*  Write a 32-bit unsigned value msb first. 
       */
      if (  putc( (char)((u>>24) & 0x0FF), f) == EOF
         || putc( (char)((u>>16) & 0x0FF), f) == EOF
         || putc( (char)((u>> 8) & 0x0FF), f) == EOF
         || putc( (char)( u      & 0x0FF), f) == EOF) return -1;

      return 0;
}

static int get_u32 P2((f, up), FILE * f, unsigned long * up)
{
      /*  Read a 32-bit unsigned value msb first.
       */
      int         i;
      unsigned long     u;

      if (                                (i = getc(f)) == EOF
         || ((u =        (unsigned char)i), (i = getc(f)) == EOF)
         || ((u = (u<<8)|(unsigned char)i), (i = getc(f)) == EOF)
         || ((u = (u<<8)|(unsigned char)i), (i = getc(f)) == EOF)) return -1;
      *up =           (u<<8)|(unsigned char)i;
      return 0;
}

int audio_init_input P0()
{
      unsigned long     len, enc;   /* unsigned 32 bits     */

      if (  fgetc(in) != '.' 
         || fgetc(in) != 's'
         || fgetc(in) != 'n'
         || fgetc(in) != 'd'
         || get_u32( in, &len )
         || get_u32( in, &enc )     /* skip this */
         || get_u32( in, &enc )) {
            fprintf(stderr, 
      "%s: bad (missing?) header in Sun audio file \"%s\";\n\
      Try one of -u, -a, -l instead (%s -h for help).\n",
                  progname, inname ? inname : "stdin", progname);
            return -1;
      }

      switch (enc) {
      case 1:     input = ulaw_input;     break;
      case 2: input = alaw_input;   break;
      case 3: input = linear_input;       break;
      default:
            fprintf(stderr,
"%s: warning: file format #%lu for %s not implemented, defaulting to u-law.\n",
                  progname, enc, inname);
            input = ulaw_input;
            break;
      }

      while (len > 4*4)
            if (getc(in) == EOF) {
                  fprintf(stderr, 
                  "%s: EOF in header of Sun audio file \"%s\";\n\
                  Try one of -u, -a, -l instead (%s -h for help).\n",
                        progname, inname ? inname : "stdin", progname);
                  return -1;
            }
            else len--;

      return 0;
}

int audio_init_output P0()
{
      if (  fputs(".snd", out) == EOF
         || put_u32(out, 32)
         || put_u32(out, ~(unsigned long)0)
         || put_u32(out, 1)
         || put_u32(out, 8000)
         || put_u32(out, 1)
         || put_u32(out, 0)
         || put_u32(out, 0)) return -1;

      return 0;
}


Generated by  Doxygen 1.6.0   Back to index