00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044 #define SIGN_BIT (0x80)
00045 #define QUANT_MASK (0xf)
00046 #define NSEGS (8)
00047 #define SEG_SHIFT (4)
00048 #define SEG_MASK (0x70)
00049
00050 static int seg_aend[8] = {0x1F, 0x3F, 0x7F, 0xFF,
00051 0x1FF, 0x3FF, 0x7FF, 0xFFF};
00052 static int seg_uend[8] = {0x3F, 0x7F, 0xFF, 0x1FF,
00053 0x3FF, 0x7FF, 0xFFF, 0x1FFF};
00054
00055
00056 unsigned char u2a[128] = {
00057 1, 1, 2, 2, 3, 3, 4, 4,
00058 5, 5, 6, 6, 7, 7, 8, 8,
00059 9, 10, 11, 12, 13, 14, 15, 16,
00060 17, 18, 19, 20, 21, 22, 23, 24,
00061 25, 27, 29, 31, 33, 34, 35, 36,
00062 37, 38, 39, 40, 41, 42, 43, 44,
00063 46, 48, 49, 50, 51, 52, 53, 54,
00064 55, 56, 57, 58, 59, 60, 61, 62,
00065 64, 65, 66, 67, 68, 69, 70, 71,
00066 72, 73, 74, 75, 76, 77, 78, 79,
00067
00068
00069
00070 80, 82, 83, 84, 85, 86, 87, 88,
00071 89, 90, 91, 92, 93, 94, 95, 96,
00072 97, 98, 99, 100, 101, 102, 103, 104,
00073 105, 106, 107, 108, 109, 110, 111, 112,
00074 113, 114, 115, 116, 117, 118, 119, 120,
00075 121, 122, 123, 124, 125, 126, 127, 128};
00076
00077 unsigned char a2u[128] = {
00078 1, 3, 5, 7, 9, 11, 13, 15,
00079 16, 17, 18, 19, 20, 21, 22, 23,
00080 24, 25, 26, 27, 28, 29, 30, 31,
00081 32, 32, 33, 33, 34, 34, 35, 35,
00082 36, 37, 38, 39, 40, 41, 42, 43,
00083 44, 45, 46, 47, 48, 48, 49, 49,
00084 50, 51, 52, 53, 54, 55, 56, 57,
00085 58, 59, 60, 61, 62, 63, 64, 64,
00086 65, 66, 67, 68, 69, 70, 71, 72,
00087
00088
00089
00090 73, 74, 75, 76, 77, 78, 79, 80,
00091
00092 80, 81, 82, 83, 84, 85, 86, 87,
00093 88, 89, 90, 91, 92, 93, 94, 95,
00094 96, 97, 98, 99, 100, 101, 102, 103,
00095 104, 105, 106, 107, 108, 109, 110, 111,
00096 112, 113, 114, 115, 116, 117, 118, 119,
00097 120, 121, 122, 123, 124, 125, 126, 127};
00098
00099 static int
00100 search(
00101 int val,
00102 int * table,
00103 int size)
00104 {
00105 int i;
00106
00107 for (i = 0; i < size; i++) {
00108 if (val <= *table++)
00109 return (i);
00110 }
00111 return (size);
00112 }
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133 int linear2alaw(int pcm_val)
00134
00135 {
00136 int mask;
00137 int seg;
00138 int aval;
00139
00140 pcm_val = pcm_val >> 3;
00141
00142 if (pcm_val >= 0) {
00143 mask = 0xD5;
00144 } else {
00145 mask = 0x55;
00146 pcm_val = -pcm_val - 1;
00147 }
00148
00149
00150 seg = search(pcm_val, seg_aend, 8);
00151
00152
00153
00154 if (seg >= 8)
00155 return (0x7F ^ mask);
00156 else {
00157 aval = seg << SEG_SHIFT;
00158 if (seg < 2)
00159 aval |= (pcm_val >> 1) & QUANT_MASK;
00160 else
00161 aval |= (pcm_val >> seg) & QUANT_MASK;
00162 return (aval ^ mask);
00163 }
00164 }
00165
00166
00167
00168
00169
00170 int alaw2linear(int a_val)
00171 {
00172 int t;
00173 int seg;
00174
00175 a_val ^= 0x55;
00176
00177 t = (a_val & QUANT_MASK) << 4;
00178 seg = ((unsigned)a_val & SEG_MASK) >> SEG_SHIFT;
00179 switch (seg) {
00180 case 0:
00181 t += 8;
00182 break;
00183 case 1:
00184 t += 0x108;
00185 break;
00186 default:
00187 t += 0x108;
00188 t <<= seg - 1;
00189 }
00190 return ((a_val & SIGN_BIT) ? t : -t);
00191 }
00192
00193 #define BIAS (0x84)
00194 #define CLIP 8159
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225 int linear2ulaw( int pcm_val)
00226 {
00227 int mask;
00228 int seg;
00229 int uval;
00230
00231
00232 pcm_val = pcm_val >> 2;
00233 if (pcm_val < 0) {
00234 pcm_val = -pcm_val;
00235 mask = 0x7F;
00236 } else {
00237 mask = 0xFF;
00238 }
00239 if ( pcm_val > CLIP ) pcm_val = CLIP;
00240 pcm_val += (BIAS >> 2);
00241
00242
00243 seg = search(pcm_val, seg_uend, 8);
00244
00245
00246
00247
00248
00249 if (seg >= 8)
00250 return (0x7F ^ mask);
00251 else {
00252 uval = (seg << 4) | ((pcm_val >> (seg + 1)) & 0xF);
00253 return (uval ^ mask);
00254 }
00255
00256 }
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267 int ulaw2linear( int u_val)
00268 {
00269 int t;
00270
00271
00272 u_val = ~u_val;
00273
00274
00275
00276
00277
00278 t = ((u_val & QUANT_MASK) << 3) + BIAS;
00279 t <<= (u_val & SEG_MASK) >> SEG_SHIFT;
00280
00281 return ((u_val & SIGN_BIT) ? (BIAS - t) : (t - BIAS));
00282 }
00283
00284 #if 0
00285
00286
00287 static int alaw2ulaw (int aval)
00288 {
00289 aval &= 0xff;
00290 return ((aval & 0x80) ? (0xFF ^ a2u[aval ^ 0xD5]) :
00291 (0x7F ^ a2u[aval ^ 0x55]));
00292 }
00293
00294
00295 static int ulaw2alaw (int uval)
00296 {
00297 uval &= 0xff;
00298 return ((uval & 0x80) ? (0xD5 ^ (u2a[0xFF ^ uval] - 1)) :
00299 (0x55 ^ (u2a[0x7F ^ uval] - 1)));
00300 }
00301
00302 #endif
00303