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]) {
 
 220         /* generate tabels */
 
 221         for (i = 0; i < 256; i++) {
 
 222                 /* spl is the source: the law-sample (converted to alaw) */
 
 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)
 
 231                 /* write 7-bit audio value */
 
 232                 dsp_audio_law2seven[i] = j >> 1;
 
 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;
 
 243 /* mix 2*law -> law */
 
 244 u8 dsp_audio_mix_law[65536];
 
 246 /******************************************************
 
 247  * generate mix table to mix two law samples into one *
 
 248  ******************************************************/
 
 251 dsp_audio_generate_mix_table(void)
 
 260                         sample = dsp_audio_law_to_s32[i];
 
 261                         sample += dsp_audio_law_to_s32[j];
 
 266                         dsp_audio_mix_law[(i<<8)|j] =
 
 267                                 dsp_audio_s16_to_law[sample & 0xffff];
 
 275 /*************************************
 
 276  * generate different volume changes *
 
 277  *************************************/
 
 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];
 
 296 static u8 *dsp_audio_volume_change[16] = {
 
 316 dsp_audio_generate_volume_changes(void)
 
 320         int num[]   = { 110, 125, 150, 175, 200, 300, 400, 500 };
 
 321         int denum[] = { 100, 100, 100, 100, 100, 100, 100, 100 };
 
 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];
 
 344                 else if (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];
 
 350                 else if (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];
 
 356                 else if (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];
 
 362                 else if (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];
 
 368                 else if (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];
 
 374                 else if (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];
 
 380                 else if (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];
 
 386                 else if (sample > 32767)
 
 388                 dsp_audio_increase8[i] = dsp_audio_s16_to_law[sample & 0xffff];
 
 395 /**************************************
 
 396  * change the volume of the given skb *
 
 397  **************************************/
 
 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
 
 403 dsp_change_volume(struct sk_buff *skb, int volume)
 
 413         /* get correct conversion table */
 
 423         volume_change = dsp_audio_volume_change[shift];
 
 429                 *p = volume_change[*p];