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 114