fixup
[lcr.git] / libgsmfr / src / toast_audio.c
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