add missing break (issue #5154)
[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.h"
15
16 ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
17
18 #include "asterisk/ulaw.h"
19
20 #define ZEROTRAP    /* turn on the trap as per the MIL-STD */
21 #define BIAS 0x84   /* define the add-in bias for 16 bit samples */
22 #define CLIP 32635
23
24 unsigned char __ast_lin2mu[16384];
25 short __ast_mulaw[256];
26
27 static unsigned char
28 linear2ulaw(short sample)
29 {
30   static int exp_lut[256] = {0,0,1,1,2,2,2,2,3,3,3,3,3,3,3,3,
31                              4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
32                              5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
33                              5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
34                              6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
35                              6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
36                              6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
37                              6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
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                              7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
43                              7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
44                              7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
45                              7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7};
46   int sign, exponent, mantissa;
47   unsigned char ulawbyte;
48
49   /* Get the sample into sign-magnitude. */
50   sign = (sample >> 8) & 0x80;          /* set aside the sign */
51   if (sign != 0) sample = -sample;              /* get magnitude */
52   if (sample > CLIP) sample = CLIP;             /* clip the magnitude */
53
54   /* Convert from 16 bit linear to ulaw. */
55   sample = sample + BIAS;
56   exponent = exp_lut[(sample >> 7) & 0xFF];
57   mantissa = (sample >> (exponent + 3)) & 0x0F;
58   ulawbyte = ~(sign | (exponent << 4) | mantissa);
59 #ifdef ZEROTRAP
60   if (ulawbyte == 0) ulawbyte = 0x02;   /* optional CCITT trap */
61 #endif
62
63   return(ulawbyte);
64 }
65
66 void ast_ulaw_init(void)
67 {
68         int i;
69         /* 
70          *  Set up mu-law conversion table
71          */
72         for(i = 0;i < 256;i++)
73            {
74                 short mu,e,f,y;
75                 static short etab[]={0,132,396,924,1980,4092,8316,16764};
76
77                 mu = 255-i;
78                 e = (mu & 0x70)/16;
79                 f = mu & 0x0f;
80                 y = f * (1 << (e + 3));
81                 y += etab[e];
82                 if (mu & 0x80) y = -y;
83                 __ast_mulaw[i] = y;
84            }
85           /* set up the reverse (mu-law) conversion table */
86         for(i = -32768; i < 32768; i++)
87            {
88                 __ast_lin2mu[((unsigned short)i) >> 2] = linear2ulaw(i);
89            }
90
91 }
92