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