diff options
Diffstat (limited to 'third_party/gsm/src/toast_audio.c')
-rw-r--r-- | third_party/gsm/src/toast_audio.c | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/third_party/gsm/src/toast_audio.c b/third_party/gsm/src/toast_audio.c new file mode 100644 index 00000000..f090f231 --- /dev/null +++ b/third_party/gsm/src/toast_audio.c @@ -0,0 +1,113 @@ +/* + * 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; +} + |