xref: /openbsd-src/sys/dev/mulaw.c (revision 43003dfe3ad45d1698bed8a37f2b0f5b14f20d4f)
1 /*	$OpenBSD: mulaw.c,v 1.14 2007/10/23 19:54:36 jakemsr Exp $ */
2 /*	$NetBSD: mulaw.c,v 1.15 2001/01/18 20:28:20 jdolecek Exp $	*/
3 
4 /*
5  * Copyright (c) 1991-1993 Regents of the University of California.
6  * All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  * 3. All advertising materials mentioning features or use of this software
17  *    must display the following acknowledgement:
18  *	This product includes software developed by the Computer Systems
19  *	Engineering Group at Lawrence Berkeley Laboratory.
20  * 4. Neither the name of the University nor of the Laboratory may be used
21  *    to endorse or promote products derived from this software without
22  *    specific prior written permission.
23  *
24  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
25  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
28  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
30  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34  * SUCH DAMAGE.
35  *
36  */
37 
38 #include <sys/types.h>
39 #include <sys/audioio.h>
40 #include <dev/mulaw.h>
41 
42 /*
43  * This table converts a (8 bit) mu-law value two a 16 bit value.
44  * The 16 bits are represented as an array of two bytes for easier access
45  * to the individual bytes.
46  */
47 static const u_char mulawtolin16[256][2] = {
48 	{0x02,0x84}, {0x06,0x84}, {0x0a,0x84}, {0x0e,0x84},
49 	{0x12,0x84}, {0x16,0x84}, {0x1a,0x84}, {0x1e,0x84},
50 	{0x22,0x84}, {0x26,0x84}, {0x2a,0x84}, {0x2e,0x84},
51 	{0x32,0x84}, {0x36,0x84}, {0x3a,0x84}, {0x3e,0x84},
52 	{0x41,0x84}, {0x43,0x84}, {0x45,0x84}, {0x47,0x84},
53 	{0x49,0x84}, {0x4b,0x84}, {0x4d,0x84}, {0x4f,0x84},
54 	{0x51,0x84}, {0x53,0x84}, {0x55,0x84}, {0x57,0x84},
55 	{0x59,0x84}, {0x5b,0x84}, {0x5d,0x84}, {0x5f,0x84},
56 	{0x61,0x04}, {0x62,0x04}, {0x63,0x04}, {0x64,0x04},
57 	{0x65,0x04}, {0x66,0x04}, {0x67,0x04}, {0x68,0x04},
58 	{0x69,0x04}, {0x6a,0x04}, {0x6b,0x04}, {0x6c,0x04},
59 	{0x6d,0x04}, {0x6e,0x04}, {0x6f,0x04}, {0x70,0x04},
60 	{0x70,0xc4}, {0x71,0x44}, {0x71,0xc4}, {0x72,0x44},
61 	{0x72,0xc4}, {0x73,0x44}, {0x73,0xc4}, {0x74,0x44},
62 	{0x74,0xc4}, {0x75,0x44}, {0x75,0xc4}, {0x76,0x44},
63 	{0x76,0xc4}, {0x77,0x44}, {0x77,0xc4}, {0x78,0x44},
64 	{0x78,0xa4}, {0x78,0xe4}, {0x79,0x24}, {0x79,0x64},
65 	{0x79,0xa4}, {0x79,0xe4}, {0x7a,0x24}, {0x7a,0x64},
66 	{0x7a,0xa4}, {0x7a,0xe4}, {0x7b,0x24}, {0x7b,0x64},
67 	{0x7b,0xa4}, {0x7b,0xe4}, {0x7c,0x24}, {0x7c,0x64},
68 	{0x7c,0x94}, {0x7c,0xb4}, {0x7c,0xd4}, {0x7c,0xf4},
69 	{0x7d,0x14}, {0x7d,0x34}, {0x7d,0x54}, {0x7d,0x74},
70 	{0x7d,0x94}, {0x7d,0xb4}, {0x7d,0xd4}, {0x7d,0xf4},
71 	{0x7e,0x14}, {0x7e,0x34}, {0x7e,0x54}, {0x7e,0x74},
72 	{0x7e,0x8c}, {0x7e,0x9c}, {0x7e,0xac}, {0x7e,0xbc},
73 	{0x7e,0xcc}, {0x7e,0xdc}, {0x7e,0xec}, {0x7e,0xfc},
74 	{0x7f,0x0c}, {0x7f,0x1c}, {0x7f,0x2c}, {0x7f,0x3c},
75 	{0x7f,0x4c}, {0x7f,0x5c}, {0x7f,0x6c}, {0x7f,0x7c},
76 	{0x7f,0x88}, {0x7f,0x90}, {0x7f,0x98}, {0x7f,0xa0},
77 	{0x7f,0xa8}, {0x7f,0xb0}, {0x7f,0xb8}, {0x7f,0xc0},
78 	{0x7f,0xc8}, {0x7f,0xd0}, {0x7f,0xd8}, {0x7f,0xe0},
79 	{0x7f,0xe8}, {0x7f,0xf0}, {0x7f,0xf8}, {0x80,0x00},
80 	{0xfd,0x7c}, {0xf9,0x7c}, {0xf5,0x7c}, {0xf1,0x7c},
81 	{0xed,0x7c}, {0xe9,0x7c}, {0xe5,0x7c}, {0xe1,0x7c},
82 	{0xdd,0x7c}, {0xd9,0x7c}, {0xd5,0x7c}, {0xd1,0x7c},
83 	{0xcd,0x7c}, {0xc9,0x7c}, {0xc5,0x7c}, {0xc1,0x7c},
84 	{0xbe,0x7c}, {0xbc,0x7c}, {0xba,0x7c}, {0xb8,0x7c},
85 	{0xb6,0x7c}, {0xb4,0x7c}, {0xb2,0x7c}, {0xb0,0x7c},
86 	{0xae,0x7c}, {0xac,0x7c}, {0xaa,0x7c}, {0xa8,0x7c},
87 	{0xa6,0x7c}, {0xa4,0x7c}, {0xa2,0x7c}, {0xa0,0x7c},
88 	{0x9e,0xfc}, {0x9d,0xfc}, {0x9c,0xfc}, {0x9b,0xfc},
89 	{0x9a,0xfc}, {0x99,0xfc}, {0x98,0xfc}, {0x97,0xfc},
90 	{0x96,0xfc}, {0x95,0xfc}, {0x94,0xfc}, {0x93,0xfc},
91 	{0x92,0xfc}, {0x91,0xfc}, {0x90,0xfc}, {0x8f,0xfc},
92 	{0x8f,0x3c}, {0x8e,0xbc}, {0x8e,0x3c}, {0x8d,0xbc},
93 	{0x8d,0x3c}, {0x8c,0xbc}, {0x8c,0x3c}, {0x8b,0xbc},
94 	{0x8b,0x3c}, {0x8a,0xbc}, {0x8a,0x3c}, {0x89,0xbc},
95 	{0x89,0x3c}, {0x88,0xbc}, {0x88,0x3c}, {0x87,0xbc},
96 	{0x87,0x5c}, {0x87,0x1c}, {0x86,0xdc}, {0x86,0x9c},
97 	{0x86,0x5c}, {0x86,0x1c}, {0x85,0xdc}, {0x85,0x9c},
98 	{0x85,0x5c}, {0x85,0x1c}, {0x84,0xdc}, {0x84,0x9c},
99 	{0x84,0x5c}, {0x84,0x1c}, {0x83,0xdc}, {0x83,0x9c},
100 	{0x83,0x6c}, {0x83,0x4c}, {0x83,0x2c}, {0x83,0x0c},
101 	{0x82,0xec}, {0x82,0xcc}, {0x82,0xac}, {0x82,0x8c},
102 	{0x82,0x6c}, {0x82,0x4c}, {0x82,0x2c}, {0x82,0x0c},
103 	{0x81,0xec}, {0x81,0xcc}, {0x81,0xac}, {0x81,0x8c},
104 	{0x81,0x74}, {0x81,0x64}, {0x81,0x54}, {0x81,0x44},
105 	{0x81,0x34}, {0x81,0x24}, {0x81,0x14}, {0x81,0x04},
106 	{0x80,0xf4}, {0x80,0xe4}, {0x80,0xd4}, {0x80,0xc4},
107 	{0x80,0xb4}, {0x80,0xa4}, {0x80,0x94}, {0x80,0x84},
108 	{0x80,0x78}, {0x80,0x70}, {0x80,0x68}, {0x80,0x60},
109 	{0x80,0x58}, {0x80,0x50}, {0x80,0x48}, {0x80,0x40},
110 	{0x80,0x38}, {0x80,0x30}, {0x80,0x28}, {0x80,0x20},
111 	{0x80,0x18}, {0x80,0x10}, {0x80,0x08}, {0x80,0x00},
112 };
113 
114 static const u_char lintomulaw[256] = {
115 	0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01,
116 	0x01, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x03,
117 	0x03, 0x04, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05,
118 	0x05, 0x06, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07,
119 	0x07, 0x08, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09,
120 	0x09, 0x0a, 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b,
121 	0x0b, 0x0c, 0x0c, 0x0c, 0x0c, 0x0d, 0x0d, 0x0d,
122 	0x0d, 0x0e, 0x0e, 0x0e, 0x0e, 0x0f, 0x0f, 0x0f,
123 	0x0f, 0x10, 0x10, 0x11, 0x11, 0x12, 0x12, 0x13,
124 	0x13, 0x14, 0x14, 0x15, 0x15, 0x16, 0x16, 0x17,
125 	0x17, 0x18, 0x18, 0x19, 0x19, 0x1a, 0x1a, 0x1b,
126 	0x1b, 0x1c, 0x1c, 0x1d, 0x1d, 0x1e, 0x1e, 0x1f,
127 	0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26,
128 	0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e,
129 	0x2f, 0x30, 0x32, 0x34, 0x36, 0x38, 0x3a, 0x3c,
130 	0x3e, 0x41, 0x45, 0x49, 0x4d, 0x53, 0x5b, 0x67,
131 	0xff, 0xe7, 0xdb, 0xd3, 0xcd, 0xc9, 0xc5, 0xc1,
132 	0xbe, 0xbc, 0xba, 0xb8, 0xb6, 0xb4, 0xb2, 0xb0,
133 	0xaf, 0xae, 0xad, 0xac, 0xab, 0xaa, 0xa9, 0xa8,
134 	0xa7, 0xa6, 0xa5, 0xa4, 0xa3, 0xa2, 0xa1, 0xa0,
135 	0x9f, 0x9f, 0x9e, 0x9e, 0x9d, 0x9d, 0x9c, 0x9c,
136 	0x9b, 0x9b, 0x9a, 0x9a, 0x99, 0x99, 0x98, 0x98,
137 	0x97, 0x97, 0x96, 0x96, 0x95, 0x95, 0x94, 0x94,
138 	0x93, 0x93, 0x92, 0x92, 0x91, 0x91, 0x90, 0x90,
139 	0x8f, 0x8f, 0x8f, 0x8f, 0x8e, 0x8e, 0x8e, 0x8e,
140 	0x8d, 0x8d, 0x8d, 0x8d, 0x8c, 0x8c, 0x8c, 0x8c,
141 	0x8b, 0x8b, 0x8b, 0x8b, 0x8a, 0x8a, 0x8a, 0x8a,
142 	0x89, 0x89, 0x89, 0x89, 0x88, 0x88, 0x88, 0x88,
143 	0x87, 0x87, 0x87, 0x87, 0x86, 0x86, 0x86, 0x86,
144 	0x85, 0x85, 0x85, 0x85, 0x84, 0x84, 0x84, 0x84,
145 	0x83, 0x83, 0x83, 0x83, 0x82, 0x82, 0x82, 0x82,
146 	0x81, 0x81, 0x81, 0x81, 0x80, 0x80, 0x80, 0x80,
147 };
148 
149 static const u_char alawtolin16[256][2] = {
150 	{0x6a,0x80}, {0x6b,0x80}, {0x68,0x80}, {0x69,0x80},
151 	{0x6e,0x80}, {0x6f,0x80}, {0x6c,0x80}, {0x6d,0x80},
152 	{0x62,0x80}, {0x63,0x80}, {0x60,0x80}, {0x61,0x80},
153 	{0x66,0x80}, {0x67,0x80}, {0x64,0x80}, {0x65,0x80},
154 	{0x75,0x40}, {0x75,0xc0}, {0x74,0x40}, {0x74,0xc0},
155 	{0x77,0x40}, {0x77,0xc0}, {0x76,0x40}, {0x76,0xc0},
156 	{0x71,0x40}, {0x71,0xc0}, {0x70,0x40}, {0x70,0xc0},
157 	{0x73,0x40}, {0x73,0xc0}, {0x72,0x40}, {0x72,0xc0},
158 	{0x2a,0x00}, {0x2e,0x00}, {0x22,0x00}, {0x26,0x00},
159 	{0x3a,0x00}, {0x3e,0x00}, {0x32,0x00}, {0x36,0x00},
160 	{0x0a,0x00}, {0x0e,0x00}, {0x02,0x00}, {0x06,0x00},
161 	{0x1a,0x00}, {0x1e,0x00}, {0x12,0x00}, {0x16,0x00},
162 	{0x55,0x00}, {0x57,0x00}, {0x51,0x00}, {0x53,0x00},
163 	{0x5d,0x00}, {0x5f,0x00}, {0x59,0x00}, {0x5b,0x00},
164 	{0x45,0x00}, {0x47,0x00}, {0x41,0x00}, {0x43,0x00},
165 	{0x4d,0x00}, {0x4f,0x00}, {0x49,0x00}, {0x4b,0x00},
166 	{0x7e,0xa8}, {0x7e,0xb8}, {0x7e,0x88}, {0x7e,0x98},
167 	{0x7e,0xe8}, {0x7e,0xf8}, {0x7e,0xc8}, {0x7e,0xd8},
168 	{0x7e,0x28}, {0x7e,0x38}, {0x7e,0x08}, {0x7e,0x18},
169 	{0x7e,0x68}, {0x7e,0x78}, {0x7e,0x48}, {0x7e,0x58},
170 	{0x7f,0xa8}, {0x7f,0xb8}, {0x7f,0x88}, {0x7f,0x98},
171 	{0x7f,0xe8}, {0x7f,0xf8}, {0x7f,0xc8}, {0x7f,0xd8},
172 	{0x7f,0x28}, {0x7f,0x38}, {0x7f,0x08}, {0x7f,0x18},
173 	{0x7f,0x68}, {0x7f,0x78}, {0x7f,0x48}, {0x7f,0x58},
174 	{0x7a,0xa0}, {0x7a,0xe0}, {0x7a,0x20}, {0x7a,0x60},
175 	{0x7b,0xa0}, {0x7b,0xe0}, {0x7b,0x20}, {0x7b,0x60},
176 	{0x78,0xa0}, {0x78,0xe0}, {0x78,0x20}, {0x78,0x60},
177 	{0x79,0xa0}, {0x79,0xe0}, {0x79,0x20}, {0x79,0x60},
178 	{0x7d,0x50}, {0x7d,0x70}, {0x7d,0x10}, {0x7d,0x30},
179 	{0x7d,0xd0}, {0x7d,0xf0}, {0x7d,0x90}, {0x7d,0xb0},
180 	{0x7c,0x50}, {0x7c,0x70}, {0x7c,0x10}, {0x7c,0x30},
181 	{0x7c,0xd0}, {0x7c,0xf0}, {0x7c,0x90}, {0x7c,0xb0},
182 	{0x95,0x80}, {0x94,0x80}, {0x97,0x80}, {0x96,0x80},
183 	{0x91,0x80}, {0x90,0x80}, {0x93,0x80}, {0x92,0x80},
184 	{0x9d,0x80}, {0x9c,0x80}, {0x9f,0x80}, {0x9e,0x80},
185 	{0x99,0x80}, {0x98,0x80}, {0x9b,0x80}, {0x9a,0x80},
186 	{0x8a,0xc0}, {0x8a,0x40}, {0x8b,0xc0}, {0x8b,0x40},
187 	{0x88,0xc0}, {0x88,0x40}, {0x89,0xc0}, {0x89,0x40},
188 	{0x8e,0xc0}, {0x8e,0x40}, {0x8f,0xc0}, {0x8f,0x40},
189 	{0x8c,0xc0}, {0x8c,0x40}, {0x8d,0xc0}, {0x8d,0x40},
190 	{0xd6,0x00}, {0xd2,0x00}, {0xde,0x00}, {0xda,0x00},
191 	{0xc6,0x00}, {0xc2,0x00}, {0xce,0x00}, {0xca,0x00},
192 	{0xf6,0x00}, {0xf2,0x00}, {0xfe,0x00}, {0xfa,0x00},
193 	{0xe6,0x00}, {0xe2,0x00}, {0xee,0x00}, {0xea,0x00},
194 	{0xab,0x00}, {0xa9,0x00}, {0xaf,0x00}, {0xad,0x00},
195 	{0xa3,0x00}, {0xa1,0x00}, {0xa7,0x00}, {0xa5,0x00},
196 	{0xbb,0x00}, {0xb9,0x00}, {0xbf,0x00}, {0xbd,0x00},
197 	{0xb3,0x00}, {0xb1,0x00}, {0xb7,0x00}, {0xb5,0x00},
198 	{0x81,0x58}, {0x81,0x48}, {0x81,0x78}, {0x81,0x68},
199 	{0x81,0x18}, {0x81,0x08}, {0x81,0x38}, {0x81,0x28},
200 	{0x81,0xd8}, {0x81,0xc8}, {0x81,0xf8}, {0x81,0xe8},
201 	{0x81,0x98}, {0x81,0x88}, {0x81,0xb8}, {0x81,0xa8},
202 	{0x80,0x58}, {0x80,0x48}, {0x80,0x78}, {0x80,0x68},
203 	{0x80,0x18}, {0x80,0x08}, {0x80,0x38}, {0x80,0x28},
204 	{0x80,0xd8}, {0x80,0xc8}, {0x80,0xf8}, {0x80,0xe8},
205 	{0x80,0x98}, {0x80,0x88}, {0x80,0xb8}, {0x80,0xa8},
206 	{0x85,0x60}, {0x85,0x20}, {0x85,0xe0}, {0x85,0xa0},
207 	{0x84,0x60}, {0x84,0x20}, {0x84,0xe0}, {0x84,0xa0},
208 	{0x87,0x60}, {0x87,0x20}, {0x87,0xe0}, {0x87,0xa0},
209 	{0x86,0x60}, {0x86,0x20}, {0x86,0xe0}, {0x86,0xa0},
210 	{0x82,0xb0}, {0x82,0x90}, {0x82,0xf0}, {0x82,0xd0},
211 	{0x82,0x30}, {0x82,0x10}, {0x82,0x70}, {0x82,0x50},
212 	{0x83,0xb0}, {0x83,0x90}, {0x83,0xf0}, {0x83,0xd0},
213 	{0x83,0x30}, {0x83,0x10}, {0x83,0x70}, {0x83,0x50},
214 };
215 
216 static const u_char lintoalaw[256] = {
217 	0x2a, 0x2a, 0x2a, 0x2a, 0x2b, 0x2b, 0x2b, 0x2b,
218 	0x28, 0x28, 0x28, 0x28, 0x29, 0x29, 0x29, 0x29,
219 	0x2e, 0x2e, 0x2e, 0x2e, 0x2f, 0x2f, 0x2f, 0x2f,
220 	0x2c, 0x2c, 0x2c, 0x2c, 0x2d, 0x2d, 0x2d, 0x2d,
221 	0x22, 0x22, 0x22, 0x22, 0x23, 0x23, 0x23, 0x23,
222 	0x20, 0x20, 0x20, 0x20, 0x21, 0x21, 0x21, 0x21,
223 	0x26, 0x26, 0x26, 0x26, 0x27, 0x27, 0x27, 0x27,
224 	0x24, 0x24, 0x24, 0x24, 0x25, 0x25, 0x25, 0x25,
225 	0x3a, 0x3a, 0x3b, 0x3b, 0x38, 0x38, 0x39, 0x39,
226 	0x3e, 0x3e, 0x3f, 0x3f, 0x3c, 0x3c, 0x3d, 0x3d,
227 	0x32, 0x32, 0x33, 0x33, 0x30, 0x30, 0x31, 0x31,
228 	0x36, 0x36, 0x37, 0x37, 0x34, 0x34, 0x35, 0x35,
229 	0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d,
230 	0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05,
231 	0x1a, 0x18, 0x1e, 0x1c, 0x12, 0x10, 0x16, 0x14,
232 	0x6a, 0x6e, 0x62, 0x66, 0x7a, 0x72, 0x4a, 0x5a,
233 	0xd5, 0xc5, 0xf5, 0xfd, 0xe5, 0xe1, 0xed, 0xe9,
234 	0x95, 0x97, 0x91, 0x93, 0x9d, 0x9f, 0x99, 0x9b,
235 	0x85, 0x84, 0x87, 0x86, 0x81, 0x80, 0x83, 0x82,
236 	0x8d, 0x8c, 0x8f, 0x8e, 0x89, 0x88, 0x8b, 0x8a,
237 	0xb5, 0xb5, 0xb4, 0xb4, 0xb7, 0xb7, 0xb6, 0xb6,
238 	0xb1, 0xb1, 0xb0, 0xb0, 0xb3, 0xb3, 0xb2, 0xb2,
239 	0xbd, 0xbd, 0xbc, 0xbc, 0xbf, 0xbf, 0xbe, 0xbe,
240 	0xb9, 0xb9, 0xb8, 0xb8, 0xbb, 0xbb, 0xba, 0xba,
241 	0xa5, 0xa5, 0xa5, 0xa5, 0xa4, 0xa4, 0xa4, 0xa4,
242 	0xa7, 0xa7, 0xa7, 0xa7, 0xa6, 0xa6, 0xa6, 0xa6,
243 	0xa1, 0xa1, 0xa1, 0xa1, 0xa0, 0xa0, 0xa0, 0xa0,
244 	0xa3, 0xa3, 0xa3, 0xa3, 0xa2, 0xa2, 0xa2, 0xa2,
245 	0xad, 0xad, 0xad, 0xad, 0xac, 0xac, 0xac, 0xac,
246 	0xaf, 0xaf, 0xaf, 0xaf, 0xae, 0xae, 0xae, 0xae,
247 	0xa9, 0xa9, 0xa9, 0xa9, 0xa8, 0xa8, 0xa8, 0xa8,
248 	0xab, 0xab, 0xab, 0xab, 0xaa, 0xaa, 0xaa, 0xaa,
249 };
250 
251 void
252 mulaw_to_ulinear8(void *v, u_char *p, int cc)
253 {
254 	/* Use the 16 bit table for 8 bits too. */
255 	while (--cc >= 0) {
256 		*p = mulawtolin16[*p][0];
257 		++p;
258 	}
259 }
260 
261 void
262 mulaw_to_slinear8(void *v, u_char *p, int cc)
263 {
264 	/* Use the 16 bit table for 8 bits too. */
265 	while (--cc >= 0) {
266 		*p = mulawtolin16[*p][0] ^ 0x80;
267 		++p;
268 	}
269 }
270 
271 void
272 mulaw_to_ulinear16_le(void *v, u_char *p, int cc)
273 {
274 	u_char *q = p;
275 
276 	p += cc;
277 	q += cc << 1;
278 	while (--cc >= 0) {
279 		--p;
280 		q -= 2;
281 		q[1] = mulawtolin16[*p][0];
282 		q[0] = mulawtolin16[*p][1];
283 	}
284 }
285 
286 void
287 mulaw_to_ulinear16_be(void *v, u_char *p, int cc)
288 {
289 	u_char *q = p;
290 
291 	p += cc;
292 	q += cc << 1;
293 	while (--cc >= 0) {
294 		--p;
295 		q -= 2;
296 		q[0] = mulawtolin16[*p][0];
297 		q[1] = mulawtolin16[*p][1];
298 	}
299 }
300 
301 void
302 mulaw_to_slinear16_le(void *v, u_char *p, int cc)
303 {
304 	u_char *q = p;
305 
306 	p += cc;
307 	q += cc << 1;
308 	while (--cc >= 0) {
309 		--p;
310 		q -= 2;
311 		q[1] = mulawtolin16[*p][0] ^ 0x80;
312 		q[0] = mulawtolin16[*p][1];
313 	}
314 }
315 
316 void
317 mulaw_to_slinear16_le_mts(void *v, u_char *p, int cc)
318 {
319 	u_char *q = p;
320 
321 	p += cc;
322 	q += cc * 4;
323 	while (--cc >= 0) {
324 		--p;
325 		q -= 4;
326 		q[1] = q[3] = mulawtolin16[*p][0] ^ 0x80;
327 		q[0] = q[2] = mulawtolin16[*p][1];
328 	}
329 }
330 
331 void
332 mulaw_to_slinear16_be(void *v, u_char *p, int cc)
333 {
334 	u_char *q = p;
335 
336 	p += cc;
337 	q += cc << 1;
338 	while (--cc >= 0) {
339 		--p;
340 		q -= 2;
341 		q[0] = mulawtolin16[*p][0] ^ 0x80;
342 		q[1] = mulawtolin16[*p][1];
343 	}
344 }
345 
346 void
347 mulaw_to_slinear16_be_mts(void *v, u_char *p, int cc)
348 {
349 	u_char *q = p;
350 
351 	p += cc;
352 	q += cc * 4;
353 	while (--cc >= 0) {
354 		--p;
355 		q -= 4;
356 		q[0] = q[2] = mulawtolin16[*p][0] ^ 0x80;
357 		q[1] = q[3] = mulawtolin16[*p][1];
358 	}
359 }
360 
361 void
362 slinear16_to_mulaw_le(void *v, u_char* p, int cc)
363 {
364 	u_char *q = p + 1;	/* q points higher byte. */
365 
366 	while ((cc-= 2) >= 0) {
367 		*p++ = lintomulaw[*q ^ 0x80];
368 		q +=2 ;
369 	}
370 }
371 
372 void
373 ulinear8_to_mulaw(void *v, u_char *p, int cc)
374 {
375 	while (--cc >= 0) {
376 		*p = lintomulaw[*p];
377 		++p;
378 	}
379 }
380 
381 void
382 slinear8_to_mulaw(void *v, u_char *p, int cc)
383 {
384 	while (--cc >= 0) {
385 		*p = lintomulaw[*p ^ 0x80];
386 		++p;
387 	}
388 }
389 
390 void
391 alaw_to_ulinear8(void *v, u_char *p, int cc)
392 {
393 	/* Use the 16 bit table for 8 bits too. */
394 	while (--cc >= 0) {
395 		*p = alawtolin16[*p][0];
396 		++p;
397 	}
398 }
399 
400 void
401 alaw_to_slinear8(void *v, u_char *p, int cc)
402 {
403 	/* Use the 16 bit table for 8 bits too. */
404 	while (--cc >= 0) {
405 		*p = alawtolin16[*p][0] ^ 0x80;
406 		++p;
407 	}
408 }
409 
410 void
411 alaw_to_ulinear16_le(void *v, u_char *p, int cc)
412 {
413 	u_char *q = p;
414 
415 	p += cc;
416 	q += cc << 1;
417 	while (--cc >= 0) {
418 		--p;
419 		q -= 2;
420 		q[1] = alawtolin16[*p][0];
421 		q[0] = alawtolin16[*p][1];
422 	}
423 }
424 
425 void
426 alaw_to_ulinear16_be(void *v, u_char *p, int cc)
427 {
428 	u_char *q = p;
429 
430 	p += cc;
431 	q += cc << 1;
432 	while (--cc >= 0) {
433 		--p;
434 		q -= 2;
435 		q[0] = alawtolin16[*p][0];
436 		q[1] = alawtolin16[*p][1];
437 	}
438 }
439 
440 void
441 alaw_to_slinear16_le(void *v, u_char *p, int cc)
442 {
443 	u_char *q = p;
444 
445 	p += cc;
446 	q += cc << 1;
447 	while (--cc >= 0) {
448 		--p;
449 		q -= 2;
450 		q[1] = alawtolin16[*p][0] ^ 0x80;
451 		q[0] = alawtolin16[*p][1];
452 	}
453 }
454 
455 void
456 alaw_to_slinear16_be(void *v, u_char *p, int cc)
457 {
458 	u_char *q = p;
459 
460 	p += cc;
461 	q += cc << 1;
462 	while (--cc >= 0) {
463 		--p;
464 		q -= 2;
465 		q[0] = alawtolin16[*p][0] ^ 0x80;
466 		q[1] = alawtolin16[*p][1];
467 	}
468 }
469 
470 void
471 ulinear8_to_alaw(void *v, u_char *p, int cc)
472 {
473 	while (--cc >= 0) {
474 		*p = lintoalaw[*p];
475 		++p;
476 	}
477 }
478 
479 void
480 slinear8_to_alaw(void *v, u_char *p, int cc)
481 {
482 	while (--cc >= 0) {
483 		*p = lintoalaw[*p ^ 0x80];
484 		++p;
485 	}
486 }
487 
488 void
489 slinear16_to_alaw_le(void *v, u_char *p, int cc)
490 {
491 	u_char *q = p;
492 
493 	while ((cc -= 2) >= 0) {
494 		*p = lintoalaw[q[1] ^ 0x80];
495 		++p;
496 		q += 2;
497 	}
498 }
499 
500 
501 void
502 slinear16_to_alaw_be(void *v, u_char *p, int cc)
503 {
504 	u_char *q = p;
505 
506 	while ((cc -= 2) >= 0) {
507 		*p = lintoalaw[q[0] ^ 0x80];
508 		++p;
509 		q += 2;
510 	}
511 }
512 
513 /*
514  * same as mulaw_to_ulinear16_le(), plus expand mono to stereo
515  */
516 void
517 mulaw_to_ulinear16_le_mts(void *v, u_char *p, int cc)
518 {
519 	u_char *q = p;
520 
521 	p += cc;
522 	q += cc * 4;
523 	while (--cc >= 0) {
524 		--p;
525 		q -= 4;
526 		q[1] = q[3] = mulawtolin16[*p][0];
527 		q[0] = q[2] = mulawtolin16[*p][1];
528 	}
529 }
530 
531 /*
532  * same as mulaw_to_ulinear16_be(), plus expand mono to stereo
533  */
534 void
535 mulaw_to_ulinear16_be_mts(void *v, u_char *p, int cc)
536 {
537 	u_char *q = p;
538 
539 	p += cc;
540 	q += cc * 4;
541 	while (--cc >= 0) {
542 		--p;
543 		q -= 4;
544 		q[0] = q[2] = mulawtolin16[*p][0];
545 		q[1] = q[3] = mulawtolin16[*p][1];
546 	}
547 }
548 
549 /*
550  * same as alaw_to_slinear16_le(), plus expand mono to stereo
551  */
552 void
553 alaw_to_slinear16_le_mts(void *v, u_char *p, int cc)
554 {
555 	u_char *q = p;
556 
557 	p += cc;
558 	q += cc * 4;
559 	while (--cc >= 0) {
560 		--p;
561 		q -= 4;
562 		q[1] = q[3] = alawtolin16[*p][0] ^ 0x80;
563 		q[0] = q[2] = alawtolin16[*p][1];
564 	}
565 }
566 
567 /*
568  * same as alaw_to_slinear16_be(), plus expand mono to stereo
569  */
570 void
571 alaw_to_slinear16_be_mts(void *v, u_char *p, int cc)
572 {
573 	u_char *q = p;
574 
575 	p += cc;
576 	q += cc * 4;
577 	while (--cc >= 0) {
578 		--p;
579 		q -= 4;
580 		q[0] = q[2] = alawtolin16[*p][0] ^ 0x80;
581 		q[1] = q[3] = alawtolin16[*p][1];
582 	}
583 }
584 
585 void
586 alaw_to_mulaw(void *v, u_char *p, int cc)
587 {
588 	while (--cc >= 0) {
589 		*p = lintomulaw[alawtolin16[*p][0]];
590 		++p;
591 	}
592 }
593 
594 void
595 mulaw_to_alaw(void *v, u_char *p, int cc)
596 {
597 	while (--cc >= 0) {
598 		*p = lintoalaw[mulawtolin16[*p][0]];
599 		++p;
600 	}
601 }
602 
603 
604 
605 void
606 slinear16_to_alaw_le_stm(void *v, u_char *p, int cc)
607 {
608 	u_char *q = p;
609 
610 	while ((cc -= 4) >= 0) {
611 		*p = lintoalaw[q[1] ^ 0x80];
612 		++p;
613 		q += 4;
614 	}
615 }
616 
617 
618 void
619 slinear16_to_alaw_be_stm(void *v, u_char *p, int cc)
620 {
621 	u_char *q = p;
622 
623 	while ((cc -= 4) >= 0) {
624 		*p = lintoalaw[q[0] ^ 0x80];
625 		++p;
626 		q += 4;
627 	}
628 }
629 
630 void
631 slinear16_to_mulaw_le_stm(void *v, u_char* p, int cc)
632 {
633 	u_char *q = p;
634 
635 	while ((cc -= 4) >= 0) {
636 		*p++ = lintomulaw[q[1] ^ 0x80];
637 		q += 4 ;
638 	}
639 }
640 
641 void
642 slinear16_to_mulaw_be_stm(void *v, u_char* p, int cc)
643 {
644 	u_char *q = p;
645 
646 	while ((cc -= 4) >= 0) {
647 		*p++ = lintomulaw[q[0] ^ 0x80];
648 		q += 4 ;
649 	}
650 }
651