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