Tristan Matthews | 0a329cc | 2013-07-17 13:20:14 -0400 | [diff] [blame] | 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 | |