huangcm
2025-04-26 2868c607307b8de19383692485d1cbe1b64eb94d
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
/*
 * 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;
}