remove experimental module version tags
[asterisk/asterisk.git] / alaw.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("$Revision$")
17
18 #include "asterisk/alaw.h"
19
20 #define AMI_MASK 0x55
21
22 static inline unsigned char linear2alaw (short int linear)
23 {
24     int mask;
25     int seg;
26     int pcm_val;
27     static int seg_end[8] =
28     {
29          0xFF, 0x1FF, 0x3FF, 0x7FF, 0xFFF, 0x1FFF, 0x3FFF, 0x7FFF
30     };
31     
32     pcm_val = linear;
33     if (pcm_val >= 0)
34     {
35         /* Sign (7th) bit = 1 */
36         mask = AMI_MASK | 0x80;
37     }
38     else
39     {
40         /* Sign bit = 0 */
41         mask = AMI_MASK;
42         pcm_val = -pcm_val;
43     }
44
45     /* Convert the scaled magnitude to segment number. */
46     for (seg = 0;  seg < 8;  seg++)
47     {
48         if (pcm_val <= seg_end[seg])
49             break;
50     }
51     /* Combine the sign, segment, and quantization bits. */
52     return  ((seg << 4) | ((pcm_val >> ((seg)  ?  (seg + 3)  :  4)) & 0x0F)) ^ mask;
53 }
54 /*- End of function --------------------------------------------------------*/
55
56 static inline short int alaw2linear (unsigned char alaw)
57 {
58     int i;
59     int seg;
60
61     alaw ^= AMI_MASK;
62     i = ((alaw & 0x0F) << 4);
63     seg = (((int) alaw & 0x70) >> 4);
64     if (seg)
65         i = (i + 0x100) << (seg - 1);
66     return (short int) ((alaw & 0x80)  ?  i  :  -i);
67 }
68
69 unsigned char __ast_lin2a[8192];
70 short __ast_alaw[256];
71
72 void ast_alaw_init(void)
73 {
74         int i;
75         /* 
76          *  Set up mu-law conversion table
77          */
78         for(i = 0;i < 256;i++)
79            {
80                 __ast_alaw[i] = alaw2linear(i);
81            }
82           /* set up the reverse (mu-law) conversion table */
83         for(i = -32768; i < 32768; i++)
84            {
85                 __ast_lin2a[((unsigned short)i) >> 3] = linear2alaw(i);
86            }
87
88 }
89