1*1cf28608Sratchov /* $OpenBSD: mulaw.c,v 1.18 2015/06/25 06:43:46 ratchov Exp $ */
229698837Saaron /* $NetBSD: mulaw.c,v 1.15 2001/01/18 20:28:20 jdolecek Exp $ */
347e81424Sniklas
4df930be7Sderaadt /*
5df930be7Sderaadt * Copyright (c) 1991-1993 Regents of the University of California.
6df930be7Sderaadt * All rights reserved.
7df930be7Sderaadt *
8df930be7Sderaadt * Redistribution and use in source and binary forms, with or without
9df930be7Sderaadt * modification, are permitted provided that the following conditions
10df930be7Sderaadt * are met:
11df930be7Sderaadt * 1. Redistributions of source code must retain the above copyright
12df930be7Sderaadt * notice, this list of conditions and the following disclaimer.
13df930be7Sderaadt * 2. Redistributions in binary form must reproduce the above copyright
14df930be7Sderaadt * notice, this list of conditions and the following disclaimer in the
15df930be7Sderaadt * documentation and/or other materials provided with the distribution.
16df930be7Sderaadt * 3. All advertising materials mentioning features or use of this software
17df930be7Sderaadt * must display the following acknowledgement:
18df930be7Sderaadt * This product includes software developed by the Computer Systems
19df930be7Sderaadt * Engineering Group at Lawrence Berkeley Laboratory.
20df930be7Sderaadt * 4. Neither the name of the University nor of the Laboratory may be used
21df930be7Sderaadt * to endorse or promote products derived from this software without
22df930be7Sderaadt * specific prior written permission.
23df930be7Sderaadt *
24df930be7Sderaadt * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
25df930be7Sderaadt * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26df930be7Sderaadt * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27df930be7Sderaadt * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
28df930be7Sderaadt * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29df930be7Sderaadt * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
30df930be7Sderaadt * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31df930be7Sderaadt * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32df930be7Sderaadt * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33df930be7Sderaadt * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34df930be7Sderaadt * SUCH DAMAGE.
35df930be7Sderaadt *
36df930be7Sderaadt */
37df930be7Sderaadt
38df930be7Sderaadt #include <sys/types.h>
39df930be7Sderaadt #include <dev/mulaw.h>
40df930be7Sderaadt
41e99cab2bSprovos /*
423919fd09Sderaadt * This table converts a (8 bit) mu-law value two a 16 bit value.
4329698837Saaron * The 16 bits are represented as an array of two bytes for easier access
44e99cab2bSprovos * to the individual bytes.
45e99cab2bSprovos */
4629698837Saaron static const u_char mulawtolin16[256][2] = {
47e99cab2bSprovos {0x02,0x84}, {0x06,0x84}, {0x0a,0x84}, {0x0e,0x84},
48e99cab2bSprovos {0x12,0x84}, {0x16,0x84}, {0x1a,0x84}, {0x1e,0x84},
49e99cab2bSprovos {0x22,0x84}, {0x26,0x84}, {0x2a,0x84}, {0x2e,0x84},
50e99cab2bSprovos {0x32,0x84}, {0x36,0x84}, {0x3a,0x84}, {0x3e,0x84},
51e99cab2bSprovos {0x41,0x84}, {0x43,0x84}, {0x45,0x84}, {0x47,0x84},
52e99cab2bSprovos {0x49,0x84}, {0x4b,0x84}, {0x4d,0x84}, {0x4f,0x84},
53e99cab2bSprovos {0x51,0x84}, {0x53,0x84}, {0x55,0x84}, {0x57,0x84},
54e99cab2bSprovos {0x59,0x84}, {0x5b,0x84}, {0x5d,0x84}, {0x5f,0x84},
55e99cab2bSprovos {0x61,0x04}, {0x62,0x04}, {0x63,0x04}, {0x64,0x04},
56e99cab2bSprovos {0x65,0x04}, {0x66,0x04}, {0x67,0x04}, {0x68,0x04},
57e99cab2bSprovos {0x69,0x04}, {0x6a,0x04}, {0x6b,0x04}, {0x6c,0x04},
58e99cab2bSprovos {0x6d,0x04}, {0x6e,0x04}, {0x6f,0x04}, {0x70,0x04},
59e99cab2bSprovos {0x70,0xc4}, {0x71,0x44}, {0x71,0xc4}, {0x72,0x44},
60e99cab2bSprovos {0x72,0xc4}, {0x73,0x44}, {0x73,0xc4}, {0x74,0x44},
61e99cab2bSprovos {0x74,0xc4}, {0x75,0x44}, {0x75,0xc4}, {0x76,0x44},
62e99cab2bSprovos {0x76,0xc4}, {0x77,0x44}, {0x77,0xc4}, {0x78,0x44},
63e99cab2bSprovos {0x78,0xa4}, {0x78,0xe4}, {0x79,0x24}, {0x79,0x64},
64e99cab2bSprovos {0x79,0xa4}, {0x79,0xe4}, {0x7a,0x24}, {0x7a,0x64},
65e99cab2bSprovos {0x7a,0xa4}, {0x7a,0xe4}, {0x7b,0x24}, {0x7b,0x64},
66e99cab2bSprovos {0x7b,0xa4}, {0x7b,0xe4}, {0x7c,0x24}, {0x7c,0x64},
67e99cab2bSprovos {0x7c,0x94}, {0x7c,0xb4}, {0x7c,0xd4}, {0x7c,0xf4},
68e99cab2bSprovos {0x7d,0x14}, {0x7d,0x34}, {0x7d,0x54}, {0x7d,0x74},
69e99cab2bSprovos {0x7d,0x94}, {0x7d,0xb4}, {0x7d,0xd4}, {0x7d,0xf4},
70e99cab2bSprovos {0x7e,0x14}, {0x7e,0x34}, {0x7e,0x54}, {0x7e,0x74},
71e99cab2bSprovos {0x7e,0x8c}, {0x7e,0x9c}, {0x7e,0xac}, {0x7e,0xbc},
72e99cab2bSprovos {0x7e,0xcc}, {0x7e,0xdc}, {0x7e,0xec}, {0x7e,0xfc},
73e99cab2bSprovos {0x7f,0x0c}, {0x7f,0x1c}, {0x7f,0x2c}, {0x7f,0x3c},
74e99cab2bSprovos {0x7f,0x4c}, {0x7f,0x5c}, {0x7f,0x6c}, {0x7f,0x7c},
75e99cab2bSprovos {0x7f,0x88}, {0x7f,0x90}, {0x7f,0x98}, {0x7f,0xa0},
76e99cab2bSprovos {0x7f,0xa8}, {0x7f,0xb0}, {0x7f,0xb8}, {0x7f,0xc0},
77e99cab2bSprovos {0x7f,0xc8}, {0x7f,0xd0}, {0x7f,0xd8}, {0x7f,0xe0},
78e99cab2bSprovos {0x7f,0xe8}, {0x7f,0xf0}, {0x7f,0xf8}, {0x80,0x00},
79e99cab2bSprovos {0xfd,0x7c}, {0xf9,0x7c}, {0xf5,0x7c}, {0xf1,0x7c},
80e99cab2bSprovos {0xed,0x7c}, {0xe9,0x7c}, {0xe5,0x7c}, {0xe1,0x7c},
81e99cab2bSprovos {0xdd,0x7c}, {0xd9,0x7c}, {0xd5,0x7c}, {0xd1,0x7c},
82e99cab2bSprovos {0xcd,0x7c}, {0xc9,0x7c}, {0xc5,0x7c}, {0xc1,0x7c},
83e99cab2bSprovos {0xbe,0x7c}, {0xbc,0x7c}, {0xba,0x7c}, {0xb8,0x7c},
84e99cab2bSprovos {0xb6,0x7c}, {0xb4,0x7c}, {0xb2,0x7c}, {0xb0,0x7c},
85e99cab2bSprovos {0xae,0x7c}, {0xac,0x7c}, {0xaa,0x7c}, {0xa8,0x7c},
86e99cab2bSprovos {0xa6,0x7c}, {0xa4,0x7c}, {0xa2,0x7c}, {0xa0,0x7c},
87e99cab2bSprovos {0x9e,0xfc}, {0x9d,0xfc}, {0x9c,0xfc}, {0x9b,0xfc},
88e99cab2bSprovos {0x9a,0xfc}, {0x99,0xfc}, {0x98,0xfc}, {0x97,0xfc},
89e99cab2bSprovos {0x96,0xfc}, {0x95,0xfc}, {0x94,0xfc}, {0x93,0xfc},
90e99cab2bSprovos {0x92,0xfc}, {0x91,0xfc}, {0x90,0xfc}, {0x8f,0xfc},
91e99cab2bSprovos {0x8f,0x3c}, {0x8e,0xbc}, {0x8e,0x3c}, {0x8d,0xbc},
92e99cab2bSprovos {0x8d,0x3c}, {0x8c,0xbc}, {0x8c,0x3c}, {0x8b,0xbc},
93e99cab2bSprovos {0x8b,0x3c}, {0x8a,0xbc}, {0x8a,0x3c}, {0x89,0xbc},
94e99cab2bSprovos {0x89,0x3c}, {0x88,0xbc}, {0x88,0x3c}, {0x87,0xbc},
95e99cab2bSprovos {0x87,0x5c}, {0x87,0x1c}, {0x86,0xdc}, {0x86,0x9c},
96e99cab2bSprovos {0x86,0x5c}, {0x86,0x1c}, {0x85,0xdc}, {0x85,0x9c},
97e99cab2bSprovos {0x85,0x5c}, {0x85,0x1c}, {0x84,0xdc}, {0x84,0x9c},
98e99cab2bSprovos {0x84,0x5c}, {0x84,0x1c}, {0x83,0xdc}, {0x83,0x9c},
99e99cab2bSprovos {0x83,0x6c}, {0x83,0x4c}, {0x83,0x2c}, {0x83,0x0c},
100e99cab2bSprovos {0x82,0xec}, {0x82,0xcc}, {0x82,0xac}, {0x82,0x8c},
101e99cab2bSprovos {0x82,0x6c}, {0x82,0x4c}, {0x82,0x2c}, {0x82,0x0c},
102e99cab2bSprovos {0x81,0xec}, {0x81,0xcc}, {0x81,0xac}, {0x81,0x8c},
103e99cab2bSprovos {0x81,0x74}, {0x81,0x64}, {0x81,0x54}, {0x81,0x44},
104e99cab2bSprovos {0x81,0x34}, {0x81,0x24}, {0x81,0x14}, {0x81,0x04},
105e99cab2bSprovos {0x80,0xf4}, {0x80,0xe4}, {0x80,0xd4}, {0x80,0xc4},
106e99cab2bSprovos {0x80,0xb4}, {0x80,0xa4}, {0x80,0x94}, {0x80,0x84},
107e99cab2bSprovos {0x80,0x78}, {0x80,0x70}, {0x80,0x68}, {0x80,0x60},
108e99cab2bSprovos {0x80,0x58}, {0x80,0x50}, {0x80,0x48}, {0x80,0x40},
109e99cab2bSprovos {0x80,0x38}, {0x80,0x30}, {0x80,0x28}, {0x80,0x20},
110e99cab2bSprovos {0x80,0x18}, {0x80,0x10}, {0x80,0x08}, {0x80,0x00},
111df930be7Sderaadt };
112df930be7Sderaadt
11329698837Saaron static const u_char lintomulaw[256] = {
114e99cab2bSprovos 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01,
115e99cab2bSprovos 0x01, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x03,
116e99cab2bSprovos 0x03, 0x04, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05,
117e99cab2bSprovos 0x05, 0x06, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07,
118e99cab2bSprovos 0x07, 0x08, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09,
119e99cab2bSprovos 0x09, 0x0a, 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b,
120e99cab2bSprovos 0x0b, 0x0c, 0x0c, 0x0c, 0x0c, 0x0d, 0x0d, 0x0d,
121e99cab2bSprovos 0x0d, 0x0e, 0x0e, 0x0e, 0x0e, 0x0f, 0x0f, 0x0f,
122e99cab2bSprovos 0x0f, 0x10, 0x10, 0x11, 0x11, 0x12, 0x12, 0x13,
123e99cab2bSprovos 0x13, 0x14, 0x14, 0x15, 0x15, 0x16, 0x16, 0x17,
124e99cab2bSprovos 0x17, 0x18, 0x18, 0x19, 0x19, 0x1a, 0x1a, 0x1b,
125e99cab2bSprovos 0x1b, 0x1c, 0x1c, 0x1d, 0x1d, 0x1e, 0x1e, 0x1f,
126e99cab2bSprovos 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26,
127e99cab2bSprovos 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e,
128e99cab2bSprovos 0x2f, 0x30, 0x32, 0x34, 0x36, 0x38, 0x3a, 0x3c,
129e99cab2bSprovos 0x3e, 0x41, 0x45, 0x49, 0x4d, 0x53, 0x5b, 0x67,
130e99cab2bSprovos 0xff, 0xe7, 0xdb, 0xd3, 0xcd, 0xc9, 0xc5, 0xc1,
131e99cab2bSprovos 0xbe, 0xbc, 0xba, 0xb8, 0xb6, 0xb4, 0xb2, 0xb0,
132e99cab2bSprovos 0xaf, 0xae, 0xad, 0xac, 0xab, 0xaa, 0xa9, 0xa8,
133e99cab2bSprovos 0xa7, 0xa6, 0xa5, 0xa4, 0xa3, 0xa2, 0xa1, 0xa0,
134e99cab2bSprovos 0x9f, 0x9f, 0x9e, 0x9e, 0x9d, 0x9d, 0x9c, 0x9c,
135e99cab2bSprovos 0x9b, 0x9b, 0x9a, 0x9a, 0x99, 0x99, 0x98, 0x98,
136e99cab2bSprovos 0x97, 0x97, 0x96, 0x96, 0x95, 0x95, 0x94, 0x94,
137e99cab2bSprovos 0x93, 0x93, 0x92, 0x92, 0x91, 0x91, 0x90, 0x90,
138e99cab2bSprovos 0x8f, 0x8f, 0x8f, 0x8f, 0x8e, 0x8e, 0x8e, 0x8e,
139e99cab2bSprovos 0x8d, 0x8d, 0x8d, 0x8d, 0x8c, 0x8c, 0x8c, 0x8c,
140e99cab2bSprovos 0x8b, 0x8b, 0x8b, 0x8b, 0x8a, 0x8a, 0x8a, 0x8a,
141e99cab2bSprovos 0x89, 0x89, 0x89, 0x89, 0x88, 0x88, 0x88, 0x88,
142e99cab2bSprovos 0x87, 0x87, 0x87, 0x87, 0x86, 0x86, 0x86, 0x86,
143e99cab2bSprovos 0x85, 0x85, 0x85, 0x85, 0x84, 0x84, 0x84, 0x84,
144e99cab2bSprovos 0x83, 0x83, 0x83, 0x83, 0x82, 0x82, 0x82, 0x82,
145e99cab2bSprovos 0x81, 0x81, 0x81, 0x81, 0x80, 0x80, 0x80, 0x80,
146e99cab2bSprovos };
147e99cab2bSprovos
148df930be7Sderaadt void
mulaw_to_slinear8(u_char * p,int cc)149*1cf28608Sratchov mulaw_to_slinear8(u_char *p, int cc)
150380ba284Sdownsj {
151380ba284Sdownsj /* Use the 16 bit table for 8 bits too. */
152380ba284Sdownsj while (--cc >= 0) {
153380ba284Sdownsj *p = mulawtolin16[*p][0] ^ 0x80;
154380ba284Sdownsj ++p;
155380ba284Sdownsj }
156380ba284Sdownsj }
157380ba284Sdownsj
158380ba284Sdownsj void
slinear8_to_mulaw(u_char * p,int cc)159*1cf28608Sratchov slinear8_to_mulaw(u_char *p, int cc)
160380ba284Sdownsj {
161380ba284Sdownsj while (--cc >= 0) {
162380ba284Sdownsj *p = lintomulaw[*p ^ 0x80];
163380ba284Sdownsj ++p;
164380ba284Sdownsj }
165380ba284Sdownsj }
166380ba284Sdownsj
167380ba284Sdownsj void
mulaw24_to_slinear24(u_char * p,int cc)168*1cf28608Sratchov mulaw24_to_slinear24(u_char *p, int cc)
169e99cab2bSprovos {
170ac2bb4f3Sratchov int s, *q = (int *)p;
17188234e82Sjakemsr
17288234e82Sjakemsr while ((cc -= 4) >= 0) {
173ac2bb4f3Sratchov s = (*q >> 16) & 0xff;
174ac2bb4f3Sratchov *q = (int)((signed char)mulawtolin16[s][0] ^ 0x80) << 16 |
175ac2bb4f3Sratchov (u_int)mulawtolin16[s][1] << 8;
176ac2bb4f3Sratchov q++;
17788234e82Sjakemsr }
17888234e82Sjakemsr }
17988234e82Sjakemsr
18088234e82Sjakemsr void
slinear24_to_mulaw24(u_char * p,int cc)181*1cf28608Sratchov slinear24_to_mulaw24(u_char *p, int cc)
18288234e82Sjakemsr {
183ac2bb4f3Sratchov u_int *q = (u_int *)p;
18488234e82Sjakemsr
18588234e82Sjakemsr while ((cc -= 4) >= 0) {
186ac2bb4f3Sratchov *q = lintomulaw[((*q >> 16) & 0xff) ^ 0x80] << 16;
187ac2bb4f3Sratchov q++;
18888234e82Sjakemsr }
18988234e82Sjakemsr }
190