/* * Audio support data for mISDN_dsp. * * Copyright 2002/2003 by Andreas Eversberg (jolly@eversberg.eu) * Rewritten by Peter * * This software may be used and distributed according to the terms * of the GNU General Public License, incorporated herein by reference. *
*/
/***************************************************** * generate table for conversion of s16 to alaw/ulaw *
*****************************************************/
#define AMI_MASK 0x55
staticinlineunsignedchar linear2alaw(shortint linear)
{ int mask; int seg; int pcm_val; staticint seg_end[8] = {
0xFF, 0x1FF, 0x3FF, 0x7FF, 0xFFF, 0x1FFF, 0x3FFF, 0x7FFF
};
/* Get the sample into sign-magnitude. */
sign = (sample >> 8) & 0x80; /* set aside the sign */ if (sign != 0)
sample = -sample; /* get magnitude */
/* Convert from 16 bit linear to ulaw. */
sample = sample + BIAS;
exponent = exp_lut[(sample >> 7) & 0xFF];
mantissa = (sample >> (exponent + 3)) & 0x0F;
ulawbyte = ~(sign | (exponent << 4) | mantissa);
return ulawbyte;
}
void dsp_audio_generate_law_tables(void)
{ int i; for (i = 0; i < 256; i++)
dsp_audio_alaw_to_s32[i] = alaw2linear(bitrev8((u8)i));
for (i = 0; i < 256; i++)
dsp_audio_ulaw_to_s32[i] = ulaw2linear(bitrev8((u8)i));
for (i = 0; i < 256; i++) {
dsp_audio_alaw_to_ulaw[i] =
linear2ulaw(dsp_audio_alaw_to_s32[i]);
dsp_audio_ulaw_to_alaw[i] =
linear2alaw(dsp_audio_ulaw_to_s32[i]);
}
}
void
dsp_audio_generate_s2law_table(void)
{ int i;
if (dsp_options & DSP_OPT_ULAW) { /* generating ulaw-table */ for (i = -32768; i < 32768; i++) {
dsp_audio_s16_to_law[i & 0xffff] =
bitrev8(linear2ulaw(i));
}
} else { /* generating alaw-table */ for (i = -32768; i < 32768; i++) {
dsp_audio_s16_to_law[i & 0xffff] =
bitrev8(linear2alaw(i));
}
}
}
/* * the seven bit sample is the number of every second alaw-sample ordered by * aplitude. 0x00 is negative, 0x7f is positive amplitude.
*/
u8 dsp_audio_seven2law[128];
u8 dsp_audio_law2seven[256];
/******************************************************************** * generate table for conversion law from/to 7-bit alaw-like sample *
********************************************************************/
void
dsp_audio_generate_seven(void)
{ int i, j, k;
u8 spl;
u8 sorted_alaw[256];
/* generate alaw table, sorted by the linear value */ for (i = 0; i < 256; i++) {
j = 0; for (k = 0; k < 256; k++) { if (dsp_audio_alaw_to_s32[k]
< dsp_audio_alaw_to_s32[i])
j++;
}
sorted_alaw[j] = i;
}
/* generate tabels */ for (i = 0; i < 256; i++) { /* spl is the source: the law-sample (converted to alaw) */
spl = i; if (dsp_options & DSP_OPT_ULAW)
spl = dsp_audio_ulaw_to_alaw[i]; /* find the 7-bit-sample */ for (j = 0; j < 256; j++) { if (sorted_alaw[j] == spl) break;
} /* write 7-bit audio value */
dsp_audio_law2seven[i] = j >> 1;
} for (i = 0; i < 128; i++) {
spl = sorted_alaw[i << 1]; if (dsp_options & DSP_OPT_ULAW)
spl = dsp_audio_alaw_to_ulaw[spl];
dsp_audio_seven2law[i] = spl;
}
}
/* mix 2*law -> law */
u8 dsp_audio_mix_law[65536];
/****************************************************** * generate mix table to mix two law samples into one *
******************************************************/
void
dsp_audio_generate_mix_table(void)
{ int i, j;
s32 sample;
i = 0; while (i < 256) {
j = 0; while (j < 256) {
sample = dsp_audio_law_to_s32[i];
sample += dsp_audio_law_to_s32[j]; if (sample > 32767)
sample = 32767; if (sample < -32768)
sample = -32768;
dsp_audio_mix_law[(i << 8) | j] =
dsp_audio_s16_to_law[sample & 0xffff];
j++;
}
i++;
}
}
/************************************* * generate different volume changes *
*************************************/
/************************************** * change the volume of the given skb *
**************************************/
/* this is a helper function for changing volume of skb. the range may be * -8 to 8, which is a shift to the power of 2. 0 == no volume, 3 == volume*8
*/ void
dsp_change_volume(struct sk_buff *skb, int volume)
{
u8 *volume_change; int i, ii;
u8 *p; int shift;
if (volume == 0) return;
/* get correct conversion table */ if (volume < 0) {
shift = volume + 8; if (shift < 0)
shift = 0;
} else {
shift = volume + 7; if (shift > 15)
shift = 15;
}
volume_change = dsp_audio_volume_change[shift];
i = 0;
ii = skb->len;
p = skb->data; /* change volume */ while (i < ii) {
*p = volume_change[*p];
p++;
i++;
}
}
Messung V0.5
¤ Dauer der Verarbeitung: 0.1 Sekunden
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.