|
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 |