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