1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- #include <asterisk/ulaw.h>
- #define ZEROTRAP
- #define BIAS 0x84
- #define CLIP 32635
- unsigned char __ast_lin2mu[16384];
- short __ast_mulaw[256];
- static unsigned char
- linear2ulaw(short sample)
- {
- static int exp_lut[256] = {0,0,1,1,2,2,2,2,3,3,3,3,3,3,3,3,
- 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
- 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
- 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
- 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
- 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
- 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
- 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
- 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
- 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
- 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
- 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
- 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
- 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
- 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
- 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7};
- int sign, exponent, mantissa;
- unsigned char ulawbyte;
-
- sign = (sample >> 8) & 0x80;
- if (sign != 0) sample = -sample;
- if (sample > CLIP) sample = CLIP;
-
- sample = sample + BIAS;
- exponent = exp_lut[(sample >> 7) & 0xFF];
- mantissa = (sample >> (exponent + 3)) & 0x0F;
- ulawbyte = ~(sign | (exponent << 4) | mantissa);
- #ifdef ZEROTRAP
- if (ulawbyte == 0) ulawbyte = 0x02;
- #endif
- return(ulawbyte);
- }
- void ast_ulaw_init(void)
- {
- int i;
-
- for(i = 0;i < 256;i++)
- {
- short mu,e,f,y;
- static short etab[]={0,132,396,924,1980,4092,8316,16764};
- mu = 255-i;
- e = (mu & 0x70)/16;
- f = mu & 0x0f;
- y = f * (1 << (e + 3));
- y += etab[e];
- if (mu & 0x80) y = -y;
- __ast_mulaw[i] = y;
- }
-
- for(i = -32768; i < 32768; i++)
- {
- __ast_lin2mu[((unsigned short)i) >> 2] = linear2ulaw(i);
- }
- }
|