Version 0.1.12 from FTP
[asterisk/asterisk.git] / ulaw.c
1 /*
2  * Asterisk -- A telephony toolkit for Linux.
3  *
4  * u-Law to Signed linear conversion
5  * 
6  * Copyright (C) 1999, Mark Spencer
7  *
8  * Mark Spencer <markster@linux-support.net>
9  *
10  * This program is free software, distributed under the terms of
11  * the GNU General Public License
12  */
13
14 #include <asterisk/ulaw.h>
15
16 #define ZEROTRAP    /* turn on the trap as per the MIL-STD */
17 #define BIAS 0x84   /* define the add-in bias for 16 bit samples */
18 #define CLIP 32635
19
20 unsigned char ast_lin2mu[65536];
21 short ast_mulaw[256];
22
23 static unsigned char
24 linear2ulaw(short sample)
25 {
26   static int exp_lut[256] = {0,0,1,1,2,2,2,2,3,3,3,3,3,3,3,3,
27                              4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
28                              5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
29                              5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
30                              6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
31                              6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
32                              6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
33                              6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
34                              7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
35                              7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
36                              7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
37                              7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
38                              7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
39                              7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
40                              7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
41                              7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7};
42   int sign, exponent, mantissa;
43   unsigned char ulawbyte;
44
45   /* Get the sample into sign-magnitude. */
46   sign = (sample >> 8) & 0x80;          /* set aside the sign */
47   if (sign != 0) sample = -sample;              /* get magnitude */
48   if (sample > CLIP) sample = CLIP;             /* clip the magnitude */
49
50   /* Convert from 16 bit linear to ulaw. */
51   sample = sample + BIAS;
52   exponent = exp_lut[(sample >> 7) & 0xFF];
53   mantissa = (sample >> (exponent + 3)) & 0x0F;
54   ulawbyte = ~(sign | (exponent << 4) | mantissa);
55 #ifdef ZEROTRAP
56   if (ulawbyte == 0) ulawbyte = 0x02;   /* optional CCITT trap */
57 #endif
58
59   return(ulawbyte);
60 }
61
62 void ast_ulaw_init(void)
63 {
64         int i;
65         /* 
66          *  Set up mu-law conversion table
67          */
68         for(i = 0;i < 256;i++)
69            {
70                 short mu,e,f,y;
71                 static short etab[]={0,132,396,924,1980,4092,8316,16764};
72
73                 mu = 255-i;
74                 e = (mu & 0x70)/16;
75                 f = mu & 0x0f;
76                 y = f * (1 << (e + 3));
77                 y += etab[e];
78                 if (mu & 0x80) y = -y;
79                 ast_mulaw[i] = y;
80            }
81           /* set up the reverse (mu-law) conversion table */
82         for(i = 0; i < 65536; i++)
83            {
84                 ast_lin2mu[i] = linear2ulaw(i - 32768);
85            }
86
87 }
88