162306a36Sopenharmony_ci/*
262306a36Sopenharmony_ci * Audio support data for mISDN_dsp.
362306a36Sopenharmony_ci *
462306a36Sopenharmony_ci * Copyright 2002/2003 by Andreas Eversberg (jolly@eversberg.eu)
562306a36Sopenharmony_ci * Rewritten by Peter
662306a36Sopenharmony_ci *
762306a36Sopenharmony_ci * This software may be used and distributed according to the terms
862306a36Sopenharmony_ci * of the GNU General Public License, incorporated herein by reference.
962306a36Sopenharmony_ci *
1062306a36Sopenharmony_ci */
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci#include <linux/delay.h>
1362306a36Sopenharmony_ci#include <linux/mISDNif.h>
1462306a36Sopenharmony_ci#include <linux/mISDNdsp.h>
1562306a36Sopenharmony_ci#include <linux/export.h>
1662306a36Sopenharmony_ci#include <linux/bitrev.h>
1762306a36Sopenharmony_ci#include "core.h"
1862306a36Sopenharmony_ci#include "dsp.h"
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci/* ulaw[unsigned char] -> signed 16-bit */
2162306a36Sopenharmony_cis32 dsp_audio_ulaw_to_s32[256];
2262306a36Sopenharmony_ci/* alaw[unsigned char] -> signed 16-bit */
2362306a36Sopenharmony_cis32 dsp_audio_alaw_to_s32[256];
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_cis32 *dsp_audio_law_to_s32;
2662306a36Sopenharmony_ciEXPORT_SYMBOL(dsp_audio_law_to_s32);
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_ci/* signed 16-bit -> law */
2962306a36Sopenharmony_ciu8 dsp_audio_s16_to_law[65536];
3062306a36Sopenharmony_ciEXPORT_SYMBOL(dsp_audio_s16_to_law);
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ci/* alaw -> ulaw */
3362306a36Sopenharmony_ciu8 dsp_audio_alaw_to_ulaw[256];
3462306a36Sopenharmony_ci/* ulaw -> alaw */
3562306a36Sopenharmony_cistatic u8 dsp_audio_ulaw_to_alaw[256];
3662306a36Sopenharmony_ciu8 dsp_silence;
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_ci/*****************************************************
4062306a36Sopenharmony_ci * generate table for conversion of s16 to alaw/ulaw *
4162306a36Sopenharmony_ci *****************************************************/
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_ci#define AMI_MASK 0x55
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_cistatic inline unsigned char linear2alaw(short int linear)
4662306a36Sopenharmony_ci{
4762306a36Sopenharmony_ci	int mask;
4862306a36Sopenharmony_ci	int seg;
4962306a36Sopenharmony_ci	int pcm_val;
5062306a36Sopenharmony_ci	static int seg_end[8] = {
5162306a36Sopenharmony_ci		0xFF, 0x1FF, 0x3FF, 0x7FF, 0xFFF, 0x1FFF, 0x3FFF, 0x7FFF
5262306a36Sopenharmony_ci	};
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_ci	pcm_val = linear;
5562306a36Sopenharmony_ci	if (pcm_val >= 0) {
5662306a36Sopenharmony_ci		/* Sign (7th) bit = 1 */
5762306a36Sopenharmony_ci		mask = AMI_MASK | 0x80;
5862306a36Sopenharmony_ci	} else {
5962306a36Sopenharmony_ci		/* Sign bit = 0 */
6062306a36Sopenharmony_ci		mask = AMI_MASK;
6162306a36Sopenharmony_ci		pcm_val = -pcm_val;
6262306a36Sopenharmony_ci	}
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_ci	/* Convert the scaled magnitude to segment number. */
6562306a36Sopenharmony_ci	for (seg = 0; seg < 8; seg++) {
6662306a36Sopenharmony_ci		if (pcm_val <= seg_end[seg])
6762306a36Sopenharmony_ci			break;
6862306a36Sopenharmony_ci	}
6962306a36Sopenharmony_ci	/* Combine the sign, segment, and quantization bits. */
7062306a36Sopenharmony_ci	return  ((seg << 4) |
7162306a36Sopenharmony_ci		 ((pcm_val >> ((seg)  ?  (seg + 3)  :  4)) & 0x0F)) ^ mask;
7262306a36Sopenharmony_ci}
7362306a36Sopenharmony_ci
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_cistatic inline short int alaw2linear(unsigned char alaw)
7662306a36Sopenharmony_ci{
7762306a36Sopenharmony_ci	int i;
7862306a36Sopenharmony_ci	int seg;
7962306a36Sopenharmony_ci
8062306a36Sopenharmony_ci	alaw ^= AMI_MASK;
8162306a36Sopenharmony_ci	i = ((alaw & 0x0F) << 4) + 8 /* rounding error */;
8262306a36Sopenharmony_ci	seg = (((int) alaw & 0x70) >> 4);
8362306a36Sopenharmony_ci	if (seg)
8462306a36Sopenharmony_ci		i = (i + 0x100) << (seg - 1);
8562306a36Sopenharmony_ci	return (short int) ((alaw & 0x80)  ?  i  :  -i);
8662306a36Sopenharmony_ci}
8762306a36Sopenharmony_ci
8862306a36Sopenharmony_cistatic inline short int ulaw2linear(unsigned char ulaw)
8962306a36Sopenharmony_ci{
9062306a36Sopenharmony_ci	short mu, e, f, y;
9162306a36Sopenharmony_ci	static short etab[] = {0, 132, 396, 924, 1980, 4092, 8316, 16764};
9262306a36Sopenharmony_ci
9362306a36Sopenharmony_ci	mu = 255 - ulaw;
9462306a36Sopenharmony_ci	e = (mu & 0x70) / 16;
9562306a36Sopenharmony_ci	f = mu & 0x0f;
9662306a36Sopenharmony_ci	y = f * (1 << (e + 3));
9762306a36Sopenharmony_ci	y += etab[e];
9862306a36Sopenharmony_ci	if (mu & 0x80)
9962306a36Sopenharmony_ci		y = -y;
10062306a36Sopenharmony_ci	return y;
10162306a36Sopenharmony_ci}
10262306a36Sopenharmony_ci
10362306a36Sopenharmony_ci#define BIAS 0x84   /*!< define the add-in bias for 16 bit samples */
10462306a36Sopenharmony_ci
10562306a36Sopenharmony_cistatic unsigned char linear2ulaw(short sample)
10662306a36Sopenharmony_ci{
10762306a36Sopenharmony_ci	static int exp_lut[256] = {
10862306a36Sopenharmony_ci		0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
10962306a36Sopenharmony_ci		4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
11062306a36Sopenharmony_ci		5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
11162306a36Sopenharmony_ci		5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
11262306a36Sopenharmony_ci		6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
11362306a36Sopenharmony_ci		6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
11462306a36Sopenharmony_ci		6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
11562306a36Sopenharmony_ci		6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
11662306a36Sopenharmony_ci		7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
11762306a36Sopenharmony_ci		7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
11862306a36Sopenharmony_ci		7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
11962306a36Sopenharmony_ci		7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
12062306a36Sopenharmony_ci		7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
12162306a36Sopenharmony_ci		7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
12262306a36Sopenharmony_ci		7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
12362306a36Sopenharmony_ci		7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7};
12462306a36Sopenharmony_ci	int sign, exponent, mantissa;
12562306a36Sopenharmony_ci	unsigned char ulawbyte;
12662306a36Sopenharmony_ci
12762306a36Sopenharmony_ci	/* Get the sample into sign-magnitude. */
12862306a36Sopenharmony_ci	sign = (sample >> 8) & 0x80;	  /* set aside the sign */
12962306a36Sopenharmony_ci	if (sign != 0)
13062306a36Sopenharmony_ci		sample = -sample;	      /* get magnitude */
13162306a36Sopenharmony_ci
13262306a36Sopenharmony_ci	/* Convert from 16 bit linear to ulaw. */
13362306a36Sopenharmony_ci	sample = sample + BIAS;
13462306a36Sopenharmony_ci	exponent = exp_lut[(sample >> 7) & 0xFF];
13562306a36Sopenharmony_ci	mantissa = (sample >> (exponent + 3)) & 0x0F;
13662306a36Sopenharmony_ci	ulawbyte = ~(sign | (exponent << 4) | mantissa);
13762306a36Sopenharmony_ci
13862306a36Sopenharmony_ci	return ulawbyte;
13962306a36Sopenharmony_ci}
14062306a36Sopenharmony_ci
14162306a36Sopenharmony_civoid dsp_audio_generate_law_tables(void)
14262306a36Sopenharmony_ci{
14362306a36Sopenharmony_ci	int i;
14462306a36Sopenharmony_ci	for (i = 0; i < 256; i++)
14562306a36Sopenharmony_ci		dsp_audio_alaw_to_s32[i] = alaw2linear(bitrev8((u8)i));
14662306a36Sopenharmony_ci
14762306a36Sopenharmony_ci	for (i = 0; i < 256; i++)
14862306a36Sopenharmony_ci		dsp_audio_ulaw_to_s32[i] = ulaw2linear(bitrev8((u8)i));
14962306a36Sopenharmony_ci
15062306a36Sopenharmony_ci	for (i = 0; i < 256; i++) {
15162306a36Sopenharmony_ci		dsp_audio_alaw_to_ulaw[i] =
15262306a36Sopenharmony_ci			linear2ulaw(dsp_audio_alaw_to_s32[i]);
15362306a36Sopenharmony_ci		dsp_audio_ulaw_to_alaw[i] =
15462306a36Sopenharmony_ci			linear2alaw(dsp_audio_ulaw_to_s32[i]);
15562306a36Sopenharmony_ci	}
15662306a36Sopenharmony_ci}
15762306a36Sopenharmony_ci
15862306a36Sopenharmony_civoid
15962306a36Sopenharmony_cidsp_audio_generate_s2law_table(void)
16062306a36Sopenharmony_ci{
16162306a36Sopenharmony_ci	int i;
16262306a36Sopenharmony_ci
16362306a36Sopenharmony_ci	if (dsp_options & DSP_OPT_ULAW) {
16462306a36Sopenharmony_ci		/* generating ulaw-table */
16562306a36Sopenharmony_ci		for (i = -32768; i < 32768; i++) {
16662306a36Sopenharmony_ci			dsp_audio_s16_to_law[i & 0xffff] =
16762306a36Sopenharmony_ci				bitrev8(linear2ulaw(i));
16862306a36Sopenharmony_ci		}
16962306a36Sopenharmony_ci	} else {
17062306a36Sopenharmony_ci		/* generating alaw-table */
17162306a36Sopenharmony_ci		for (i = -32768; i < 32768; i++) {
17262306a36Sopenharmony_ci			dsp_audio_s16_to_law[i & 0xffff] =
17362306a36Sopenharmony_ci				bitrev8(linear2alaw(i));
17462306a36Sopenharmony_ci		}
17562306a36Sopenharmony_ci	}
17662306a36Sopenharmony_ci}
17762306a36Sopenharmony_ci
17862306a36Sopenharmony_ci
17962306a36Sopenharmony_ci/*
18062306a36Sopenharmony_ci * the seven bit sample is the number of every second alaw-sample ordered by
18162306a36Sopenharmony_ci * aplitude. 0x00 is negative, 0x7f is positive amplitude.
18262306a36Sopenharmony_ci */
18362306a36Sopenharmony_ciu8 dsp_audio_seven2law[128];
18462306a36Sopenharmony_ciu8 dsp_audio_law2seven[256];
18562306a36Sopenharmony_ci
18662306a36Sopenharmony_ci/********************************************************************
18762306a36Sopenharmony_ci * generate table for conversion law from/to 7-bit alaw-like sample *
18862306a36Sopenharmony_ci ********************************************************************/
18962306a36Sopenharmony_ci
19062306a36Sopenharmony_civoid
19162306a36Sopenharmony_cidsp_audio_generate_seven(void)
19262306a36Sopenharmony_ci{
19362306a36Sopenharmony_ci	int i, j, k;
19462306a36Sopenharmony_ci	u8 spl;
19562306a36Sopenharmony_ci	u8 sorted_alaw[256];
19662306a36Sopenharmony_ci
19762306a36Sopenharmony_ci	/* generate alaw table, sorted by the linear value */
19862306a36Sopenharmony_ci	for (i = 0; i < 256; i++) {
19962306a36Sopenharmony_ci		j = 0;
20062306a36Sopenharmony_ci		for (k = 0; k < 256; k++) {
20162306a36Sopenharmony_ci			if (dsp_audio_alaw_to_s32[k]
20262306a36Sopenharmony_ci			    < dsp_audio_alaw_to_s32[i])
20362306a36Sopenharmony_ci				j++;
20462306a36Sopenharmony_ci		}
20562306a36Sopenharmony_ci		sorted_alaw[j] = i;
20662306a36Sopenharmony_ci	}
20762306a36Sopenharmony_ci
20862306a36Sopenharmony_ci	/* generate tabels */
20962306a36Sopenharmony_ci	for (i = 0; i < 256; i++) {
21062306a36Sopenharmony_ci		/* spl is the source: the law-sample (converted to alaw) */
21162306a36Sopenharmony_ci		spl = i;
21262306a36Sopenharmony_ci		if (dsp_options & DSP_OPT_ULAW)
21362306a36Sopenharmony_ci			spl = dsp_audio_ulaw_to_alaw[i];
21462306a36Sopenharmony_ci		/* find the 7-bit-sample */
21562306a36Sopenharmony_ci		for (j = 0; j < 256; j++) {
21662306a36Sopenharmony_ci			if (sorted_alaw[j] == spl)
21762306a36Sopenharmony_ci				break;
21862306a36Sopenharmony_ci		}
21962306a36Sopenharmony_ci		/* write 7-bit audio value */
22062306a36Sopenharmony_ci		dsp_audio_law2seven[i] = j >> 1;
22162306a36Sopenharmony_ci	}
22262306a36Sopenharmony_ci	for (i = 0; i < 128; i++) {
22362306a36Sopenharmony_ci		spl = sorted_alaw[i << 1];
22462306a36Sopenharmony_ci		if (dsp_options & DSP_OPT_ULAW)
22562306a36Sopenharmony_ci			spl = dsp_audio_alaw_to_ulaw[spl];
22662306a36Sopenharmony_ci		dsp_audio_seven2law[i] = spl;
22762306a36Sopenharmony_ci	}
22862306a36Sopenharmony_ci}
22962306a36Sopenharmony_ci
23062306a36Sopenharmony_ci
23162306a36Sopenharmony_ci/* mix 2*law -> law */
23262306a36Sopenharmony_ciu8 dsp_audio_mix_law[65536];
23362306a36Sopenharmony_ci
23462306a36Sopenharmony_ci/******************************************************
23562306a36Sopenharmony_ci * generate mix table to mix two law samples into one *
23662306a36Sopenharmony_ci ******************************************************/
23762306a36Sopenharmony_ci
23862306a36Sopenharmony_civoid
23962306a36Sopenharmony_cidsp_audio_generate_mix_table(void)
24062306a36Sopenharmony_ci{
24162306a36Sopenharmony_ci	int i, j;
24262306a36Sopenharmony_ci	s32 sample;
24362306a36Sopenharmony_ci
24462306a36Sopenharmony_ci	i = 0;
24562306a36Sopenharmony_ci	while (i < 256) {
24662306a36Sopenharmony_ci		j = 0;
24762306a36Sopenharmony_ci		while (j < 256) {
24862306a36Sopenharmony_ci			sample = dsp_audio_law_to_s32[i];
24962306a36Sopenharmony_ci			sample += dsp_audio_law_to_s32[j];
25062306a36Sopenharmony_ci			if (sample > 32767)
25162306a36Sopenharmony_ci				sample = 32767;
25262306a36Sopenharmony_ci			if (sample < -32768)
25362306a36Sopenharmony_ci				sample = -32768;
25462306a36Sopenharmony_ci			dsp_audio_mix_law[(i << 8) | j] =
25562306a36Sopenharmony_ci				dsp_audio_s16_to_law[sample & 0xffff];
25662306a36Sopenharmony_ci			j++;
25762306a36Sopenharmony_ci		}
25862306a36Sopenharmony_ci		i++;
25962306a36Sopenharmony_ci	}
26062306a36Sopenharmony_ci}
26162306a36Sopenharmony_ci
26262306a36Sopenharmony_ci
26362306a36Sopenharmony_ci/*************************************
26462306a36Sopenharmony_ci * generate different volume changes *
26562306a36Sopenharmony_ci *************************************/
26662306a36Sopenharmony_ci
26762306a36Sopenharmony_cistatic u8 dsp_audio_reduce8[256];
26862306a36Sopenharmony_cistatic u8 dsp_audio_reduce7[256];
26962306a36Sopenharmony_cistatic u8 dsp_audio_reduce6[256];
27062306a36Sopenharmony_cistatic u8 dsp_audio_reduce5[256];
27162306a36Sopenharmony_cistatic u8 dsp_audio_reduce4[256];
27262306a36Sopenharmony_cistatic u8 dsp_audio_reduce3[256];
27362306a36Sopenharmony_cistatic u8 dsp_audio_reduce2[256];
27462306a36Sopenharmony_cistatic u8 dsp_audio_reduce1[256];
27562306a36Sopenharmony_cistatic u8 dsp_audio_increase1[256];
27662306a36Sopenharmony_cistatic u8 dsp_audio_increase2[256];
27762306a36Sopenharmony_cistatic u8 dsp_audio_increase3[256];
27862306a36Sopenharmony_cistatic u8 dsp_audio_increase4[256];
27962306a36Sopenharmony_cistatic u8 dsp_audio_increase5[256];
28062306a36Sopenharmony_cistatic u8 dsp_audio_increase6[256];
28162306a36Sopenharmony_cistatic u8 dsp_audio_increase7[256];
28262306a36Sopenharmony_cistatic u8 dsp_audio_increase8[256];
28362306a36Sopenharmony_ci
28462306a36Sopenharmony_cistatic u8 *dsp_audio_volume_change[16] = {
28562306a36Sopenharmony_ci	dsp_audio_reduce8,
28662306a36Sopenharmony_ci	dsp_audio_reduce7,
28762306a36Sopenharmony_ci	dsp_audio_reduce6,
28862306a36Sopenharmony_ci	dsp_audio_reduce5,
28962306a36Sopenharmony_ci	dsp_audio_reduce4,
29062306a36Sopenharmony_ci	dsp_audio_reduce3,
29162306a36Sopenharmony_ci	dsp_audio_reduce2,
29262306a36Sopenharmony_ci	dsp_audio_reduce1,
29362306a36Sopenharmony_ci	dsp_audio_increase1,
29462306a36Sopenharmony_ci	dsp_audio_increase2,
29562306a36Sopenharmony_ci	dsp_audio_increase3,
29662306a36Sopenharmony_ci	dsp_audio_increase4,
29762306a36Sopenharmony_ci	dsp_audio_increase5,
29862306a36Sopenharmony_ci	dsp_audio_increase6,
29962306a36Sopenharmony_ci	dsp_audio_increase7,
30062306a36Sopenharmony_ci	dsp_audio_increase8,
30162306a36Sopenharmony_ci};
30262306a36Sopenharmony_ci
30362306a36Sopenharmony_civoid
30462306a36Sopenharmony_cidsp_audio_generate_volume_changes(void)
30562306a36Sopenharmony_ci{
30662306a36Sopenharmony_ci	register s32 sample;
30762306a36Sopenharmony_ci	int i;
30862306a36Sopenharmony_ci	int num[]   = { 110, 125, 150, 175, 200, 300, 400, 500 };
30962306a36Sopenharmony_ci	int denum[] = { 100, 100, 100, 100, 100, 100, 100, 100 };
31062306a36Sopenharmony_ci
31162306a36Sopenharmony_ci	i = 0;
31262306a36Sopenharmony_ci	while (i < 256) {
31362306a36Sopenharmony_ci		dsp_audio_reduce8[i] = dsp_audio_s16_to_law[
31462306a36Sopenharmony_ci			(dsp_audio_law_to_s32[i] * denum[7] / num[7]) & 0xffff];
31562306a36Sopenharmony_ci		dsp_audio_reduce7[i] = dsp_audio_s16_to_law[
31662306a36Sopenharmony_ci			(dsp_audio_law_to_s32[i] * denum[6] / num[6]) & 0xffff];
31762306a36Sopenharmony_ci		dsp_audio_reduce6[i] = dsp_audio_s16_to_law[
31862306a36Sopenharmony_ci			(dsp_audio_law_to_s32[i] * denum[5] / num[5]) & 0xffff];
31962306a36Sopenharmony_ci		dsp_audio_reduce5[i] = dsp_audio_s16_to_law[
32062306a36Sopenharmony_ci			(dsp_audio_law_to_s32[i] * denum[4] / num[4]) & 0xffff];
32162306a36Sopenharmony_ci		dsp_audio_reduce4[i] = dsp_audio_s16_to_law[
32262306a36Sopenharmony_ci			(dsp_audio_law_to_s32[i] * denum[3] / num[3]) & 0xffff];
32362306a36Sopenharmony_ci		dsp_audio_reduce3[i] = dsp_audio_s16_to_law[
32462306a36Sopenharmony_ci			(dsp_audio_law_to_s32[i] * denum[2] / num[2]) & 0xffff];
32562306a36Sopenharmony_ci		dsp_audio_reduce2[i] = dsp_audio_s16_to_law[
32662306a36Sopenharmony_ci			(dsp_audio_law_to_s32[i] * denum[1] / num[1]) & 0xffff];
32762306a36Sopenharmony_ci		dsp_audio_reduce1[i] = dsp_audio_s16_to_law[
32862306a36Sopenharmony_ci			(dsp_audio_law_to_s32[i] * denum[0] / num[0]) & 0xffff];
32962306a36Sopenharmony_ci		sample = dsp_audio_law_to_s32[i] * num[0] / denum[0];
33062306a36Sopenharmony_ci		if (sample < -32768)
33162306a36Sopenharmony_ci			sample = -32768;
33262306a36Sopenharmony_ci		else if (sample > 32767)
33362306a36Sopenharmony_ci			sample = 32767;
33462306a36Sopenharmony_ci		dsp_audio_increase1[i] = dsp_audio_s16_to_law[sample & 0xffff];
33562306a36Sopenharmony_ci		sample = dsp_audio_law_to_s32[i] * num[1] / denum[1];
33662306a36Sopenharmony_ci		if (sample < -32768)
33762306a36Sopenharmony_ci			sample = -32768;
33862306a36Sopenharmony_ci		else if (sample > 32767)
33962306a36Sopenharmony_ci			sample = 32767;
34062306a36Sopenharmony_ci		dsp_audio_increase2[i] = dsp_audio_s16_to_law[sample & 0xffff];
34162306a36Sopenharmony_ci		sample = dsp_audio_law_to_s32[i] * num[2] / denum[2];
34262306a36Sopenharmony_ci		if (sample < -32768)
34362306a36Sopenharmony_ci			sample = -32768;
34462306a36Sopenharmony_ci		else if (sample > 32767)
34562306a36Sopenharmony_ci			sample = 32767;
34662306a36Sopenharmony_ci		dsp_audio_increase3[i] = dsp_audio_s16_to_law[sample & 0xffff];
34762306a36Sopenharmony_ci		sample = dsp_audio_law_to_s32[i] * num[3] / denum[3];
34862306a36Sopenharmony_ci		if (sample < -32768)
34962306a36Sopenharmony_ci			sample = -32768;
35062306a36Sopenharmony_ci		else if (sample > 32767)
35162306a36Sopenharmony_ci			sample = 32767;
35262306a36Sopenharmony_ci		dsp_audio_increase4[i] = dsp_audio_s16_to_law[sample & 0xffff];
35362306a36Sopenharmony_ci		sample = dsp_audio_law_to_s32[i] * num[4] / denum[4];
35462306a36Sopenharmony_ci		if (sample < -32768)
35562306a36Sopenharmony_ci			sample = -32768;
35662306a36Sopenharmony_ci		else if (sample > 32767)
35762306a36Sopenharmony_ci			sample = 32767;
35862306a36Sopenharmony_ci		dsp_audio_increase5[i] = dsp_audio_s16_to_law[sample & 0xffff];
35962306a36Sopenharmony_ci		sample = dsp_audio_law_to_s32[i] * num[5] / denum[5];
36062306a36Sopenharmony_ci		if (sample < -32768)
36162306a36Sopenharmony_ci			sample = -32768;
36262306a36Sopenharmony_ci		else if (sample > 32767)
36362306a36Sopenharmony_ci			sample = 32767;
36462306a36Sopenharmony_ci		dsp_audio_increase6[i] = dsp_audio_s16_to_law[sample & 0xffff];
36562306a36Sopenharmony_ci		sample = dsp_audio_law_to_s32[i] * num[6] / denum[6];
36662306a36Sopenharmony_ci		if (sample < -32768)
36762306a36Sopenharmony_ci			sample = -32768;
36862306a36Sopenharmony_ci		else if (sample > 32767)
36962306a36Sopenharmony_ci			sample = 32767;
37062306a36Sopenharmony_ci		dsp_audio_increase7[i] = dsp_audio_s16_to_law[sample & 0xffff];
37162306a36Sopenharmony_ci		sample = dsp_audio_law_to_s32[i] * num[7] / denum[7];
37262306a36Sopenharmony_ci		if (sample < -32768)
37362306a36Sopenharmony_ci			sample = -32768;
37462306a36Sopenharmony_ci		else if (sample > 32767)
37562306a36Sopenharmony_ci			sample = 32767;
37662306a36Sopenharmony_ci		dsp_audio_increase8[i] = dsp_audio_s16_to_law[sample & 0xffff];
37762306a36Sopenharmony_ci
37862306a36Sopenharmony_ci		i++;
37962306a36Sopenharmony_ci	}
38062306a36Sopenharmony_ci}
38162306a36Sopenharmony_ci
38262306a36Sopenharmony_ci
38362306a36Sopenharmony_ci/**************************************
38462306a36Sopenharmony_ci * change the volume of the given skb *
38562306a36Sopenharmony_ci **************************************/
38662306a36Sopenharmony_ci
38762306a36Sopenharmony_ci/* this is a helper function for changing volume of skb. the range may be
38862306a36Sopenharmony_ci * -8 to 8, which is a shift to the power of 2. 0 == no volume, 3 == volume*8
38962306a36Sopenharmony_ci */
39062306a36Sopenharmony_civoid
39162306a36Sopenharmony_cidsp_change_volume(struct sk_buff *skb, int volume)
39262306a36Sopenharmony_ci{
39362306a36Sopenharmony_ci	u8 *volume_change;
39462306a36Sopenharmony_ci	int i, ii;
39562306a36Sopenharmony_ci	u8 *p;
39662306a36Sopenharmony_ci	int shift;
39762306a36Sopenharmony_ci
39862306a36Sopenharmony_ci	if (volume == 0)
39962306a36Sopenharmony_ci		return;
40062306a36Sopenharmony_ci
40162306a36Sopenharmony_ci	/* get correct conversion table */
40262306a36Sopenharmony_ci	if (volume < 0) {
40362306a36Sopenharmony_ci		shift = volume + 8;
40462306a36Sopenharmony_ci		if (shift < 0)
40562306a36Sopenharmony_ci			shift = 0;
40662306a36Sopenharmony_ci	} else {
40762306a36Sopenharmony_ci		shift = volume + 7;
40862306a36Sopenharmony_ci		if (shift > 15)
40962306a36Sopenharmony_ci			shift = 15;
41062306a36Sopenharmony_ci	}
41162306a36Sopenharmony_ci	volume_change = dsp_audio_volume_change[shift];
41262306a36Sopenharmony_ci	i = 0;
41362306a36Sopenharmony_ci	ii = skb->len;
41462306a36Sopenharmony_ci	p = skb->data;
41562306a36Sopenharmony_ci	/* change volume */
41662306a36Sopenharmony_ci	while (i < ii) {
41762306a36Sopenharmony_ci		*p = volume_change[*p];
41862306a36Sopenharmony_ci		p++;
41962306a36Sopenharmony_ci		i++;
42062306a36Sopenharmony_ci	}
42162306a36Sopenharmony_ci}
422