changeset 756:b562c8bcf704

uLaw support
author arpi_esp
date Fri, 11 May 2001 01:20:22 +0000
parents 0d15358b0319
children 8814b8de8b4e
files alaw.c
diffstat 1 files changed, 46 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/alaw.c	Thu May 10 18:46:33 2001 +0000
+++ b/alaw.c	Fri May 11 01:20:22 2001 +0000
@@ -6,7 +6,52 @@
 #define xaBYTE char
 #define xaUBYTE unsigned char
 
-xaULONG long xa_alaw_2_sign[256];
+//xaULONG long xa_alaw_2_sign[256];
+xaULONG xa_alaw_2_sign[256];
+xaULONG xa_ulaw_2_sign[256];
+
+/*
+** This routine converts from ulaw to 16 bit linear.
+**
+** Craig Reese: IDA/Supercomputing Research Center
+** 29 September 1989
+**
+** References:
+** 1) CCITT Recommendation G.711  (very difficult to follow)
+** 2) MIL-STD-188-113,"Interoperability and Performance Standards
+**     for Analog-to_Digital Conversion Techniques,"
+**     17 February 1987
+**
+** Input: 8 bit ulaw sample
+** Output: signed 16 bit linear sample
+*/
+
+xaLONG XA_uLaw_to_Signed( ulawbyte )
+xaUBYTE ulawbyte;
+{
+  static int exp_lut[8] = { 0, 132, 396, 924, 1980, 4092, 8316, 16764 };
+  int sign, exponent, mantissa, sample;
+ 
+  ulawbyte = ~ ulawbyte;
+  sign = ( ulawbyte & 0x80 );
+  exponent = ( ulawbyte >> 4 ) & 0x07;
+  mantissa = ulawbyte & 0x0F;
+  sample = exp_lut[exponent] + ( mantissa << ( exponent + 3 ) );
+  if ( sign != 0 ) sample = -sample;
+ 
+  return sample;
+}
+
+void Gen_uLaw_2_Signed()
+{ xaULONG i;
+  for(i=0;i<256;i++)
+  { xaUBYTE data = (xaUBYTE)(i);
+    xaLONG d = XA_uLaw_to_Signed( data );
+    xa_ulaw_2_sign[i] = (xaULONG)((xaULONG)(d) & 0xffff);
+  }
+}
+
+
 
 void Gen_aLaw_2_Signed()
 { xaULONG i;