00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #include <asterisk/alaw.h>
00015
00016 #define AMI_MASK 0x55
00017
00018 static inline unsigned char linear2alaw (short int linear)
00019 {
00020 int mask;
00021 int seg;
00022 int pcm_val;
00023 static int seg_end[8] =
00024 {
00025 0xFF, 0x1FF, 0x3FF, 0x7FF, 0xFFF, 0x1FFF, 0x3FFF, 0x7FFF
00026 };
00027
00028 pcm_val = linear;
00029 if (pcm_val >= 0)
00030 {
00031
00032 mask = AMI_MASK | 0x80;
00033 }
00034 else
00035 {
00036
00037 mask = AMI_MASK;
00038 pcm_val = -pcm_val;
00039 }
00040
00041
00042 for (seg = 0; seg < 8; seg++)
00043 {
00044 if (pcm_val <= seg_end[seg])
00045 break;
00046 }
00047
00048 return ((seg << 4) | ((pcm_val >> ((seg) ? (seg + 3) : 4)) & 0x0F)) ^ mask;
00049 }
00050
00051
00052 static inline short int alaw2linear (unsigned char alaw)
00053 {
00054 int i;
00055 int seg;
00056
00057 alaw ^= AMI_MASK;
00058 i = ((alaw & 0x0F) << 4);
00059 seg = (((int) alaw & 0x70) >> 4);
00060 if (seg)
00061 i = (i + 0x100) << (seg - 1);
00062 return (short int) ((alaw & 0x80) ? i : -i);
00063 }
00064
00065 unsigned char __ast_lin2a[8192];
00066 short __ast_alaw[256];
00067
00068 void ast_alaw_init(void)
00069 {
00070 int i;
00071
00072
00073
00074 for(i = 0;i < 256;i++)
00075 {
00076 __ast_alaw[i] = alaw2linear(i);
00077 }
00078
00079 for(i = -32768; i < 32768; i++)
00080 {
00081 __ast_lin2a[((unsigned short)i) >> 3] = linear2alaw(i);
00082 }
00083
00084 }
00085