2 * Audio support data for mISDN_dsp.
4 * Copyright 2002/2003 by Andreas Eversberg (jolly@eversberg.eu)
7 * This software may be used and distributed according to the terms
8 * of the GNU General Public License, incorporated herein by reference.
12 #include <linux/delay.h>
13 #include <linux/mISDNif.h>
14 #include <linux/mISDNdsp.h>
18 /* ulaw[unsigned char] -> signed 16-bit */
19 s32 dsp_audio_ulaw_to_s32[256];
20 /* alaw[unsigned char] -> signed 16-bit */
21 s32 dsp_audio_alaw_to_s32[256];
23 s32 *dsp_audio_law_to_s32;
24 EXPORT_SYMBOL(dsp_audio_law_to_s32);
26 /* signed 16-bit -> law */
27 u8 dsp_audio_s16_to_law[65536];
28 EXPORT_SYMBOL(dsp_audio_s16_to_law);
31 u8 dsp_audio_alaw_to_ulaw[256];
33 static u8 dsp_audio_ulaw_to_alaw[256];
37 /*****************************************************
38 * generate table for conversion of s16 to alaw/ulaw *
39 *****************************************************/
43 static inline unsigned char linear2alaw(short int linear)
48 static int seg_end[8] = {
49 0xFF, 0x1FF, 0x3FF, 0x7FF, 0xFFF, 0x1FFF, 0x3FFF, 0x7FFF
54 /* Sign (7th) bit = 1 */
55 mask = AMI_MASK | 0x80;
62 /* Convert the scaled magnitude to segment number. */
63 for (seg = 0; seg < 8; seg++) {
64 if (pcm_val <= seg_end[seg])
67 /* Combine the sign, segment, and quantization bits. */
69 ((pcm_val >> ((seg) ? (seg + 3) : 4)) & 0x0F)) ^ mask;
73 static inline short int alaw2linear(unsigned char alaw)
79 i = ((alaw & 0x0F) << 4) + 8 /* rounding error */;
80 seg = (((int) alaw & 0x70) >> 4);
82 i = (i + 0x100) << (seg - 1);
83 return (short int) ((alaw & 0x80) ? i : -i);
86 static inline short int ulaw2linear(unsigned char ulaw)
89 static short etab[] = {0, 132, 396, 924, 1980, 4092, 8316, 16764};
94 y = f * (1 << (e + 3));
101 #define BIAS 0x84 /*!< define the add-in bias for 16 bit samples */
103 static unsigned char linear2ulaw(short sample)
105 static int exp_lut[256] = {
106 0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
107 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
108 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
109 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
110 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
111 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
112 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
113 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
114 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
115 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
116 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
117 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
118 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
119 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
120 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
121 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7};
122 int sign, exponent, mantissa;
123 unsigned char ulawbyte;
125 /* Get the sample into sign-magnitude. */
126 sign = (sample >> 8) & 0x80; /* set aside the sign */
128 sample = -sample; /* get magnitude */
130 /* Convert from 16 bit linear to ulaw. */
131 sample = sample + BIAS;
132 exponent = exp_lut[(sample >> 7) & 0xFF];
133 mantissa = (sample >> (exponent + 3)) & 0x0F;
134 ulawbyte = ~(sign | (exponent << 4) | mantissa);
139 static int reverse_bits(int i)
144 for (j = 0; j < 8; j++) {
145 if ((i & (1 << j)) != 0)
152 void dsp_audio_generate_law_tables(void)
155 for (i = 0; i < 256; i++)
156 dsp_audio_alaw_to_s32[i] = alaw2linear(reverse_bits(i));
158 for (i = 0; i < 256; i++)
159 dsp_audio_ulaw_to_s32[i] = ulaw2linear(reverse_bits(i));
161 for (i = 0; i < 256; i++) {
162 dsp_audio_alaw_to_ulaw[i] =
163 linear2ulaw(dsp_audio_alaw_to_s32[i]);
164 dsp_audio_ulaw_to_alaw[i] =
165 linear2alaw(dsp_audio_ulaw_to_s32[i]);
170 dsp_audio_generate_s2law_table(void)
174 if (dsp_options & DSP_OPT_ULAW) {
175 /* generating ulaw-table */
176 for (i = -32768; i < 32768; i++) {
177 dsp_audio_s16_to_law[i & 0xffff] =
178 reverse_bits(linear2ulaw(i));
181 /* generating alaw-table */
182 for (i = -32768; i < 32768; i++) {
183 dsp_audio_s16_to_law[i & 0xffff] =
184 reverse_bits(linear2alaw(i));
191 * the seven bit sample is the number of every second alaw-sample ordered by
192 * aplitude. 0x00 is negative, 0x7f is positive amplitude.
194 u8 dsp_audio_seven2law[128];
195 u8 dsp_audio_law2seven[256];
197 /********************************************************************
198 * generate table for conversion law from/to 7-bit alaw-like sample *
199 ********************************************************************/
202 dsp_audio_generate_seven(void)
208 /* generate alaw table, sorted by the linear value */
209 for (i = 0; i < 256; i++) {
211 for (k = 0; k < 256; k++) {
212 if (dsp_audio_alaw_to_s32[k]
213 < dsp_audio_alaw_to_s32[i])
219 /* generate tabels */
220 for (i = 0; i < 256; i++) {
221 /* spl is the source: the law-sample (converted to alaw) */
223 if (dsp_options & DSP_OPT_ULAW)
224 spl = dsp_audio_ulaw_to_alaw[i];
225 /* find the 7-bit-sample */
226 for (j = 0; j < 256; j++) {
227 if (sorted_alaw[j] == spl)
230 /* write 7-bit audio value */
231 dsp_audio_law2seven[i] = j >> 1;
233 for (i = 0; i < 128; i++) {
234 spl = sorted_alaw[i << 1];
235 if (dsp_options & DSP_OPT_ULAW)
236 spl = dsp_audio_alaw_to_ulaw[spl];
237 dsp_audio_seven2law[i] = spl;
242 /* mix 2*law -> law */
243 u8 dsp_audio_mix_law[65536];
245 /******************************************************
246 * generate mix table to mix two law samples into one *
247 ******************************************************/
250 dsp_audio_generate_mix_table(void)
259 sample = dsp_audio_law_to_s32[i];
260 sample += dsp_audio_law_to_s32[j];
265 dsp_audio_mix_law[(i<<8)|j] =
266 dsp_audio_s16_to_law[sample & 0xffff];
274 /*************************************
275 * generate different volume changes *
276 *************************************/
278 static u8 dsp_audio_reduce8[256];
279 static u8 dsp_audio_reduce7[256];
280 static u8 dsp_audio_reduce6[256];
281 static u8 dsp_audio_reduce5[256];
282 static u8 dsp_audio_reduce4[256];
283 static u8 dsp_audio_reduce3[256];
284 static u8 dsp_audio_reduce2[256];
285 static u8 dsp_audio_reduce1[256];
286 static u8 dsp_audio_increase1[256];
287 static u8 dsp_audio_increase2[256];
288 static u8 dsp_audio_increase3[256];
289 static u8 dsp_audio_increase4[256];
290 static u8 dsp_audio_increase5[256];
291 static u8 dsp_audio_increase6[256];
292 static u8 dsp_audio_increase7[256];
293 static u8 dsp_audio_increase8[256];
295 static u8 *dsp_audio_volume_change[16] = {
315 dsp_audio_generate_volume_changes(void)
319 int num[] = { 110, 125, 150, 175, 200, 300, 400, 500 };
320 int denum[] = { 100, 100, 100, 100, 100, 100, 100, 100 };
324 dsp_audio_reduce8[i] = dsp_audio_s16_to_law[
325 (dsp_audio_law_to_s32[i] * denum[7] / num[7]) & 0xffff];
326 dsp_audio_reduce7[i] = dsp_audio_s16_to_law[
327 (dsp_audio_law_to_s32[i] * denum[6] / num[6]) & 0xffff];
328 dsp_audio_reduce6[i] = dsp_audio_s16_to_law[
329 (dsp_audio_law_to_s32[i] * denum[5] / num[5]) & 0xffff];
330 dsp_audio_reduce5[i] = dsp_audio_s16_to_law[
331 (dsp_audio_law_to_s32[i] * denum[4] / num[4]) & 0xffff];
332 dsp_audio_reduce4[i] = dsp_audio_s16_to_law[
333 (dsp_audio_law_to_s32[i] * denum[3] / num[3]) & 0xffff];
334 dsp_audio_reduce3[i] = dsp_audio_s16_to_law[
335 (dsp_audio_law_to_s32[i] * denum[2] / num[2]) & 0xffff];
336 dsp_audio_reduce2[i] = dsp_audio_s16_to_law[
337 (dsp_audio_law_to_s32[i] * denum[1] / num[1]) & 0xffff];
338 dsp_audio_reduce1[i] = dsp_audio_s16_to_law[
339 (dsp_audio_law_to_s32[i] * denum[0] / num[0]) & 0xffff];
340 sample = dsp_audio_law_to_s32[i] * num[0] / denum[0];
343 else if (sample > 32767)
345 dsp_audio_increase1[i] = dsp_audio_s16_to_law[sample & 0xffff];
346 sample = dsp_audio_law_to_s32[i] * num[1] / denum[1];
349 else if (sample > 32767)
351 dsp_audio_increase2[i] = dsp_audio_s16_to_law[sample & 0xffff];
352 sample = dsp_audio_law_to_s32[i] * num[2] / denum[2];
355 else if (sample > 32767)
357 dsp_audio_increase3[i] = dsp_audio_s16_to_law[sample & 0xffff];
358 sample = dsp_audio_law_to_s32[i] * num[3] / denum[3];
361 else if (sample > 32767)
363 dsp_audio_increase4[i] = dsp_audio_s16_to_law[sample & 0xffff];
364 sample = dsp_audio_law_to_s32[i] * num[4] / denum[4];
367 else if (sample > 32767)
369 dsp_audio_increase5[i] = dsp_audio_s16_to_law[sample & 0xffff];
370 sample = dsp_audio_law_to_s32[i] * num[5] / denum[5];
373 else if (sample > 32767)
375 dsp_audio_increase6[i] = dsp_audio_s16_to_law[sample & 0xffff];
376 sample = dsp_audio_law_to_s32[i] * num[6] / denum[6];
379 else if (sample > 32767)
381 dsp_audio_increase7[i] = dsp_audio_s16_to_law[sample & 0xffff];
382 sample = dsp_audio_law_to_s32[i] * num[7] / denum[7];
385 else if (sample > 32767)
387 dsp_audio_increase8[i] = dsp_audio_s16_to_law[sample & 0xffff];
394 /**************************************
395 * change the volume of the given skb *
396 **************************************/
398 /* this is a helper function for changing volume of skb. the range may be
399 * -8 to 8, which is a shift to the power of 2. 0 == no volume, 3 == volume*8
402 dsp_change_volume(struct sk_buff *skb, int volume)
412 /* get correct conversion table */
422 volume_change = dsp_audio_volume_change[shift];
428 *p = volume_change[*p];