1 /*****************************************************************************\
5 **---------------------------------------------------------------------------**
6 ** Copyright: Andreas Eversberg **
8 ** audio conversions for alaw and ulaw **
10 \*****************************************************************************/
12 signed int *audio_law_to_s32;
13 unsigned char silence;
15 /* ulaw -> signed 16-bit */
16 static signed int audio_ulaw_to_s32[] =
18 0xffff8284, 0xffff8684, 0xffff8a84, 0xffff8e84,
19 0xffff9284, 0xffff9684, 0xffff9a84, 0xffff9e84,
20 0xffffa284, 0xffffa684, 0xffffaa84, 0xffffae84,
21 0xffffb284, 0xffffb684, 0xffffba84, 0xffffbe84,
22 0xffffc184, 0xffffc384, 0xffffc584, 0xffffc784,
23 0xffffc984, 0xffffcb84, 0xffffcd84, 0xffffcf84,
24 0xffffd184, 0xffffd384, 0xffffd584, 0xffffd784,
25 0xffffd984, 0xffffdb84, 0xffffdd84, 0xffffdf84,
26 0xffffe104, 0xffffe204, 0xffffe304, 0xffffe404,
27 0xffffe504, 0xffffe604, 0xffffe704, 0xffffe804,
28 0xffffe904, 0xffffea04, 0xffffeb04, 0xffffec04,
29 0xffffed04, 0xffffee04, 0xffffef04, 0xfffff004,
30 0xfffff0c4, 0xfffff144, 0xfffff1c4, 0xfffff244,
31 0xfffff2c4, 0xfffff344, 0xfffff3c4, 0xfffff444,
32 0xfffff4c4, 0xfffff544, 0xfffff5c4, 0xfffff644,
33 0xfffff6c4, 0xfffff744, 0xfffff7c4, 0xfffff844,
34 0xfffff8a4, 0xfffff8e4, 0xfffff924, 0xfffff964,
35 0xfffff9a4, 0xfffff9e4, 0xfffffa24, 0xfffffa64,
36 0xfffffaa4, 0xfffffae4, 0xfffffb24, 0xfffffb64,
37 0xfffffba4, 0xfffffbe4, 0xfffffc24, 0xfffffc64,
38 0xfffffc94, 0xfffffcb4, 0xfffffcd4, 0xfffffcf4,
39 0xfffffd14, 0xfffffd34, 0xfffffd54, 0xfffffd74,
40 0xfffffd94, 0xfffffdb4, 0xfffffdd4, 0xfffffdf4,
41 0xfffffe14, 0xfffffe34, 0xfffffe54, 0xfffffe74,
42 0xfffffe8c, 0xfffffe9c, 0xfffffeac, 0xfffffebc,
43 0xfffffecc, 0xfffffedc, 0xfffffeec, 0xfffffefc,
44 0xffffff0c, 0xffffff1c, 0xffffff2c, 0xffffff3c,
45 0xffffff4c, 0xffffff5c, 0xffffff6c, 0xffffff7c,
46 0xffffff88, 0xffffff90, 0xffffff98, 0xffffffa0,
47 0xffffffa8, 0xffffffb0, 0xffffffb8, 0xffffffc0,
48 0xffffffc8, 0xffffffd0, 0xffffffd8, 0xffffffe0,
49 0xffffffe8, 0xfffffff0, 0xfffffff8, 0xffffffff,
50 0x00007d7c, 0x0000797c, 0x0000757c, 0x0000717c,
51 0x00006d7c, 0x0000697c, 0x0000657c, 0x0000617c,
52 0x00005d7c, 0x0000597c, 0x0000557c, 0x0000517c,
53 0x00004d7c, 0x0000497c, 0x0000457c, 0x0000417c,
54 0x00003e7c, 0x00003c7c, 0x00003a7c, 0x0000387c,
55 0x0000367c, 0x0000347c, 0x0000327c, 0x0000307c,
56 0x00002e7c, 0x00002c7c, 0x00002a7c, 0x0000287c,
57 0x0000267c, 0x0000247c, 0x0000227c, 0x0000207c,
58 0x00001efc, 0x00001dfc, 0x00001cfc, 0x00001bfc,
59 0x00001afc, 0x000019fc, 0x000018fc, 0x000017fc,
60 0x000016fc, 0x000015fc, 0x000014fc, 0x000013fc,
61 0x000012fc, 0x000011fc, 0x000010fc, 0x00000ffc,
62 0x00000f3c, 0x00000ebc, 0x00000e3c, 0x00000dbc,
63 0x00000d3c, 0x00000cbc, 0x00000c3c, 0x00000bbc,
64 0x00000b3c, 0x00000abc, 0x00000a3c, 0x000009bc,
65 0x0000093c, 0x000008bc, 0x0000083c, 0x000007bc,
66 0x0000075c, 0x0000071c, 0x000006dc, 0x0000069c,
67 0x0000065c, 0x0000061c, 0x000005dc, 0x0000059c,
68 0x0000055c, 0x0000051c, 0x000004dc, 0x0000049c,
69 0x0000045c, 0x0000041c, 0x000003dc, 0x0000039c,
70 0x0000036c, 0x0000034c, 0x0000032c, 0x0000030c,
71 0x000002ec, 0x000002cc, 0x000002ac, 0x0000028c,
72 0x0000026c, 0x0000024c, 0x0000022c, 0x0000020c,
73 0x000001ec, 0x000001cc, 0x000001ac, 0x0000018c,
74 0x00000174, 0x00000164, 0x00000154, 0x00000144,
75 0x00000134, 0x00000124, 0x00000114, 0x00000104,
76 0x000000f4, 0x000000e4, 0x000000d4, 0x000000c4,
77 0x000000b4, 0x000000a4, 0x00000094, 0x00000084,
78 0x00000078, 0x00000070, 0x00000068, 0x00000060,
79 0x00000058, 0x00000050, 0x00000048, 0x00000040,
80 0x00000038, 0x00000030, 0x00000028, 0x00000020,
81 0x00000018, 0x00000010, 0x00000008, 0x00000000
84 /* alaw -> signed 16-bit */
85 static signed int audio_alaw_to_s32[] =
87 0x000013fc, 0xffffec04, 0x00000144, 0xfffffebc,
88 0x0000517c, 0xffffae84, 0x0000051c, 0xfffffae4,
89 0x00000a3c, 0xfffff5c4, 0x00000048, 0xffffffb8,
90 0x0000287c, 0xffffd784, 0x0000028c, 0xfffffd74,
91 0x00001bfc, 0xffffe404, 0x000001cc, 0xfffffe34,
92 0x0000717c, 0xffff8e84, 0x0000071c, 0xfffff8e4,
93 0x00000e3c, 0xfffff1c4, 0x000000c4, 0xffffff3c,
94 0x0000387c, 0xffffc784, 0x0000039c, 0xfffffc64,
95 0x00000ffc, 0xfffff004, 0x00000104, 0xfffffefc,
96 0x0000417c, 0xffffbe84, 0x0000041c, 0xfffffbe4,
97 0x0000083c, 0xfffff7c4, 0x00000008, 0xfffffff8,
98 0x0000207c, 0xffffdf84, 0x0000020c, 0xfffffdf4,
99 0x000017fc, 0xffffe804, 0x0000018c, 0xfffffe74,
100 0x0000617c, 0xffff9e84, 0x0000061c, 0xfffff9e4,
101 0x00000c3c, 0xfffff3c4, 0x00000084, 0xffffff7c,
102 0x0000307c, 0xffffcf84, 0x0000030c, 0xfffffcf4,
103 0x000015fc, 0xffffea04, 0x00000164, 0xfffffe9c,
104 0x0000597c, 0xffffa684, 0x0000059c, 0xfffffa64,
105 0x00000b3c, 0xfffff4c4, 0x00000068, 0xffffff98,
106 0x00002c7c, 0xffffd384, 0x000002cc, 0xfffffd34,
107 0x00001dfc, 0xffffe204, 0x000001ec, 0xfffffe14,
108 0x0000797c, 0xffff8684, 0x000007bc, 0xfffff844,
109 0x00000f3c, 0xfffff0c4, 0x000000e4, 0xffffff1c,
110 0x00003c7c, 0xffffc384, 0x000003dc, 0xfffffc24,
111 0x000011fc, 0xffffee04, 0x00000124, 0xfffffedc,
112 0x0000497c, 0xffffb684, 0x0000049c, 0xfffffb64,
113 0x0000093c, 0xfffff6c4, 0x00000028, 0xffffffd8,
114 0x0000247c, 0xffffdb84, 0x0000024c, 0xfffffdb4,
115 0x000019fc, 0xffffe604, 0x000001ac, 0xfffffe54,
116 0x0000697c, 0xffff9684, 0x0000069c, 0xfffff964,
117 0x00000d3c, 0xfffff2c4, 0x000000a4, 0xffffff5c,
118 0x0000347c, 0xffffcb84, 0x0000034c, 0xfffffcb4,
119 0x000012fc, 0xffffed04, 0x00000134, 0xfffffecc,
120 0x00004d7c, 0xffffb284, 0x000004dc, 0xfffffb24,
121 0x000009bc, 0xfffff644, 0x00000038, 0xffffffc8,
122 0x0000267c, 0xffffd984, 0x0000026c, 0xfffffd94,
123 0x00001afc, 0xffffe504, 0x000001ac, 0xfffffe54,
124 0x00006d7c, 0xffff9284, 0x000006dc, 0xfffff924,
125 0x00000dbc, 0xfffff244, 0x000000b4, 0xffffff4c,
126 0x0000367c, 0xffffc984, 0x0000036c, 0xfffffc94,
127 0x00000f3c, 0xfffff0c4, 0x000000f4, 0xffffff0c,
128 0x00003e7c, 0xffffc184, 0x000003dc, 0xfffffc24,
129 0x000007bc, 0xfffff844, 0x00000008, 0xfffffff8,
130 0x00001efc, 0xffffe104, 0x000001ec, 0xfffffe14,
131 0x000016fc, 0xffffe904, 0x00000174, 0xfffffe8c,
132 0x00005d7c, 0xffffa284, 0x000005dc, 0xfffffa24,
133 0x00000bbc, 0xfffff444, 0x00000078, 0xffffff88,
134 0x00002e7c, 0xffffd184, 0x000002ec, 0xfffffd14,
135 0x000014fc, 0xffffeb04, 0x00000154, 0xfffffeac,
136 0x0000557c, 0xffffaa84, 0x0000055c, 0xfffffaa4,
137 0x00000abc, 0xfffff544, 0x00000058, 0xffffffa8,
138 0x00002a7c, 0xffffd584, 0x000002ac, 0xfffffd54,
139 0x00001cfc, 0xffffe304, 0x000001cc, 0xfffffe34,
140 0x0000757c, 0xffff8a84, 0x0000075c, 0xfffff8a4,
141 0x00000ebc, 0xfffff144, 0x000000d4, 0xffffff2c,
142 0x00003a7c, 0xffffc584, 0x0000039c, 0xfffffc64,
143 0x000010fc, 0xffffef04, 0x00000114, 0xfffffeec,
144 0x0000457c, 0xffffba84, 0x0000045c, 0xfffffba4,
145 0x000008bc, 0xfffff744, 0x00000018, 0xffffffe8,
146 0x0000227c, 0xffffdd84, 0x0000022c, 0xfffffdd4,
147 0x000018fc, 0xffffe704, 0x0000018c, 0xfffffe74,
148 0x0000657c, 0xffff9a84, 0x0000065c, 0xfffff9a4,
149 0x00000cbc, 0xfffff344, 0x00000094, 0xffffff6c,
150 0x0000327c, 0xffffcd84, 0x0000032c, 0xfffffcd4
153 /* signed 16-bit -> Xlaw */
154 unsigned char audio_s16_to_law[65536];
157 /* table is used to generate s16_to_alaw */
158 static short audio_alaw_relations[] =
160 0x8684, 0x55, 0x8a84, 0xd5, 0x8e84, 0x15, 0x9284, 0x95,
161 0x9684, 0x75, 0x9a84, 0xf5, 0x9e84, 0x35, 0xa284, 0xb5,
162 0xa684, 0x45, 0xaa84, 0xc5, 0xae84, 0x05, 0xb284, 0x85,
163 0xb684, 0x65, 0xba84, 0xe5, 0xbe84, 0x25, 0xc184, 0xa5,
164 0xc384, 0x5d, 0xc584, 0xdd, 0xc784, 0x1d, 0xc984, 0x9d,
165 0xcb84, 0x7d, 0xcd84, 0xfd, 0xcf84, 0x3d, 0xd184, 0xbd,
166 0xd384, 0x4d, 0xd584, 0xcd, 0xd784, 0x0d, 0xd984, 0x8d,
167 0xdb84, 0x6d, 0xdd84, 0xed, 0xdf84, 0x2d, 0xe104, 0xad,
168 0xe204, 0x51, 0xe304, 0xd1, 0xe404, 0x11, 0xe504, 0x91,
169 0xe604, 0x71, 0xe704, 0xf1, 0xe804, 0x31, 0xe904, 0xb1,
170 0xea04, 0x41, 0xeb04, 0xc1, 0xec04, 0x01, 0xed04, 0x81,
171 0xee04, 0x61, 0xef04, 0xe1, 0xf004, 0x21, 0xf0c4, 0x59,
172 0xf0c4, 0xa1, 0xf144, 0xd9, 0xf1c4, 0x19, 0xf244, 0x99,
173 0xf2c4, 0x79, 0xf344, 0xf9, 0xf3c4, 0x39, 0xf444, 0xb9,
174 0xf4c4, 0x49, 0xf544, 0xc9, 0xf5c4, 0x09, 0xf644, 0x89,
175 0xf6c4, 0x69, 0xf744, 0xe9, 0xf7c4, 0x29, 0xf844, 0x57,
176 0xf844, 0xa9, 0xf8a4, 0xd7, 0xf8e4, 0x17, 0xf924, 0x97,
177 0xf964, 0x77, 0xf9a4, 0xf7, 0xf9e4, 0x37, 0xfa24, 0xb7,
178 0xfa64, 0x47, 0xfaa4, 0xc7, 0xfae4, 0x07, 0xfb24, 0x87,
179 0xfb64, 0x67, 0xfba4, 0xe7, 0xfbe4, 0x27, 0xfc24, 0x5f,
180 0xfc24, 0xa7, 0xfc64, 0x1f, 0xfc64, 0xdf, 0xfc94, 0x9f,
181 0xfcb4, 0x7f, 0xfcd4, 0xff, 0xfcf4, 0x3f, 0xfd14, 0xbf,
182 0xfd34, 0x4f, 0xfd54, 0xcf, 0xfd74, 0x0f, 0xfd94, 0x8f,
183 0xfdb4, 0x6f, 0xfdd4, 0xef, 0xfdf4, 0x2f, 0xfe14, 0x53,
184 0xfe14, 0xaf, 0xfe34, 0x13, 0xfe34, 0xd3, 0xfe54, 0x73,
185 0xfe54, 0x93, 0xfe74, 0x33, 0xfe74, 0xf3, 0xfe8c, 0xb3,
186 0xfe9c, 0x43, 0xfeac, 0xc3, 0xfebc, 0x03, 0xfecc, 0x83,
187 0xfedc, 0x63, 0xfeec, 0xe3, 0xfefc, 0x23, 0xff0c, 0xa3,
188 0xff1c, 0x5b, 0xff2c, 0xdb, 0xff3c, 0x1b, 0xff4c, 0x9b,
189 0xff5c, 0x7b, 0xff6c, 0xfb, 0xff7c, 0x3b, 0xff88, 0xbb,
190 0xff98, 0x4b, 0xffa8, 0xcb, 0xffb8, 0x0b, 0xffc8, 0x8b,
191 0xffd8, 0x6b, 0xffe8, 0xeb, 0xfff8, 0x2b, 0xfff8, 0xab,
192 0x0008, 0x2a, 0x0008, 0xaa, 0x0018, 0xea, 0x0028, 0x6a,
193 0x0038, 0x8a, 0x0048, 0x0a, 0x0058, 0xca, 0x0068, 0x4a,
194 0x0078, 0xba, 0x0084, 0x3a, 0x0094, 0xfa, 0x00a4, 0x7a,
195 0x00b4, 0x9a, 0x00c4, 0x1a, 0x00d4, 0xda, 0x00e4, 0x5a,
196 0x00f4, 0xa2, 0x0104, 0x22, 0x0114, 0xe2, 0x0124, 0x62,
197 0x0134, 0x82, 0x0144, 0x02, 0x0154, 0xc2, 0x0164, 0x42,
198 0x0174, 0xb2, 0x018c, 0x32, 0x018c, 0xf2, 0x01ac, 0x72,
199 0x01ac, 0x92, 0x01cc, 0x12, 0x01cc, 0xd2, 0x01ec, 0x52,
200 0x01ec, 0xae, 0x020c, 0x2e, 0x022c, 0xee, 0x024c, 0x6e,
201 0x026c, 0x8e, 0x028c, 0x0e, 0x02ac, 0xce, 0x02cc, 0x4e,
202 0x02ec, 0xbe, 0x030c, 0x3e, 0x032c, 0xfe, 0x034c, 0x7e,
203 0x036c, 0x9e, 0x039c, 0x1e, 0x039c, 0xde, 0x03dc, 0x5e,
204 0x03dc, 0xa6, 0x041c, 0x26, 0x045c, 0xe6, 0x049c, 0x66,
205 0x04dc, 0x86, 0x051c, 0x06, 0x055c, 0xc6, 0x059c, 0x46,
206 0x05dc, 0xb6, 0x061c, 0x36, 0x065c, 0xf6, 0x069c, 0x76,
207 0x06dc, 0x96, 0x071c, 0x16, 0x075c, 0xd6, 0x07bc, 0x56,
208 0x07bc, 0xa8, 0x083c, 0x28, 0x08bc, 0xe8, 0x093c, 0x68,
209 0x09bc, 0x88, 0x0a3c, 0x08, 0x0abc, 0xc8, 0x0b3c, 0x48,
210 0x0bbc, 0xb8, 0x0c3c, 0x38, 0x0cbc, 0xf8, 0x0d3c, 0x78,
211 0x0dbc, 0x98, 0x0e3c, 0x18, 0x0ebc, 0xd8, 0x0f3c, 0x58,
212 0x0f3c, 0xa0, 0x0ffc, 0x20, 0x10fc, 0xe0, 0x11fc, 0x60,
213 0x12fc, 0x80, 0x13fc, 0x00, 0x14fc, 0xc0, 0x15fc, 0x40,
214 0x16fc, 0xb0, 0x17fc, 0x30, 0x18fc, 0xf0, 0x19fc, 0x70,
215 0x1afc, 0x90, 0x1bfc, 0x10, 0x1cfc, 0xd0, 0x1dfc, 0x50,
216 0x1efc, 0xac, 0x207c, 0x2c, 0x227c, 0xec, 0x247c, 0x6c,
217 0x267c, 0x8c, 0x287c, 0x0c, 0x2a7c, 0xcc, 0x2c7c, 0x4c,
218 0x2e7c, 0xbc, 0x307c, 0x3c, 0x327c, 0xfc, 0x347c, 0x7c,
219 0x367c, 0x9c, 0x387c, 0x1c, 0x3a7c, 0xdc, 0x3c7c, 0x5c,
220 0x3e7c, 0xa4, 0x417c, 0x24, 0x457c, 0xe4, 0x497c, 0x64,
221 0x4d7c, 0x84, 0x517c, 0x04, 0x557c, 0xc4, 0x597c, 0x44,
222 0x5d7c, 0xb4, 0x617c, 0x34, 0x657c, 0xf4, 0x697c, 0x74,
223 0x6d7c, 0x94, 0x717c, 0x14, 0x757c, 0xd4, 0x797c, 0x54
226 /* generate tables for conversion of s16 to alaw/ulaw
228 void generate_tables(char law)
234 audio_law_to_s32=audio_alaw_to_s32;
235 /* generating alaw-table */
238 if (i-32768 > audio_alaw_relations[j<<1])
242 audio_s16_to_law[(i-32768) & 0xffff]
243 = audio_alaw_relations[(j<<1)|1];
248 audio_law_to_s32=audio_ulaw_to_s32;
249 /* generating ulaw-table */
252 if (i-32768 > audio_ulaw_to_s32[j])
254 audio_s16_to_law[(i-32768) & 0xffff] = j;
259 if (i-0x32768 > audio_ulaw_to_s32[j])
261 audio_s16_to_law[(i-32768) & 0xffff] = j;