Sat Sep 16 07:28:10 2006

Asterisk developer's documentation


ulaw.c

Go to the documentation of this file.
00001 /*
00002  * Asterisk -- An open source telephony toolkit.
00003  *
00004  * Copyright (C) 1999 - 2005, Digium, Inc.
00005  *
00006  * Mark Spencer <markster@digium.com>
00007  *
00008  * See http://www.asterisk.org for more information about
00009  * the Asterisk project. Please do not directly contact
00010  * any of the maintainers of this project for assistance;
00011  * the project provides a web site, mailing lists and IRC
00012  * channels for your use.
00013  *
00014  * This program is free software, distributed under the terms of
00015  * the GNU General Public License Version 2. See the LICENSE file
00016  * at the top of the source tree.
00017  */
00018 
00019 /*! \file
00020  *
00021  * \brief u-Law to Signed linear conversion
00022  * 
00023  */
00024 
00025 #include "asterisk.h"
00026 
00027 ASTERISK_FILE_VERSION(__FILE__, "$Revision: 7221 $")
00028 
00029 #include "asterisk/ulaw.h"
00030 
00031 #define ZEROTRAP    /*!< turn on the trap as per the MIL-STD */
00032 #define BIAS 0x84   /*!< define the add-in bias for 16 bit samples */
00033 #define CLIP 32635
00034 
00035 unsigned char __ast_lin2mu[16384];
00036 short __ast_mulaw[256];
00037 
00038 
00039 static unsigned char linear2ulaw(short sample)
00040 {
00041    static int exp_lut[256] = {
00042       0,0,1,1,2,2,2,2,3,3,3,3,3,3,3,3,
00043       4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
00044       5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
00045       5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
00046       6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
00047       6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
00048       6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
00049       6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
00050       7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
00051       7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
00052       7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
00053       7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
00054       7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
00055       7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
00056       7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
00057       7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7 };
00058    int sign, exponent, mantissa;
00059    unsigned char ulawbyte;
00060 
00061    /* Get the sample into sign-magnitude. */
00062    sign = (sample >> 8) & 0x80;          /* set aside the sign */
00063    if (sign != 0) 
00064       sample = -sample;              /* get magnitude */
00065    if (sample > CLIP)
00066       sample = CLIP;             /* clip the magnitude */
00067 
00068    /* Convert from 16 bit linear to ulaw. */
00069    sample = sample + BIAS;
00070    exponent = exp_lut[(sample >> 7) & 0xFF];
00071    mantissa = (sample >> (exponent + 3)) & 0x0F;
00072    ulawbyte = ~(sign | (exponent << 4) | mantissa);
00073 #ifdef ZEROTRAP
00074    if (ulawbyte == 0)
00075       ulawbyte = 0x02;   /* optional CCITT trap */
00076 #endif
00077 
00078    return ulawbyte;
00079 }
00080 
00081 /*!
00082  * \brief  Set up mu-law conversion table
00083  */
00084 void ast_ulaw_init(void)
00085 {
00086    int i;
00087    for(i = 0;i < 256;i++) {
00088       short mu,e,f,y;
00089       static short etab[]={0,132,396,924,1980,4092,8316,16764};
00090 
00091       mu = 255-i;
00092       e = (mu & 0x70)/16;
00093       f = mu & 0x0f;
00094       y = f * (1 << (e + 3));
00095       y += etab[e];
00096       if (mu & 0x80) y = -y;
00097            __ast_mulaw[i] = y;
00098    }
00099    /* set up the reverse (mu-law) conversion table */
00100    for(i = -32768; i < 32768; i++) {
00101       __ast_lin2mu[((unsigned short)i) >> 2] = linear2ulaw(i);
00102    }
00103 
00104 }
00105 

Generated on Sat Sep 16 07:28:10 2006 for Asterisk - the Open Source PBX by  doxygen 1.4.7