/*
|
* 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;
|
}
|