• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Audio support data for mISDN_dsp.
3  *
4  * Copyright 2002/2003 by Andreas Eversberg (jolly@eversberg.eu)
5  * Rewritten by Peter
6  *
7  * This software may be used and distributed according to the terms
8  * of the GNU General Public License, incorporated herein by reference.
9  *
10  */
11 
12 #include <linux/delay.h>
13 #include <linux/mISDNif.h>
14 #include <linux/mISDNdsp.h>
15 #include "core.h"
16 #include "dsp.h"
17 
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];
22 
23 s32 *dsp_audio_law_to_s32;
24 EXPORT_SYMBOL(dsp_audio_law_to_s32);
25 
26 /* signed 16-bit -> law */
27 u8 dsp_audio_s16_to_law[65536];
28 EXPORT_SYMBOL(dsp_audio_s16_to_law);
29 
30 /* alaw -> ulaw */
31 u8 dsp_audio_alaw_to_ulaw[256];
32 /* ulaw -> alaw */
33 static u8 dsp_audio_ulaw_to_alaw[256];
34 u8 dsp_silence;
35 
36 
37 /*****************************************************
38  * generate table for conversion of s16 to alaw/ulaw *
39  *****************************************************/
40 
41 #define AMI_MASK 0x55
42 
linear2alaw(short int linear)43 static inline unsigned char linear2alaw(short int linear)
44 {
45 	int mask;
46 	int seg;
47 	int pcm_val;
48 	static int seg_end[8] = {
49 		0xFF, 0x1FF, 0x3FF, 0x7FF, 0xFFF, 0x1FFF, 0x3FFF, 0x7FFF
50 	};
51 
52 	pcm_val = linear;
53 	if (pcm_val >= 0) {
54 		/* Sign (7th) bit = 1 */
55 		mask = AMI_MASK | 0x80;
56 	} else {
57 		/* Sign bit = 0 */
58 		mask = AMI_MASK;
59 		pcm_val = -pcm_val;
60 	}
61 
62 	/* Convert the scaled magnitude to segment number. */
63 	for (seg = 0;  seg < 8;  seg++) {
64 		if (pcm_val <= seg_end[seg])
65 			break;
66 	}
67 	/* Combine the sign, segment, and quantization bits. */
68 	return  ((seg << 4) |
69 		 ((pcm_val >> ((seg)  ?  (seg + 3)  :  4)) & 0x0F)) ^ mask;
70 }
71 
72 
alaw2linear(unsigned char alaw)73 static inline short int alaw2linear(unsigned char alaw)
74 {
75 	int i;
76 	int seg;
77 
78 	alaw ^= AMI_MASK;
79 	i = ((alaw & 0x0F) << 4) + 8 /* rounding error */;
80 	seg = (((int) alaw & 0x70) >> 4);
81 	if (seg)
82 		i = (i + 0x100) << (seg - 1);
83 	return (short int) ((alaw & 0x80)  ?  i  :  -i);
84 }
85 
ulaw2linear(unsigned char ulaw)86 static inline short int ulaw2linear(unsigned char ulaw)
87 {
88 	short mu, e, f, y;
89 	static short etab[] = {0, 132, 396, 924, 1980, 4092, 8316, 16764};
90 
91 	mu = 255 - ulaw;
92 	e = (mu & 0x70) / 16;
93 	f = mu & 0x0f;
94 	y = f * (1 << (e + 3));
95 	y += etab[e];
96 	if (mu & 0x80)
97 		y = -y;
98 	return y;
99 }
100 
101 #define BIAS 0x84   /*!< define the add-in bias for 16 bit samples */
102 
linear2ulaw(short sample)103 static unsigned char linear2ulaw(short sample)
104 {
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;
124 
125 	/* Get the sample into sign-magnitude. */
126 	sign = (sample >> 8) & 0x80;	  /* set aside the sign */
127 	if (sign != 0)
128 		sample = -sample;	      /* get magnitude */
129 
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);
135 
136 	return ulawbyte;
137 }
138 
reverse_bits(int i)139 static int reverse_bits(int i)
140 {
141 	int z, j;
142 	z = 0;
143 
144 	for (j = 0; j < 8; j++) {
145 		if ((i & (1 << j)) != 0)
146 			z |= 1 << (7 - j);
147 	}
148 	return z;
149 }
150 
151 
dsp_audio_generate_law_tables(void)152 void dsp_audio_generate_law_tables(void)
153 {
154 	int i;
155 	for (i = 0; i < 256; i++)
156 		dsp_audio_alaw_to_s32[i] = alaw2linear(reverse_bits(i));
157 
158 	for (i = 0; i < 256; i++)
159 		dsp_audio_ulaw_to_s32[i] = ulaw2linear(reverse_bits(i));
160 
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]);
166 	}
167 }
168 
169 void
dsp_audio_generate_s2law_table(void)170 dsp_audio_generate_s2law_table(void)
171 {
172 	int i;
173 
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));
179 		}
180 	} else {
181 		/* generating alaw-table */
182 		for (i = -32768; i < 32768; i++) {
183 			dsp_audio_s16_to_law[i & 0xffff] =
184 				reverse_bits(linear2alaw(i));
185 		}
186 	}
187 }
188 
189 
190 /*
191  * the seven bit sample is the number of every second alaw-sample ordered by
192  * aplitude. 0x00 is negative, 0x7f is positive amplitude.
193  */
194 u8 dsp_audio_seven2law[128];
195 u8 dsp_audio_law2seven[256];
196 
197 /********************************************************************
198  * generate table for conversion law from/to 7-bit alaw-like sample *
199  ********************************************************************/
200 
201 void
dsp_audio_generate_seven(void)202 dsp_audio_generate_seven(void)
203 {
204 	int i, j, k;
205 	u8 spl;
206 	u8 sorted_alaw[256];
207 
208 	/* generate alaw table, sorted by the linear value */
209 	for (i = 0; i < 256; i++) {
210 		j = 0;
211 		for (k = 0; k < 256; k++) {
212 			if (dsp_audio_alaw_to_s32[k]
213 				< dsp_audio_alaw_to_s32[i]) {
214 			j++;
215 			}
216 		}
217 		sorted_alaw[j] = i;
218 	}
219 
220 	/* generate tabels */
221 	for (i = 0; i < 256; i++) {
222 		/* spl is the source: the law-sample (converted to alaw) */
223 		spl = i;
224 		if (dsp_options & DSP_OPT_ULAW)
225 			spl = dsp_audio_ulaw_to_alaw[i];
226 		/* find the 7-bit-sample */
227 		for (j = 0; j < 256; j++) {
228 			if (sorted_alaw[j] == spl)
229 				break;
230 		}
231 		/* write 7-bit audio value */
232 		dsp_audio_law2seven[i] = j >> 1;
233 	}
234 	for (i = 0; i < 128; i++) {
235 		spl = sorted_alaw[i << 1];
236 		if (dsp_options & DSP_OPT_ULAW)
237 			spl = dsp_audio_alaw_to_ulaw[spl];
238 		dsp_audio_seven2law[i] = spl;
239 	}
240 }
241 
242 
243 /* mix 2*law -> law */
244 u8 dsp_audio_mix_law[65536];
245 
246 /******************************************************
247  * generate mix table to mix two law samples into one *
248  ******************************************************/
249 
250 void
dsp_audio_generate_mix_table(void)251 dsp_audio_generate_mix_table(void)
252 {
253 	int i, j;
254 	s32 sample;
255 
256 	i = 0;
257 	while (i < 256) {
258 		j = 0;
259 		while (j < 256) {
260 			sample = dsp_audio_law_to_s32[i];
261 			sample += dsp_audio_law_to_s32[j];
262 			if (sample > 32767)
263 				sample = 32767;
264 			if (sample < -32768)
265 				sample = -32768;
266 			dsp_audio_mix_law[(i<<8)|j] =
267 				dsp_audio_s16_to_law[sample & 0xffff];
268 			j++;
269 		}
270 		i++;
271 	}
272 }
273 
274 
275 /*************************************
276  * generate different volume changes *
277  *************************************/
278 
279 static u8 dsp_audio_reduce8[256];
280 static u8 dsp_audio_reduce7[256];
281 static u8 dsp_audio_reduce6[256];
282 static u8 dsp_audio_reduce5[256];
283 static u8 dsp_audio_reduce4[256];
284 static u8 dsp_audio_reduce3[256];
285 static u8 dsp_audio_reduce2[256];
286 static u8 dsp_audio_reduce1[256];
287 static u8 dsp_audio_increase1[256];
288 static u8 dsp_audio_increase2[256];
289 static u8 dsp_audio_increase3[256];
290 static u8 dsp_audio_increase4[256];
291 static u8 dsp_audio_increase5[256];
292 static u8 dsp_audio_increase6[256];
293 static u8 dsp_audio_increase7[256];
294 static u8 dsp_audio_increase8[256];
295 
296 static u8 *dsp_audio_volume_change[16] = {
297 	dsp_audio_reduce8,
298 	dsp_audio_reduce7,
299 	dsp_audio_reduce6,
300 	dsp_audio_reduce5,
301 	dsp_audio_reduce4,
302 	dsp_audio_reduce3,
303 	dsp_audio_reduce2,
304 	dsp_audio_reduce1,
305 	dsp_audio_increase1,
306 	dsp_audio_increase2,
307 	dsp_audio_increase3,
308 	dsp_audio_increase4,
309 	dsp_audio_increase5,
310 	dsp_audio_increase6,
311 	dsp_audio_increase7,
312 	dsp_audio_increase8,
313 };
314 
315 void
dsp_audio_generate_volume_changes(void)316 dsp_audio_generate_volume_changes(void)
317 {
318 	register s32 sample;
319 	int i;
320 	int num[]   = { 110, 125, 150, 175, 200, 300, 400, 500 };
321 	int denum[] = { 100, 100, 100, 100, 100, 100, 100, 100 };
322 
323 	i = 0;
324 	while (i < 256) {
325 		dsp_audio_reduce8[i] = dsp_audio_s16_to_law[
326 			(dsp_audio_law_to_s32[i] * denum[7] / num[7]) & 0xffff];
327 		dsp_audio_reduce7[i] = dsp_audio_s16_to_law[
328 			(dsp_audio_law_to_s32[i] * denum[6] / num[6]) & 0xffff];
329 		dsp_audio_reduce6[i] = dsp_audio_s16_to_law[
330 			(dsp_audio_law_to_s32[i] * denum[5] / num[5]) & 0xffff];
331 		dsp_audio_reduce5[i] = dsp_audio_s16_to_law[
332 			(dsp_audio_law_to_s32[i] * denum[4] / num[4]) & 0xffff];
333 		dsp_audio_reduce4[i] = dsp_audio_s16_to_law[
334 			(dsp_audio_law_to_s32[i] * denum[3] / num[3]) & 0xffff];
335 		dsp_audio_reduce3[i] = dsp_audio_s16_to_law[
336 			(dsp_audio_law_to_s32[i] * denum[2] / num[2]) & 0xffff];
337 		dsp_audio_reduce2[i] = dsp_audio_s16_to_law[
338 			(dsp_audio_law_to_s32[i] * denum[1] / num[1]) & 0xffff];
339 		dsp_audio_reduce1[i] = dsp_audio_s16_to_law[
340 			(dsp_audio_law_to_s32[i] * denum[0] / num[0]) & 0xffff];
341 		sample = dsp_audio_law_to_s32[i] * num[0] / denum[0];
342 		if (sample < -32768)
343 			sample = -32768;
344 		else if (sample > 32767)
345 			sample = 32767;
346 		dsp_audio_increase1[i] = dsp_audio_s16_to_law[sample & 0xffff];
347 		sample = dsp_audio_law_to_s32[i] * num[1] / denum[1];
348 		if (sample < -32768)
349 			sample = -32768;
350 		else if (sample > 32767)
351 			sample = 32767;
352 		dsp_audio_increase2[i] = dsp_audio_s16_to_law[sample & 0xffff];
353 		sample = dsp_audio_law_to_s32[i] * num[2] / denum[2];
354 		if (sample < -32768)
355 			sample = -32768;
356 		else if (sample > 32767)
357 			sample = 32767;
358 		dsp_audio_increase3[i] = dsp_audio_s16_to_law[sample & 0xffff];
359 		sample = dsp_audio_law_to_s32[i] * num[3] / denum[3];
360 		if (sample < -32768)
361 			sample = -32768;
362 		else if (sample > 32767)
363 			sample = 32767;
364 		dsp_audio_increase4[i] = dsp_audio_s16_to_law[sample & 0xffff];
365 		sample = dsp_audio_law_to_s32[i] * num[4] / denum[4];
366 		if (sample < -32768)
367 			sample = -32768;
368 		else if (sample > 32767)
369 			sample = 32767;
370 		dsp_audio_increase5[i] = dsp_audio_s16_to_law[sample & 0xffff];
371 		sample = dsp_audio_law_to_s32[i] * num[5] / denum[5];
372 		if (sample < -32768)
373 			sample = -32768;
374 		else if (sample > 32767)
375 			sample = 32767;
376 		dsp_audio_increase6[i] = dsp_audio_s16_to_law[sample & 0xffff];
377 		sample = dsp_audio_law_to_s32[i] * num[6] / denum[6];
378 		if (sample < -32768)
379 			sample = -32768;
380 		else if (sample > 32767)
381 			sample = 32767;
382 		dsp_audio_increase7[i] = dsp_audio_s16_to_law[sample & 0xffff];
383 		sample = dsp_audio_law_to_s32[i] * num[7] / denum[7];
384 		if (sample < -32768)
385 			sample = -32768;
386 		else if (sample > 32767)
387 			sample = 32767;
388 		dsp_audio_increase8[i] = dsp_audio_s16_to_law[sample & 0xffff];
389 
390 		i++;
391 	}
392 }
393 
394 
395 /**************************************
396  * change the volume of the given skb *
397  **************************************/
398 
399 /* this is a helper function for changing volume of skb. the range may be
400  * -8 to 8, which is a shift to the power of 2. 0 == no volume, 3 == volume*8
401  */
402 void
dsp_change_volume(struct sk_buff * skb,int volume)403 dsp_change_volume(struct sk_buff *skb, int volume)
404 {
405 	u8 *volume_change;
406 	int i, ii;
407 	u8 *p;
408 	int shift;
409 
410 	if (volume == 0)
411 		return;
412 
413 	/* get correct conversion table */
414 	if (volume < 0) {
415 		shift = volume + 8;
416 		if (shift < 0)
417 			shift = 0;
418 	} else {
419 		shift = volume + 7;
420 		if (shift > 15)
421 			shift = 15;
422 	}
423 	volume_change = dsp_audio_volume_change[shift];
424 	i = 0;
425 	ii = skb->len;
426 	p = skb->data;
427 	/* change volume */
428 	while (i < ii) {
429 		*p = volume_change[*p];
430 		p++;
431 		i++;
432 	}
433 }
434 
435