comparison src/shnplug/sulawalaw.c @ 1305:51bf0e431e02

Add SHNplug.
author William Pitcock <nenolod@atheme-project.org>
date Fri, 20 Jul 2007 10:29:54 -0500
parents
children
comparison
equal deleted inserted replaced
1300:c198ae31bb74 1305:51bf0e431e02
1 /*
2 * $Id: sulawalaw.c,v 1.5 2001/12/30 05:12:04 jason Exp $
3 */
4
5 #include <stdio.h>
6 #include <stdlib.h>
7 #include <stddef.h>
8 #include <math.h>
9 #include "shorten.h"
10
11 int Sulaw2lineartab[] = {-32124, -31100, -30076, -29052, -28028, -27004,
12 -25980, -24956, -23932, -22908, -21884, -20860, -19836, -18812,
13 -17788, -16764, -15996, -15484, -14972, -14460, -13948, -13436,
14 -12924, -12412, -11900, -11388, -10876, -10364, -9852, -9340, -8828,
15 -8316, -7932, -7676, -7420, -7164, -6908, -6652, -6396, -6140, -5884,
16 -5628, -5372, -5116, -4860, -4604, -4348, -4092, -3900, -3772, -3644,
17 -3516, -3388, -3260, -3132, -3004, -2876, -2748, -2620, -2492, -2364,
18 -2236, -2108, -1980, -1884, -1820, -1756, -1692, -1628, -1564, -1500,
19 -1436, -1372, -1308, -1244, -1180, -1116, -1052, -988, -924, -876,
20 -844, -812, -780, -748, -716, -684, -652, -620, -588, -556, -524,
21 -492, -460, -428, -396, -372, -356, -340, -324, -308, -292, -276,
22 -260, -244, -228, -212, -196, -180, -164, -148, -132, -120, -112,
23 -104, -96, -88, -80, -72, -64, -56, -48, -40, -32, -24, -16, -8, 0,
24 32124, 31100, 30076, 29052, 28028, 27004, 25980, 24956, 23932, 22908,
25 21884, 20860, 19836, 18812, 17788, 16764, 15996, 15484, 14972, 14460,
26 13948, 13436, 12924, 12412, 11900, 11388, 10876, 10364, 9852, 9340,
27 8828, 8316, 7932, 7676, 7420, 7164, 6908, 6652, 6396, 6140, 5884,
28 5628, 5372, 5116, 4860, 4604, 4348, 4092, 3900, 3772, 3644, 3516,
29 3388, 3260, 3132, 3004, 2876, 2748, 2620, 2492, 2364, 2236, 2108,
30 1980, 1884, 1820, 1756, 1692, 1628, 1564, 1500, 1436, 1372, 1308,
31 1244, 1180, 1116, 1052, 988, 924, 876, 844, 812, 780, 748, 716, 684,
32 652, 620, 588, 556, 524, 492, 460, 428, 396, 372, 356, 340, 324, 308,
33 292, 276, 260, 244, 228, 212, 196, 180, 164, 148, 132, 120, 112, 104,
34 96, 88, 80, 72, 64, 56, 48, 40, 32, 24, 16, 8, 0};
35
36 #ifndef Sulaw2linear
37 #ifdef __STDC__
38 int Sulaw2linear(uchar ulaw) {
39 #else
40 int Sulaw2linear(ulaw) uchar ulaw; {
41 #endif
42 return(Sulaw2lineartab[ulaw]);
43 }
44 #endif
45
46 /* adapted by ajr for int input */
47 #ifdef __STDC__
48 uchar Slinear2ulaw(int sample) {
49 #else
50 uchar Slinear2ulaw(sample) int sample; {
51 #endif
52 /*
53 ** This routine converts from linear to ulaw.
54 **
55 ** Craig Reese: IDA/Supercomputing Research Center
56 ** Joe Campbell: Department of Defense
57 ** 29 September 1989
58 **
59 ** References:
60 ** 1) CCITT Recommendation G.711 (very difficult to follow)
61 ** 2) "A New Digital Technique for Implementation of Any
62 ** Continuous PCM Companding Law," Villeret, Michel,
63 ** et al. 1973 IEEE Int. Conf. on Communications, Vol 1,
64 ** 1973, pg. 11.12-11.17
65 ** 3) MIL-STD-188-113,"Interoperability and Performance Standards
66 ** for Analog-to_Digital Conversion Techniques,"
67 ** 17 February 1987
68 **
69 ** Input: Signed 16 bit linear sample
70 ** Output: 8 bit ulaw sample
71 */
72
73 #define BIAS 0x84 /* define the add-in bias for 16 bit samples */
74 #define CLIP 32635
75
76 static int exp_lut[256] = {0,0,1,1,2,2,2,2,3,3,3,3,3,3,3,3,
77 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
78 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
79 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
80 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
81 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
82 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
83 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
84 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
85 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
86 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
87 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
88 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
89 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
90 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
91 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7};
92 int sign, exponent, mantissa;
93 uchar ulawbyte;
94
95 /* Get the sample into sign-magnitude. */
96 if(sample < 0) {
97 sign = 0x80;
98 sample = -sample;
99 }
100 else
101 sign = 0;
102
103 /* clip the magnitude */
104 if(sample > CLIP) sample = CLIP;
105
106 /* Convert from 16 bit linear to ulaw. */
107 sample = sample + BIAS;
108 exponent = exp_lut[( sample >> 7 ) & 0xFF];
109 mantissa = (sample >> (exponent + 3)) & 0x0F;
110 ulawbyte = ~(sign | (exponent << 4) | mantissa);
111
112 return(ulawbyte);
113 }
114
115
116 /******************
117 * ALAW starts here
118 */
119
120 int Salaw2lineartab[] = {-5504, -5248, -6016, -5760, -4480, -4224,
121 -4992, -4736, -7552, -7296, -8064, -7808, -6528, -6272, -7040, -6784,
122 -2752, -2624, -3008, -2880, -2240, -2112, -2496, -2368, -3776, -3648,
123 -4032, -3904, -3264, -3136, -3520, -3392, -22016, -20992, -24064,
124 -23040, -17920, -16896, -19968, -18944, -30208, -29184, -32256,
125 -31232, -26112, -25088, -28160, -27136, -11008, -10496, -12032,
126 -11520, -8960, -8448, -9984, -9472, -15104, -14592, -16128, -15616,
127 -13056, -12544, -14080, -13568, -344, -328, -376, -360, -280, -264,
128 -312, -296, -472, -456, -504, -488, -408, -392, -440, -424, -88, -72,
129 -120, -104, -24, -8, -56, -40, -216, -200, -248, -232, -152, -136,
130 -184, -168, -1376, -1312, -1504, -1440, -1120, -1056, -1248, -1184,
131 -1888, -1824, -2016, -1952, -1632, -1568, -1760, -1696, -688, -656,
132 -752, -720, -560, -528, -624, -592, -944, -912, -1008, -976, -816,
133 -784, -880, -848, 5504, 5248, 6016, 5760, 4480, 4224, 4992, 4736,
134 7552, 7296, 8064, 7808, 6528, 6272, 7040, 6784, 2752, 2624, 3008,
135 2880, 2240, 2112, 2496, 2368, 3776, 3648, 4032, 3904, 3264, 3136,
136 3520, 3392, 22016, 20992, 24064, 23040, 17920, 16896, 19968, 18944,
137 30208, 29184, 32256, 31232, 26112, 25088, 28160, 27136, 11008, 10496,
138 12032, 11520, 8960, 8448, 9984, 9472, 15104, 14592, 16128, 15616,
139 13056, 12544, 14080, 13568, 344, 328, 376, 360, 280, 264, 312, 296,
140 472, 456, 504, 488, 408, 392, 440, 424, 88, 72, 120, 104, 24, 8, 56,
141 40, 216, 200, 248, 232, 152, 136, 184, 168, 1376, 1312, 1504, 1440,
142 1120, 1056, 1248, 1184, 1888, 1824, 2016, 1952, 1632, 1568, 1760,
143 1696, 688, 656, 752, 720, 560, 528, 624, 592, 944, 912, 1008, 976,
144 816, 784, 880, 848};
145
146 #ifndef Salaw2linear
147 #ifdef __STDC__
148 int Salaw2linear(uchar alaw) {
149 #else
150 int Salaw2linear(alaw) uchar alaw; {
151 #endif
152 return(Salaw2lineartab[alaw]);
153 }
154 #endif
155
156 /* this is derived from the Sun code - it is a bit simpler and has int input */
157 #define QUANT_MASK (0xf) /* Quantization field mask. */
158 #define NSEGS (8) /* Number of A-law segments. */
159 #define SEG_SHIFT (4) /* Left shift for segment number. */
160 #ifdef __STDC__
161 uchar Slinear2alaw(int linear) {
162 #else
163 uchar Slinear2alaw(linear) int linear; {
164 #endif
165 int seg;
166 uchar aval, mask;
167 static sshort seg_aend[NSEGS] = {0x1f,0x3f,0x7f,0xff,0x1ff,0x3ff,0x7ff,0xfff};
168
169 linear = linear >> 3;
170
171 if(linear >= 0) {
172 mask = 0xd5; /* sign (7th) bit = 1 */
173 } else {
174 mask = 0x55; /* sign bit = 0 */
175 linear = -linear - 1;
176 }
177
178 /* Convert the scaled magnitude to segment number. */
179 for(seg = 0; seg < NSEGS && linear > seg_aend[seg]; seg++);
180
181 /* Combine the sign, segment, and quantization bits. */
182 if(seg >= NSEGS) /* out of range, return maximum value. */
183 return (uchar) (0x7F ^ mask);
184 else {
185 aval = (uchar) seg << SEG_SHIFT;
186 if (seg < 2)
187 aval |= (linear >> 1) & QUANT_MASK;
188 else
189 aval |= (linear >> seg) & QUANT_MASK;
190 return (aval ^ mask);
191 }
192 }