2001-02-24 20:28:24 +00:00
|
|
|
// code from xanim sources...
|
|
|
|
// (I hope that not hurt copyright :o)
|
|
|
|
|
|
|
|
#define xaLONG long
|
|
|
|
#define xaULONG unsigned long
|
|
|
|
#define xaBYTE char
|
|
|
|
#define xaUBYTE unsigned char
|
|
|
|
|
2001-05-11 01:20:22 +00:00
|
|
|
//xaULONG long xa_alaw_2_sign[256];
|
|
|
|
xaULONG xa_alaw_2_sign[256];
|
|
|
|
xaULONG xa_ulaw_2_sign[256];
|
|
|
|
|
|
|
|
/*
|
|
|
|
** This routine converts from ulaw to 16 bit linear.
|
|
|
|
**
|
|
|
|
** Craig Reese: IDA/Supercomputing Research Center
|
|
|
|
** 29 September 1989
|
|
|
|
**
|
|
|
|
** References:
|
|
|
|
** 1) CCITT Recommendation G.711 (very difficult to follow)
|
|
|
|
** 2) MIL-STD-188-113,"Interoperability and Performance Standards
|
|
|
|
** for Analog-to_Digital Conversion Techniques,"
|
|
|
|
** 17 February 1987
|
|
|
|
**
|
|
|
|
** Input: 8 bit ulaw sample
|
|
|
|
** Output: signed 16 bit linear sample
|
|
|
|
*/
|
|
|
|
|
|
|
|
xaLONG XA_uLaw_to_Signed( ulawbyte )
|
|
|
|
xaUBYTE ulawbyte;
|
|
|
|
{
|
|
|
|
static int exp_lut[8] = { 0, 132, 396, 924, 1980, 4092, 8316, 16764 };
|
|
|
|
int sign, exponent, mantissa, sample;
|
|
|
|
|
|
|
|
ulawbyte = ~ ulawbyte;
|
|
|
|
sign = ( ulawbyte & 0x80 );
|
|
|
|
exponent = ( ulawbyte >> 4 ) & 0x07;
|
|
|
|
mantissa = ulawbyte & 0x0F;
|
|
|
|
sample = exp_lut[exponent] + ( mantissa << ( exponent + 3 ) );
|
|
|
|
if ( sign != 0 ) sample = -sample;
|
|
|
|
|
|
|
|
return sample;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Gen_uLaw_2_Signed()
|
|
|
|
{ xaULONG i;
|
|
|
|
for(i=0;i<256;i++)
|
|
|
|
{ xaUBYTE data = (xaUBYTE)(i);
|
|
|
|
xaLONG d = XA_uLaw_to_Signed( data );
|
|
|
|
xa_ulaw_2_sign[i] = (xaULONG)((xaULONG)(d) & 0xffff);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2001-02-24 20:28:24 +00:00
|
|
|
|
|
|
|
void Gen_aLaw_2_Signed()
|
|
|
|
{ xaULONG i;
|
|
|
|
for(i=0;i<256;i++)
|
|
|
|
{ xaUBYTE data = (xaUBYTE)(i);
|
|
|
|
xaLONG d, t, seg;
|
|
|
|
|
|
|
|
data ^= 0x55;
|
|
|
|
|
|
|
|
t = (data & 0xf) << 4;
|
|
|
|
seg = (data & 0x70) >> 4;
|
|
|
|
if (seg == 0) t += 8;
|
|
|
|
else if (seg == 1) t += 0x108;
|
|
|
|
else { t += 108; t <<= seg - 1; }
|
|
|
|
|
|
|
|
d = (data & 0x80)?(t):(-t);
|
|
|
|
xa_alaw_2_sign[i] = (xaULONG)((xaULONG)(d) & 0xffff);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|