| 
									
										
										
										
											2001-03-01 19:50:12 +00:00
										 |  |  | /*
 | 
					
						
							| 
									
										
										
										
											2005-09-14 20:46:50 +00:00
										 |  |  |  * Asterisk -- An open source telephony toolkit. | 
					
						
							| 
									
										
										
										
											2001-03-01 19:50:12 +00:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2005-09-14 20:46:50 +00:00
										 |  |  |  * Copyright (C) 1999 - 2005, Digium, Inc. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Mark Spencer <markster@digium.com> | 
					
						
							| 
									
										
										
										
											2001-03-01 19:50:12 +00:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2005-09-14 20:46:50 +00:00
										 |  |  |  * See http://www.asterisk.org for more information about
 | 
					
						
							|  |  |  |  * the Asterisk project. Please do not directly contact | 
					
						
							|  |  |  |  * any of the maintainers of this project for assistance; | 
					
						
							|  |  |  |  * the project provides a web site, mailing lists and IRC | 
					
						
							|  |  |  |  * channels for your use. | 
					
						
							| 
									
										
										
										
											2001-03-01 19:50:12 +00:00
										 |  |  |  * | 
					
						
							|  |  |  |  * This program is free software, distributed under the terms of | 
					
						
							| 
									
										
										
										
											2005-09-14 20:46:50 +00:00
										 |  |  |  * the GNU General Public License Version 2. See the LICENSE file | 
					
						
							|  |  |  |  * at the top of the source tree. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-10-24 20:12:06 +00:00
										 |  |  | /*! \file
 | 
					
						
							| 
									
										
										
										
											2005-09-14 20:46:50 +00:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2005-10-24 20:12:06 +00:00
										 |  |  |  * \brief u-Law to Signed linear conversion | 
					
						
							| 
									
										
										
										
											2005-12-30 21:18:06 +00:00
										 |  |  |  * | 
					
						
							|  |  |  |  * \author Mark Spencer <markster@digium.com>  | 
					
						
							| 
									
										
										
										
											2001-03-01 19:50:12 +00:00
										 |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-06-06 20:27:51 +00:00
										 |  |  | #include "asterisk.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-06-06 22:12:19 +00:00
										 |  |  | ASTERISK_FILE_VERSION(__FILE__, "$Revision$") | 
					
						
							| 
									
										
										
										
											2005-06-06 20:27:51 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-04-21 06:02:45 +00:00
										 |  |  | #include "asterisk/ulaw.h"
 | 
					
						
							| 
									
										
										
										
											2001-03-01 19:50:12 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-11-14 19:00:38 +00:00
										 |  |  | #define ZEROTRAP    /*!< turn on the trap as per the MIL-STD */
 | 
					
						
							|  |  |  | #define BIAS 0x84   /*!< define the add-in bias for 16 bit samples */
 | 
					
						
							| 
									
										
										
										
											2001-03-01 19:50:12 +00:00
										 |  |  | #define CLIP 32635
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-12-07 22:57:34 +00:00
										 |  |  | unsigned char __ast_lin2mu[16384]; | 
					
						
							|  |  |  | short __ast_mulaw[256]; | 
					
						
							| 
									
										
										
										
											2001-03-01 19:50:12 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-11-14 19:00:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | static unsigned char linear2ulaw(short sample) | 
					
						
							| 
									
										
										
										
											2001-03-01 19:50:12 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2005-11-14 19:00:38 +00:00
										 |  |  | 	static int exp_lut[256] = { | 
					
						
							|  |  |  | 		0,0,1,1,2,2,2,2,3,3,3,3,3,3,3,3, | 
					
						
							|  |  |  | 		4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, | 
					
						
							|  |  |  | 		5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, | 
					
						
							|  |  |  | 		5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, | 
					
						
							|  |  |  | 		6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, | 
					
						
							|  |  |  | 		6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, | 
					
						
							|  |  |  | 		6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, | 
					
						
							|  |  |  | 		6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, | 
					
						
							|  |  |  | 		7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, | 
					
						
							|  |  |  | 		7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, | 
					
						
							|  |  |  | 		7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, | 
					
						
							|  |  |  | 		7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, | 
					
						
							|  |  |  | 		7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, | 
					
						
							|  |  |  | 		7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, | 
					
						
							|  |  |  | 		7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, | 
					
						
							|  |  |  | 		7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7 }; | 
					
						
							|  |  |  | 	int sign, exponent, mantissa; | 
					
						
							|  |  |  | 	unsigned char ulawbyte; | 
					
						
							| 
									
										
										
										
											2001-03-01 19:50:12 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-11-14 19:00:38 +00:00
										 |  |  | 	/* Get the sample into sign-magnitude. */ | 
					
						
							|  |  |  | 	sign = (sample >> 8) & 0x80;          /* set aside the sign */ | 
					
						
							|  |  |  | 	if (sign != 0)  | 
					
						
							|  |  |  | 		sample = -sample;              /* get magnitude */ | 
					
						
							|  |  |  | 	if (sample > CLIP) | 
					
						
							|  |  |  | 		sample = CLIP;             /* clip the magnitude */ | 
					
						
							| 
									
										
										
										
											2001-03-01 19:50:12 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-11-14 19:00:38 +00:00
										 |  |  | 	/* Convert from 16 bit linear to ulaw. */ | 
					
						
							|  |  |  | 	sample = sample + BIAS; | 
					
						
							|  |  |  | 	exponent = exp_lut[(sample >> 7) & 0xFF]; | 
					
						
							|  |  |  | 	mantissa = (sample >> (exponent + 3)) & 0x0F; | 
					
						
							|  |  |  | 	ulawbyte = ~(sign | (exponent << 4) | mantissa); | 
					
						
							| 
									
										
										
										
											2001-03-01 19:50:12 +00:00
										 |  |  | #ifdef ZEROTRAP
 | 
					
						
							| 
									
										
										
										
											2005-11-14 19:00:38 +00:00
										 |  |  | 	if (ulawbyte == 0) | 
					
						
							|  |  |  | 		ulawbyte = 0x02;   /* optional CCITT trap */ | 
					
						
							| 
									
										
										
										
											2001-03-01 19:50:12 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-11-14 19:00:38 +00:00
										 |  |  | 	return ulawbyte; | 
					
						
							| 
									
										
										
										
											2001-03-01 19:50:12 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-11-14 19:00:38 +00:00
										 |  |  | /*!
 | 
					
						
							|  |  |  |  * \brief  Set up mu-law conversion table | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2001-03-01 19:50:12 +00:00
										 |  |  | void ast_ulaw_init(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	int i; | 
					
						
							| 
									
										
										
										
											2006-07-10 19:05:48 +00:00
										 |  |  | 	for (i = 0; i < 256; i++) { | 
					
						
							|  |  |  | 		short mu, e, f, y; | 
					
						
							|  |  |  | 		static short etab[] = {0,132,396,924,1980,4092,8316,16764}; | 
					
						
							| 
									
										
										
										
											2001-03-01 19:50:12 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-07-10 19:05:48 +00:00
										 |  |  | 		mu = 255 - i; | 
					
						
							|  |  |  | 		e = (mu & 0x70) / 16; | 
					
						
							| 
									
										
										
										
											2001-03-01 19:50:12 +00:00
										 |  |  | 		f = mu & 0x0f; | 
					
						
							|  |  |  | 		y = f * (1 << (e + 3)); | 
					
						
							|  |  |  | 		y += etab[e]; | 
					
						
							| 
									
										
										
										
											2006-07-10 19:05:48 +00:00
										 |  |  | 		if (mu & 0x80) | 
					
						
							|  |  |  | 			y = -y; | 
					
						
							|  |  |  | 		__ast_mulaw[i] = y; | 
					
						
							| 
									
										
										
										
											2005-11-14 19:00:38 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	/* set up the reverse (mu-law) conversion table */ | 
					
						
							| 
									
										
										
										
											2006-07-10 19:05:48 +00:00
										 |  |  | 	for (i = -32768; i < 32768; i++) { | 
					
						
							| 
									
										
										
										
											2001-12-07 22:57:34 +00:00
										 |  |  | 		__ast_lin2mu[((unsigned short)i) >> 2] = linear2ulaw(i); | 
					
						
							| 
									
										
										
										
											2005-11-14 19:00:38 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2001-03-01 19:50:12 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 |