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