Version 0.1.7 from FTP
authorMark Spencer <markster@digium.com>
Thu, 1 Mar 2001 19:50:12 +0000 (19:50 +0000)
committerMark Spencer <markster@digium.com>
Thu, 1 Mar 2001 19:50:12 +0000 (19:50 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@231 65c4cc65-6c06-0410-ace0-fbb531ad65f3

include/asterisk/ulaw.h [new file with mode: 0755]
ulaw.c [new file with mode: 0755]

diff --git a/include/asterisk/ulaw.h b/include/asterisk/ulaw.h
new file mode 100755 (executable)
index 0000000..f7d3ea5
--- /dev/null
@@ -0,0 +1,23 @@
+/*
+ * Asterisk -- A telephony toolkit for Linux.
+ *
+ * u-Law to Signed linear conversion
+ * 
+ * Copyright (C) 1999, Mark Spencer
+ *
+ * Mark Spencer <markster@linux-support.net>
+ *
+ * This program is free software, distributed under the terms of
+ * the GNU General Public License
+ */
+
+#ifndef _ASTERISK_ULAW_H
+#define _ASTERISK_ULAW_H
+
+extern void ast_ulaw_init(void);
+extern unsigned char ast_lin2mu[65536];
+extern short ast_mulaw[256];
+
+
+
+#endif
diff --git a/ulaw.c b/ulaw.c
new file mode 100755 (executable)
index 0000000..0684e47
--- /dev/null
+++ b/ulaw.c
@@ -0,0 +1,88 @@
+/*
+ * Asterisk -- A telephony toolkit for Linux.
+ *
+ * u-Law to Signed linear conversion
+ * 
+ * Copyright (C) 1999, Mark Spencer
+ *
+ * Mark Spencer <markster@linux-support.net>
+ *
+ * This program is free software, distributed under the terms of
+ * the GNU General Public License
+ */
+
+#include <asterisk/ulaw.h>
+
+#define ZEROTRAP    /* turn on the trap as per the MIL-STD */
+#define BIAS 0x84   /* define the add-in bias for 16 bit samples */
+#define CLIP 32635
+
+unsigned char ast_lin2mu[65536];
+short ast_mulaw[256];
+
+static unsigned char
+linear2ulaw(short sample)
+{
+  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;
+
+  /* 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 */
+
+  /* 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);
+#ifdef ZEROTRAP
+  if (ulawbyte == 0) ulawbyte = 0x02;   /* optional CCITT trap */
+#endif
+
+  return(ulawbyte);
+}
+
+void ast_ulaw_init(void)
+{
+       int i;
+       /* 
+        *  Set up mu-law conversion table
+        */
+       for(i = 0;i < 256;i++)
+          {
+               short mu,e,f,y;
+               static short etab[]={0,132,396,924,1980,4092,8316,16764};
+
+               mu = 255-i;
+               e = (mu & 0x70)/16;
+               f = mu & 0x0f;
+               y = f * (1 << (e + 3));
+               y += etab[e];
+               if (mu & 0x80) y = -y;
+               ast_mulaw[i] = y;
+          }
+         /* set up the reverse (mu-law) conversion table */
+       for(i = 0; i < 65536; i++)
+          {
+               ast_lin2mu[i] = linear2ulaw(i - 32768);
+          }
+
+}
+