00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "asterisk.h"
00026
00027 ASTERISK_FILE_VERSION(__FILE__, "$Revision: 7221 $")
00028
00029 #include "asterisk/ulaw.h"
00030
00031 #define ZEROTRAP
00032 #define BIAS 0x84
00033 #define CLIP 32635
00034
00035 unsigned char __ast_lin2mu[16384];
00036 short __ast_mulaw[256];
00037
00038
00039 static unsigned char linear2ulaw(short sample)
00040 {
00041 static int exp_lut[256] = {
00042 0,0,1,1,2,2,2,2,3,3,3,3,3,3,3,3,
00043 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
00044 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
00045 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
00046 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
00047 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
00048 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
00049 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
00050 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
00051 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
00052 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
00053 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
00054 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
00055 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
00056 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
00057 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7 };
00058 int sign, exponent, mantissa;
00059 unsigned char ulawbyte;
00060
00061
00062 sign = (sample >> 8) & 0x80;
00063 if (sign != 0)
00064 sample = -sample;
00065 if (sample > CLIP)
00066 sample = CLIP;
00067
00068
00069 sample = sample + BIAS;
00070 exponent = exp_lut[(sample >> 7) & 0xFF];
00071 mantissa = (sample >> (exponent + 3)) & 0x0F;
00072 ulawbyte = ~(sign | (exponent << 4) | mantissa);
00073 #ifdef ZEROTRAP
00074 if (ulawbyte == 0)
00075 ulawbyte = 0x02;
00076 #endif
00077
00078 return ulawbyte;
00079 }
00080
00081
00082
00083
00084 void ast_ulaw_init(void)
00085 {
00086 int i;
00087 for(i = 0;i < 256;i++) {
00088 short mu,e,f,y;
00089 static short etab[]={0,132,396,924,1980,4092,8316,16764};
00090
00091 mu = 255-i;
00092 e = (mu & 0x70)/16;
00093 f = mu & 0x0f;
00094 y = f * (1 << (e + 3));
00095 y += etab[e];
00096 if (mu & 0x80) y = -y;
00097 __ast_mulaw[i] = y;
00098 }
00099
00100 for(i = -32768; i < 32768; i++) {
00101 __ast_lin2mu[((unsigned short)i) >> 2] = linear2ulaw(i);
00102 }
00103
00104 }
00105