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