From 2bd936105e72e2dcc1f847a28f04b2538e83020f Mon Sep 17 00:00:00 2001
From: Matteo Brancaleoni <mbrancaleoni@espia.it>
Date: Wed, 12 Feb 2003 13:59:15 +0000
Subject: [PATCH] mer feb 12 14:56:57 CET 2003

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@612 65c4cc65-6c06-0410-ace0-fbb531ad65f3
---
 .cvsignore                     |   4 +
 CHANGES                        |   8 +
 apps/Makefile                  |   2 +-
 apps/app_agi.c                 |   2 -
 apps/app_macro.c               | 234 +++++++++++++++++++++++
 apps/app_substring.c           |   2 -
 astman/.cvsignore              |   1 +
 channel.c                      |   7 +-
 channels/.cvsignore            |   3 +
 channels/Makefile              |   2 +-
 channels/chan_iax.c            |   9 +-
 channels/chan_mgcp.c           |  39 +++-
 channels/chan_sip.c            | 285 +++++++++++++++-------------
 channels/chan_zap.c            |  34 ++--
 channels/ixjuser.h             |   7 +-
 cli.c                          |   3 +
 codecs/.cvsignore              |   2 +
 codecs/lpc10/analys.c          |  28 ++-
 codecs/lpc10/bsynz.c           |  28 ++-
 codecs/lpc10/chanwr.c          |  14 +-
 codecs/lpc10/dcbias.c          |  14 +-
 codecs/lpc10/decode.c          |  28 ++-
 codecs/lpc10/deemp.c           |  14 +-
 codecs/lpc10/difmag.c          |  14 +-
 codecs/lpc10/dyptrk.c          |  21 ++-
 codecs/lpc10/encode.c          |  28 ++-
 codecs/lpc10/energy.c          |  14 +-
 codecs/lpc10/f2c.h             |   7 +-
 codecs/lpc10/f2clib.c          |   7 +-
 codecs/lpc10/ham84.c           |  14 +-
 codecs/lpc10/hp100.c           |  14 +-
 codecs/lpc10/invert.c          |  21 ++-
 codecs/lpc10/irc2pc.c          |  21 ++-
 codecs/lpc10/ivfilt.c          |  14 +-
 codecs/lpc10/lpc10.h           |   7 +-
 codecs/lpc10/lpcdec.c          |  28 ++-
 codecs/lpc10/lpcenc.c          |  21 ++-
 codecs/lpc10/lpcini.c          |  28 ++-
 codecs/lpc10/lpfilt.c          |  14 +-
 codecs/lpc10/median.c          |  14 +-
 codecs/lpc10/mload.c           |  14 +-
 codecs/lpc10/onset.c           |  21 ++-
 codecs/lpc10/pitsyn.c          |  21 ++-
 codecs/lpc10/placea.c          |  14 +-
 codecs/lpc10/placev.c          |  14 +-
 codecs/lpc10/preemp.c          |  14 +-
 codecs/lpc10/prepro.c          |  14 +-
 codecs/lpc10/random.c          |  14 +-
 codecs/lpc10/rcchk.c           |  14 +-
 codecs/lpc10/synths.c          |  28 ++-
 codecs/lpc10/tbdm.c            |  14 +-
 codecs/lpc10/voicin.c          |  21 ++-
 codecs/lpc10/vparms.c          |  14 +-
 configs/extensions.conf.sample | 333 ++++++++++++++++++---------------
 editline/.cvsignore            |  22 +++
 editline/np/.cvsignore         |   5 +
 include/asterisk/pbx.h         |   4 +
 include/asterisk/rtp.h         |   4 +
 pbx.c                          | 229 ++++++++++++++---------
 pbx/.cvsignore                 |   1 +
 pbx/pbx_config.c               |  31 ++-
 rtp.c                          |  69 ++++---
 62 files changed, 1373 insertions(+), 599 deletions(-)
 create mode 100755 .cvsignore
 create mode 100755 apps/app_macro.c
 create mode 100755 astman/.cvsignore
 create mode 100755 channels/.cvsignore
 create mode 100755 codecs/.cvsignore
 create mode 100755 editline/.cvsignore
 create mode 100755 editline/np/.cvsignore
 create mode 100755 pbx/.cvsignore

diff --git a/.cvsignore b/.cvsignore
new file mode 100755
index 0000000000..7dca5fe161
--- /dev/null
+++ b/.cvsignore
@@ -0,0 +1,4 @@
+asterisk
+build.h
+ast_expr.c
+.version
diff --git a/CHANGES b/CHANGES
index 20881564b3..55cd0d7d57 100755
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,11 @@
+ -- Create special variable "EXTEN-n" where it is extension stripped by n MSD
+ -- Fix uninitialized frame pointer in channel.c
+ -- Add global variables support under [globals] of extensions.conf
+ -- Add macro support (show application Macro)
+ -- Allow [123-5] etc in extensions
+ -- Allow format of App(arg1,arg2,...) instead of just App,arg1|arg2 in dialplan
+ -- Add message waiting indicator to SIP
+ -- Fix double free bug in channel.c
 Asterisk 0.3.0
  -- Add fastfoward, rewind, seek, and truncate functions to streams
  -- Support registration
diff --git a/apps/Makefile b/apps/Makefile
index 1f08653bd6..95f7275319 100755
--- a/apps/Makefile
+++ b/apps/Makefile
@@ -17,7 +17,7 @@ APPS=app_dial.so app_playback.so app_voicemail.so app_directory.so app_intercom.
      app_agi.so app_qcall.so app_adsiprog.so app_getcpeid.so app_milliwatt.so \
      app_zapateller.so app_datetime.so app_setcallerid.so app_festival.so \
      app_queue.so app_senddtmf.so app_parkandannounce.so app_striplsd.so \
-     app_setcidname.so app_lookupcidname.so app_substring.so
+     app_setcidname.so app_lookupcidname.so app_substring.so app_macro.so
 
 #APPS+=app_sql_postgres.so
 #APPS+=app_sql_odbc.so
diff --git a/apps/app_agi.c b/apps/app_agi.c
index add410a801..91ca9749f8 100755
--- a/apps/app_agi.c
+++ b/apps/app_agi.c
@@ -72,8 +72,6 @@ STANDARD_LOCAL_USER;
 
 LOCAL_USER_DECL;
 
-extern char *pbx_builtin_getvar_helper(struct ast_channel *chan, char *name);
-extern void pbx_builtin_setvar_helper(struct ast_channel *chan, char *name, char *value);
 
 #define TONE_BLOCK_SIZE 200
 
diff --git a/apps/app_macro.c b/apps/app_macro.c
new file mode 100755
index 0000000000..bb8b43de8b
--- /dev/null
+++ b/apps/app_macro.c
@@ -0,0 +1,234 @@
+/*
+ * Asterisk -- A telephony toolkit for Linux.
+ *
+ * Macro Implementation
+ * 
+ * Copyright (C) 2003, Digium
+ *
+ * Mark Spencer <markster@digium.com>
+ *
+ * This program is free software, distributed under the terms of
+ * the GNU General Public License
+ */
+
+#include <asterisk/file.h>
+#include <asterisk/logger.h>
+#include <asterisk/channel.h>
+#include <asterisk/pbx.h>
+#include <asterisk/module.h>
+#include <asterisk/options.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include <pthread.h>
+
+#define MAX_ARGS 80
+
+static char *tdesc = "Extension Macros";
+
+static char *descrip =
+"  Macro(macroname|arg1|arg2...): Executes a macro using the context\n"
+"'macro-<macroname>', jumping to the 's' extension of that context and\n"
+"executing each step, then returning when the steps end.  The calling\n"
+"extension, context, and priority are stored in ${MACRO_EXTEN}, \n"
+"${MACRO_CONTEXT} and ${MACRO_PRIORITY} respectively.  Arguments become\n"
+"${ARG1}, ${ARG2}, etc in the macro context.  Macro returns -1 if\n"
+"any step in the macro returns -1, and 0 otherwise.  If you Goto out\n"
+"of the Macro context, the Macro will terminate and control will be return\n"
+"at the location of the Goto.  Otherwise if ${MACRO_OFFSET} is set at\n"
+"termination, Macro will attempt to continue at priority\n"
+"MACRO_OFFSET + N + 1 if such a step exists, and N + 1 otherwise.\n";
+
+static char *app = "Macro";
+
+static char *synopsis = "Macro Implementation";
+
+STANDARD_LOCAL_USER;
+
+LOCAL_USER_DECL;
+
+static int macro_exec(struct ast_channel *chan, void *data)
+{
+  char tmp[256] = "";
+  char *cur, *rest;
+  char *macro;
+  char fullmacro[80];
+  char varname[80];
+  char *oldargs[MAX_ARGS + 1] = { NULL, };
+  int argc, x;
+  int res;
+  char oldexten[256]="";
+  int oldpriority;
+  char pc[80];
+  char oldcontext[256] = "";
+  char *offsets;
+  int offset;
+  
+  char *save_macro_exten;
+  char *save_macro_context;
+  char *save_macro_priority;
+  char *save_macro_offset;
+  
+  if (!data || !strlen(data)) {
+    ast_log(LOG_WARNING, "Invalid Macro incantation\n");
+    return 0;
+  }
+  strncpy(tmp, data, sizeof(tmp) - 1);
+  rest = tmp;
+  macro = strsep(&rest, "|");
+  if (!macro || !strlen(macro)) {
+  	ast_log(LOG_WARNING, "Invalid macro name specified\n");
+	return 0;
+  }
+  snprintf(fullmacro, sizeof(fullmacro), "macro-%s", macro);
+  if (!ast_exists_extension(chan, fullmacro, "s", 1, chan->callerid)) {
+  	if (!ast_context_find(fullmacro)) 
+		ast_log(LOG_WARNING, "No such context '%s' for macro '%s'\n", fullmacro, macro);
+	else
+	  	ast_log(LOG_WARNING, "Context '%s' for macro '%s' lacks 's' extension, priority 1\n", fullmacro, macro);
+	return 0;
+  }
+  /* Save old info */
+  oldpriority = chan->priority;
+  strncpy(oldexten, chan->exten, sizeof(oldexten) - 1);
+  strncpy(oldcontext, chan->context, sizeof(oldcontext) - 1);
+  argc = 1;
+  /* Save old macro variables */
+  save_macro_exten = pbx_builtin_getvar_helper(chan, "MACRO_EXTEN");
+  if (save_macro_exten) save_macro_exten = strdup(save_macro_exten);
+  pbx_builtin_setvar_helper(chan, "MACRO_EXTEN", oldexten);
+
+  save_macro_context = pbx_builtin_getvar_helper(chan, "MACRO_CONTEXT");
+  if (save_macro_context) save_macro_context = strdup(save_macro_context);
+  pbx_builtin_setvar_helper(chan, "MACRO_CONTEXT", oldcontext);
+
+  save_macro_priority = pbx_builtin_getvar_helper(chan, "MACRO_PRIORITY");
+  if (save_macro_priority) save_macro_priority = strdup(save_macro_priority);
+  snprintf(pc, sizeof(pc), "%d", oldpriority);
+  pbx_builtin_setvar_helper(chan, "MACRO_PRIORITY", pc);
+  
+  save_macro_offset = pbx_builtin_getvar_helper(chan, "MACRO_OFFSET");
+  if (save_macro_offset) save_macro_offset = strdup(save_macro_offset);
+  pbx_builtin_setvar_helper(chan, "MACRO_OFFSET", NULL);
+
+  /* Setup environment for new run */
+  strcpy(chan->exten, "s");
+  strncpy(chan->context, fullmacro, sizeof(chan->context));
+  chan->priority = 1;
+
+  while((cur = strsep(&rest, "|")) && (argc < MAX_ARGS)) {
+  	/* Save copy of old arguments if we're overwriting some, otherwise
+	   let them pass through to the other macro */
+	oldargs[argc] = pbx_builtin_getvar_helper(chan, varname);
+	if (oldargs[argc])
+		oldargs[argc] = strdup(oldargs[argc]);
+  	snprintf(varname, sizeof(varname), "ARG%d", argc);
+	pbx_builtin_setvar_helper(chan, varname, cur);
+	argc++;
+  }
+  while(ast_exists_extension(chan, chan->context, chan->exten, chan->priority, chan->callerid)) {
+	if ((res = ast_spawn_extension(chan, chan->context, chan->exten, chan->priority, chan->callerid))) {
+		/* Something bad happened, or a hangup has been requested. */
+		if (((res >= '0') && (res <= '9')) || ((res >= 'A') && (res <= 'F'))) {
+			/* Just return result as to the previous application as if it had been dialed */
+			ast_log(LOG_DEBUG, "Oooh, got something to jump out with ('%c')!\n", res);
+			break;
+		}
+		switch(res) {
+		case AST_PBX_KEEPALIVE:
+			if (option_debug)
+				ast_log(LOG_DEBUG, "Spawn extension (%s,%s,%d) exited KEEPALIVE in macro %s on '%s'\n", chan->context, chan->exten, chan->priority, macro, chan->name);
+			else if (option_verbose > 1)
+				ast_verbose( VERBOSE_PREFIX_2 "Spawn extension (%s, %s, %d) exited KEEPALIVE in macro '%s' on '%s'\n", chan->context, chan->exten, chan->priority, macro, chan->name);
+			goto out;
+			break;
+		default:
+			if (option_debug)
+				ast_log(LOG_DEBUG, "Spawn extension (%s,%s,%d) exited non-zero on '%s' in macro '%s'\n", chan->context, chan->exten, chan->priority, chan->name, macro);
+			else if (option_verbose > 1)
+				ast_verbose( VERBOSE_PREFIX_2 "Spawn extension (%s, %s, %d) exited non-zero on '%s' in macro '%s'\n", chan->context, chan->exten, chan->priority, chan->name, macro);
+			goto out;
+		}
+	}
+	if (strcasecmp(chan->context, fullmacro)) {
+		if (option_verbose > 1)
+			ast_verbose(VERBOSE_PREFIX_2 "Channel '%s' jumping out of macro '%s'\n", chan->name, macro);
+		break;
+	}
+	if (chan->_softhangup) {
+		ast_log(LOG_DEBUG, "Extension %s, priority %d returned normally even though call was hung up\n",
+			chan->exten, chan->priority);
+		goto out;
+	}
+	chan->priority++;
+  }
+out:
+  for (x=1;x<argc;x++) {
+  	/* Restore old arguments and delete ours */
+	snprintf(varname, sizeof(varname), "ARG%d", x);
+  	if (oldargs[x]) {
+		pbx_builtin_setvar_helper(chan, varname, oldargs[x]);
+		free(oldargs[x]);
+	} else {
+		pbx_builtin_setvar_helper(chan, varname, NULL);
+	}
+  }
+
+  /* Restore macro variables */
+  pbx_builtin_setvar_helper(chan, "MACRO_EXTEN", save_macro_exten);
+  if (save_macro_exten) free(save_macro_exten);
+  pbx_builtin_setvar_helper(chan, "MACRO_CONTEXT", save_macro_context);
+  if (save_macro_context) free(save_macro_context);
+  pbx_builtin_setvar_helper(chan, "MACRO_PRIORITY", save_macro_priority);
+  if (save_macro_priority) free(save_macro_priority);
+
+  if (!strcasecmp(chan->context, fullmacro)) {
+  	/* If we're leaving the macro normally, restore original information */
+	chan->priority = oldpriority;
+	strncpy(chan->exten, oldexten, sizeof(chan->exten) - 1);
+	strncpy(chan->context, oldcontext, sizeof(chan->context) - 1);
+	if ((offsets = pbx_builtin_getvar_helper(chan, "MACRO_OFFSET"))) {
+		/* Handle macro offset if it's set by checking the availability of step n + offset + 1, otherwise continue
+		   normally if there is any problem */
+		if (sscanf(offsets, "%d", &offset) == 1) {
+			if (ast_exists_extension(chan, chan->context, chan->exten, chan->priority + offset + 1, chan->callerid)) {
+				chan->priority += offset;
+			}
+		}
+	}
+  }
+
+  pbx_builtin_setvar_helper(chan, "MACRO_OFFSET", save_macro_offset);
+  if (save_macro_offset) free(save_macro_offset);
+  return res;
+}
+
+int unload_module(void)
+{
+	STANDARD_HANGUP_LOCALUSERS;
+	return ast_unregister_application(app);
+}
+
+int load_module(void)
+{
+	return ast_register_application(app, macro_exec, synopsis, descrip);
+}
+
+char *description(void)
+{
+	return tdesc;
+}
+
+int usecount(void)
+{
+	int res;
+	STANDARD_USECOUNT(res);
+	return res;
+}
+
+char *key()
+{
+	return ASTERISK_GPL_KEY;
+}
diff --git a/apps/app_substring.c b/apps/app_substring.c
index a1edf64ae3..97f0fea0a2 100755
--- a/apps/app_substring.c
+++ b/apps/app_substring.c
@@ -27,8 +27,6 @@
 
 static char *tdesc = "Save substring digits in a given variable";
 
-extern void pbx_builtin_setvar_helper(struct ast_channel *chan, char *name, char *value);
-
 static char *descrip =
 "  StripLSD(variable=string_of_digits|count1|count2): Assigns the substring\n"
 "of string_of_digits to a given variable. Parameter count1 may be positive\n"
diff --git a/astman/.cvsignore b/astman/.cvsignore
new file mode 100755
index 0000000000..a03052999a
--- /dev/null
+++ b/astman/.cvsignore
@@ -0,0 +1 @@
+astman
diff --git a/channel.c b/channel.c
index b7c4ff355e..83659c0734 100755
--- a/channel.c
+++ b/channel.c
@@ -376,6 +376,7 @@ int ast_queue_frame(struct ast_channel *chan, struct ast_frame *fin, int lock)
 int ast_queue_hangup(struct ast_channel *chan, int lock)
 {
 	struct ast_frame f = { AST_FRAME_CONTROL, AST_CONTROL_HANGUP };
+	chan->_softhangup |= AST_SOFTHANGUP_DEV;
 	return ast_queue_frame(chan, &f, lock);
 }
 
@@ -1145,7 +1146,7 @@ static int do_senddigit(struct ast_channel *chan, char digit)
 int ast_write(struct ast_channel *chan, struct ast_frame *fr)
 {
 	int res = -1;
-	struct ast_frame *f;
+	struct ast_frame *f = NULL;
 	/* Stop if we're a zombie or need a soft hangup */
 	if (chan->zombie || ast_check_hangup(chan)) 
 		return -1;
@@ -1180,7 +1181,7 @@ int ast_write(struct ast_channel *chan, struct ast_frame *fr)
 	default:
 		if (chan->pvt->write) {
 			if (chan->pvt->writetrans) {
-				f = ast_translate(chan->pvt->writetrans, fr, 1);
+				f = ast_translate(chan->pvt->writetrans, fr, 0);
 			} else
 				f = fr;
 			if (f)	
@@ -1189,6 +1190,8 @@ int ast_write(struct ast_channel *chan, struct ast_frame *fr)
 				res = 0;
 		}
 	}
+	if (f && (f != fr))
+		ast_frfree(f);
 	chan->blocking = 0;
 	/* Consider a write failure to force a soft hangup */
 	if (res < 0)
diff --git a/channels/.cvsignore b/channels/.cvsignore
new file mode 100755
index 0000000000..ee5ff43b87
--- /dev/null
+++ b/channels/.cvsignore
@@ -0,0 +1,3 @@
+busy.h
+gentone
+ringtone.h
diff --git a/channels/Makefile b/channels/Makefile
index 7669373fcd..dc7eaf4860 100755
--- a/channels/Makefile
+++ b/channels/Makefile
@@ -32,7 +32,7 @@ CFLAGS+=$(shell [ -f alsa-monitor.h ] && echo " -DALSA_MONITOR")
 ZAPPRI=$(shell [ -f /usr/lib/libpri.so.1 ] && echo "-lpri")
 ZAPR2=$(shell [ -f /usr/lib/libmfcr2.so.1 ] && echo "-lmfcr2")
 CHANZAP=$(shell if [ -f .oldzap ]; then echo "chan_zap_old.c"; else echo "chan_zap.c"; fi)
-ZAPLIB=$(shell if ! [ -f .newzap ]; then echo "-lzap"; fi)
+ZAPLIB=$(shell if [ -f .oldzap ]; then echo "-lzap"; fi)
 
 ALSA_SRC=chan_alsa.c
 ALSA_SRC+=$(shell [ -f alsa-monitor.h ] && echo "alsa-monitor.h")
diff --git a/channels/chan_iax.c b/channels/chan_iax.c
index 71ca1e7f92..ce896c7385 100755
--- a/channels/chan_iax.c
+++ b/channels/chan_iax.c
@@ -4712,12 +4712,13 @@ static int cache_get_callno(char *data)
 	for (x=0;x<AST_IAX_MAX_CALLS; x++) {
 		/* Look for an *exact match* call.  Once a call is negotiated, it can only
 		   look up entries for a single context */
-		ast_pthread_mutex_lock(&iaxsl[x]);
-		if (iaxs[x] && !strcasecmp(data, iaxs[x]->dproot)) {
+		if (!pthread_mutex_trylock(&iaxsl[x])) {
+			if (iaxs[x] && !strcasecmp(data, iaxs[x]->dproot)) {
+				ast_pthread_mutex_unlock(&iaxsl[x]);
+				return x;
+			}
 			ast_pthread_mutex_unlock(&iaxsl[x]);
-			return x;
 		}
-		ast_pthread_mutex_unlock(&iaxsl[x]);
 	}
 	/* No match found, we need to create a new one */
 	strncpy(st, data, sizeof(st)-1);
diff --git a/channels/chan_mgcp.c b/channels/chan_mgcp.c
index 79e96200d7..88a0d2cf01 100755
--- a/channels/chan_mgcp.c
+++ b/channels/chan_mgcp.c
@@ -380,11 +380,34 @@ static int mgcp_answer(struct ast_channel *ast)
 	return res;
 }
 
+static struct ast_frame *mgcp_rtp_read(struct mgcp_endpoint *p)
+{
+	/* Retrieve audio/etc from channel.  Assumes p->lock is already held. */
+	struct ast_frame *f;
+	f = ast_rtp_read(p->rtp);
+	if (p->owner) {
+		/* We already hold the channel lock */
+		if (f->frametype == AST_FRAME_VOICE) {
+			if (f->subclass != p->owner->nativeformats) {
+				ast_log(LOG_DEBUG, "Oooh, format changed to %d\n", f->subclass);
+				p->owner->nativeformats = f->subclass;
+				ast_set_read_format(p->owner, p->owner->readformat);
+				ast_set_write_format(p->owner, p->owner->writeformat);
+			}
+		}
+	}
+	return f;
+}
+
+
 static struct ast_frame  *mgcp_read(struct ast_channel *ast)
 {
-	static struct ast_frame f = { AST_FRAME_NULL, };
-	ast_log(LOG_DEBUG, "I should never get called but am on %s!\n", ast->name);
-	return &f;
+	struct ast_frame *fr;
+	struct mgcp_endpoint *p = ast->pvt->pvt;
+	ast_pthread_mutex_lock(&p->lock);
+	fr = mgcp_rtp_read(p);
+	ast_pthread_mutex_unlock(&p->lock);
+	return fr;
 }
 
 static int mgcp_write(struct ast_channel *ast, struct ast_frame *frame)
@@ -473,6 +496,8 @@ static struct ast_channel *mgcp_new(struct mgcp_endpoint *i, int state)
 			tmp->nativeformats = capability;
 		fmt = ast_best_codec(tmp->nativeformats);
 		snprintf(tmp->name, sizeof(tmp->name), "MGCP/%s@%s", i->name, i->parent->name);
+		if (i->rtp)
+			tmp->fds[0] = ast_rtp_fd(i->rtp);
 		tmp->type = type;
 		ast_setstate(tmp, state);
 		if (state == AST_STATE_RING)
@@ -556,6 +581,7 @@ static char *get_header(struct mgcp_request *req, char *name)
 	return __get_header(req, name, &start);
 }
 
+#if 0
 static int rtpready(struct ast_rtp *rtp, struct ast_frame *f, void *data)
 {
 	/* Just deliver the audio directly */
@@ -582,6 +608,7 @@ static int rtpready(struct ast_rtp *rtp, struct ast_frame *f, void *data)
 	ast_pthread_mutex_unlock(&p->lock);
 	return 0;
 }
+#endif
 
 static struct mgcp_endpoint *find_endpoint(char *name, int msgid, struct sockaddr_in *sin)
 {
@@ -1081,9 +1108,13 @@ static void start_rtp(struct mgcp_endpoint *p)
 {
 		ast_pthread_mutex_lock(&p->lock);
 		/* Allocate the RTP now */
-		p->rtp = ast_rtp_new(sched, io);
+		p->rtp = ast_rtp_new(NULL, NULL);
+		if (p->rtp && p->owner)
+			p->owner->fds[0] = ast_rtp_fd(p->rtp);
+#if 0
 		ast_rtp_set_callback(p->rtp, rtpready);
 		ast_rtp_set_data(p->rtp, p);
+#endif		
 		/* Make a call*ID */
 		snprintf(p->callid, sizeof(p->callid), "%08x%s", rand(), p->txident);
 		/* Transmit the connection create */
diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index e9ec11fb13..9818b2788d 100755
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -154,7 +154,6 @@ static struct sip_pvt {
 	char callerid[256];					/* Caller*ID */
 	char via[256];
 	char accountcode[256];				/* Account code */
-	char mailbox[AST_MAX_EXTENSION];		/* Associated mailbox */
 	int amaflags;						/* AMA Flags */
 	struct sip_request initreq;			/* Initial request */
 	
@@ -183,7 +182,6 @@ struct sip_user {
 	char callerid[80];
 	char methods[80];
 	char accountcode[80];
-	char mailbox[AST_MAX_EXTENSION];
 	int hascallerid;
 	int amaflags;
 	int insecure;
@@ -199,6 +197,8 @@ struct sip_peer {
 	char methods[80];
 	char username[80];
 	char mailbox[AST_MAX_EXTENSION];
+	int lastmsgssent;
+	time_t	lastmsgcheck;
 	int dynamic;
 	int expire;
 	int expirey;
@@ -274,7 +274,6 @@ static int transmit_invite(struct sip_pvt *p, char *msg, int sendsdp, char *auth
 static int transmit_reinvite_with_sdp(struct sip_pvt *p, struct ast_rtp *rtp);
 static int transmit_message_with_text(struct sip_pvt *p, char *text);
 static int do_proxy_auth(struct sip_pvt *p, struct sip_request *req);
-static int sip_send_mwi(struct sip_pvt *p);
 
 static int __sip_xmit(struct sip_pvt *p, char *data, int len)
 {
@@ -358,7 +357,6 @@ static int create_addr(struct sip_pvt *r, char *peer)
 			r->canreinvite = p->canreinvite;
 			r->maxtime = p->maxms;
 			strncpy(r->context, p->context,sizeof(r->context)-1);
-			strncpy(r->mailbox, p->mailbox,sizeof(r->mailbox)-1);
 			if ((p->addr.sin_addr.s_addr || p->defaddr.sin_addr.s_addr) &&
 				(!p->maxms || ((p->lastms > 0)  && (p->lastms <= p->maxms)))) {
 				if (p->addr.sin_addr.s_addr) {
@@ -638,13 +636,6 @@ static int sip_answer(struct ast_channel *ast)
 	return res;
 }
 
-static struct ast_frame  *sip_read(struct ast_channel *ast)
-{
-	static struct ast_frame f = { AST_FRAME_NULL, };
-	ast_log(LOG_DEBUG, "I should never get called but am on %s!\n", ast->name);
-	return &f;
-}
-
 static int sip_write(struct ast_channel *ast, struct ast_frame *frame)
 {
 	struct sip_pvt *p = ast->pvt->pvt;
@@ -818,6 +809,7 @@ static struct ast_channel *sip_new(struct sip_pvt *i, int state)
 		fmt = ast_best_codec(tmp->nativeformats);
 		snprintf(tmp->name, sizeof(tmp->name), "SIP/%s:%d", inet_ntoa(i->sa.sin_addr), ntohs(i->sa.sin_port));
 		tmp->type = type;
+		tmp->fds[0] = ast_rtp_fd(i->rtp);
 		ast_setstate(tmp, state);
 		if (state == AST_STATE_RING)
 			tmp->rings = 1;
@@ -922,31 +914,33 @@ static char *get_header(struct sip_request *req, char *name)
 	return __get_header(req, name, &start);
 }
 
-static int rtpready(struct ast_rtp *rtp, struct ast_frame *f, void *data)
+static struct ast_frame *sip_rtp_read(struct sip_pvt *p)
 {
-	/* Just deliver the audio directly */
-	struct sip_pvt *p = data;
-	ast_pthread_mutex_lock(&p->lock);
+	/* Retrieve audio/etc from channel.  Assumes p->lock is already held. */
+	struct ast_frame *f;
+	f = ast_rtp_read(p->rtp);
 	if (p->owner) {
-		/* Generally, you lock in the order channel lock, followed by private
-		   lock.  Since here we are doing the reverse, there is the possibility
-		   of deadlock.  As a result, in the case of a deadlock, we simply fail out
-		   here. */
-		if (!pthread_mutex_trylock(&p->owner->lock)) {
-			if (f->frametype == AST_FRAME_VOICE) {
-				if (f->subclass != p->owner->nativeformats) {
-					ast_log(LOG_DEBUG, "Oooh, format changed to %d\n", f->subclass);
-					p->owner->nativeformats = f->subclass;
-					ast_set_read_format(p->owner, p->owner->readformat);
-					ast_set_write_format(p->owner, p->owner->writeformat);
-				}
+		/* We already hold the channel lock */
+		if (f->frametype == AST_FRAME_VOICE) {
+			if (f->subclass != p->owner->nativeformats) {
+				ast_log(LOG_DEBUG, "Oooh, format changed to %d\n", f->subclass);
+				p->owner->nativeformats = f->subclass;
+				ast_set_read_format(p->owner, p->owner->readformat);
+				ast_set_write_format(p->owner, p->owner->writeformat);
 			}
-			ast_queue_frame(p->owner, f, 0);
-			pthread_mutex_unlock(&p->owner->lock);
 		}
 	}
+	return f;
+}
+
+static struct ast_frame *sip_read(struct ast_channel *ast)
+{
+	struct ast_frame *fr;
+	struct sip_pvt *p = ast->pvt->pvt;
+	ast_pthread_mutex_lock(&p->lock);
+	fr = sip_rtp_read(p);
 	ast_pthread_mutex_unlock(&p->lock);
-	return 0;
+	return fr;
 }
 
 static void build_callid(char *callid, int len, struct in_addr ourip)
@@ -974,7 +968,7 @@ static struct sip_pvt *sip_alloc(char *callid, struct sockaddr_in *sin)
 	/* Keep track of stuff */
 	memset(p, 0, sizeof(struct sip_pvt));
 	p->initid = -1;
-	p->rtp = ast_rtp_new(sched, io);
+	p->rtp = ast_rtp_new(NULL, NULL);
 	p->branch = rand();	
 	p->tag = rand();
 	/* Start with 101 instead of 1 */
@@ -986,8 +980,10 @@ static struct sip_pvt *sip_alloc(char *callid, struct sockaddr_in *sin)
 	}
 	ast_rtp_settos(p->rtp, tos);
 	ast_pthread_mutex_init(&p->lock);
+#if 0
 	ast_rtp_set_data(p->rtp, p);
 	ast_rtp_set_callback(p->rtp, rtpready);
+#endif	
 	if (sin) {
 		memcpy(&p->sa, sin, sizeof(p->sa));
 		memcpy(&p->ourip, myaddrfor(&p->sa.sin_addr), sizeof(p->ourip));
@@ -1238,8 +1234,8 @@ static int process_sdp(struct sip_pvt *p, struct sip_request *req)
 		ast_log(LOG_WARNING, "No compatible codecs!\n");
 		return -1;
 	}
-	if (p->owner && (p->owner->nativeformats != p->capability)) {
-		ast_log(LOG_DEBUG, "Oooh, we need to change our formats since our peer supports only %d\n", p->capability);
+	if (p->owner && !(p->owner->nativeformats & p->capability)) {
+		ast_log(LOG_DEBUG, "Oooh, we need to change our formats since our peer supports only %d and not %d\n", p->capability, p->owner->nativeformats);
 		p->owner->nativeformats = p->capability;
 		ast_set_read_format(p->owner, p->owner->readformat);
 		ast_set_write_format(p->owner, p->owner->writeformat);
@@ -1630,9 +1626,8 @@ static int transmit_reinvite_with_sdp(struct sip_pvt *p, struct ast_rtp *rtp)
 	return send_response(p, &resp);
 }
 
-static int transmit_invite(struct sip_pvt *p, char *cmd, int sdp, char *auth, char *vxml_url)
+static void initreqprep(struct sip_request *req, struct sip_pvt *p, char *cmd, char *vxml_url)
 {
-	struct sip_request req;
 	char invite[256];
 	char from[256];
 	char to[256];
@@ -1670,12 +1665,12 @@ static int transmit_invite(struct sip_pvt *p, char *cmd, int sdp, char *auth, ch
 	{
 		snprintf(to, sizeof(to), "<%s>", invite );
 	}
-	memset(&req, 0, sizeof(req));
-	init_req(&req, cmd, invite);
+	memset(req, 0, sizeof(struct sip_request));
+	init_req(req, cmd, invite);
 	snprintf(tmp, sizeof(tmp), "%d %s", ++p->ocseq, cmd);
 
-	add_header(&req, "Via", p->via);
-	add_header(&req, "From", from);
+	add_header(req, "Via", p->via);
+	add_header(req, "From", from);
 	{
 		char contact2[256] ="", *c, contact[256];
 		/* XXX This isn't exactly right and it's implemented
@@ -1683,12 +1678,18 @@ static int transmit_invite(struct sip_pvt *p, char *cmd, int sdp, char *auth, ch
 		strncpy(contact2, from, sizeof(contact2)-1);
 		c = ditch_braces(contact2);
 		snprintf(contact, sizeof(contact), "<%s>", c);
-		add_header(&req, "Contact", contact);
+		add_header(req, "Contact", contact);
 	}
-	add_header(&req, "To", to);
-	add_header(&req, "Call-ID", p->callid);
-	add_header(&req, "CSeq", tmp);
-	add_header(&req, "User-Agent", "Asterisk PBX");
+	add_header(req, "To", to);
+	add_header(req, "Call-ID", p->callid);
+	add_header(req, "CSeq", tmp);
+	add_header(req, "User-Agent", "Asterisk PBX");
+}
+
+static int transmit_invite(struct sip_pvt *p, char *cmd, int sdp, char *auth, char *vxml_url)
+{
+	struct sip_request req;
+	initreqprep(&req, p, cmd, vxml_url);
 	if (auth)
 		add_header(&req, "Proxy-Authorization", auth);
 	if (sdp) {
@@ -1706,6 +1707,30 @@ static int transmit_invite(struct sip_pvt *p, char *cmd, int sdp, char *auth, ch
 	return send_request(p, &req);
 }
 
+static int transmit_notify(struct sip_pvt *p, int hasmsgs)
+{
+	struct sip_request req;
+	char tmp[256];
+	char clen[20];
+	initreqprep(&req, p, "NOTIFY", NULL);
+	add_header(&req, "Event", "message-summary");
+	add_header(&req, "Content-Type", "text/plain");
+
+	snprintf(tmp, sizeof(tmp), "Message-Waiting: %s\n", hasmsgs ? "yes" : "no");
+	snprintf(clen, sizeof(clen), "%d", strlen(tmp));
+	add_header(&req, "Content-Length", clen);
+	add_line(&req, tmp);
+
+	if (!p->initreq.headers) {
+		/* Use this as the basis */
+		copy_request(&p->initreq, &req);
+		parse(&p->initreq);
+	}
+
+	p->lastinvite = p->ocseq;
+	return send_request(p, &req);
+}
+
 static int transmit_register(struct sip_registry *r, char *cmd, char *auth);
 
 static int sip_reregister(void *data) 
@@ -1801,10 +1826,9 @@ static int transmit_register(struct sip_registry *r, char *cmd, char *auth)
 	add_header(&req, "User-Agent", "Asterisk PBX");
 	if (auth) 
 		add_header(&req, "Authorization", auth);
-#define EXPIRE_TIMEOUT "Thu, 01 Dec 2003 16:00:00 GMT"
 
-
-	add_header(&req, "expires", EXPIRE_TIMEOUT);
+	snprintf(tmp, sizeof(tmp), "%d", DEFAULT_EXPIREY);
+	add_header(&req, "Expires", tmp);
 	add_header(&req, "Event", "registration");
 	copy_request(&p->initreq, &req);
 	r->regstate=auth?REG_STATE_AUTHSENT:REG_STATE_REGSENT;
@@ -1904,8 +1928,6 @@ static int parse_contact(struct sip_pvt *pvt, struct sip_peer *p, struct sip_req
 		strncpy(p->username, c, sizeof(p->username) - 1);
 	else
 		strcpy(p->username, "");
-	if (p->mailbox)
-		strncpy(pvt->mailbox, p->mailbox,sizeof(pvt->mailbox)-1);
 	if (p->expire > -1)
 		ast_sched_del(sched, p->expire);
 	if ((expirey < 1) || (expirey > MAX_EXPIREY))
@@ -2050,7 +2072,9 @@ static int register_verify(struct sip_pvt *p, struct sockaddr_in *sin, struct si
 				if (parse_contact(p, peer, req)) {
 					ast_log(LOG_WARNING, "Failed to parse contact info\n");
 				} else {
+					/* Say OK and ask subsystem to retransmit msg counter */
 					transmit_response(p, "200 OK", req);
+					peer->lastmsgssent = -1;
 					res = 0;
 				}
 			} 
@@ -2230,7 +2254,6 @@ static int check_user(struct sip_pvt *p, struct sip_request *req, char *cmd, cha
 		if (!strcasecmp(user->name, of)) {
 			if (!(res = check_auth(p, req, p->randdata, sizeof(p->randdata), user->name, user->secret, cmd, uri))) {
 				strncpy(p->context, user->context, sizeof(p->context) - 1);
-				strncpy(p->mailbox, user->mailbox, sizeof(p->mailbox) - 1);
 				if (strlen(user->callerid) && strlen(p->callerid)) 
 					strncpy(p->callerid, user->callerid, sizeof(p->callerid) - 1);
 				strncpy(p->accountcode, user->accountcode, sizeof(p->accountcode)  -1);
@@ -2705,8 +2728,8 @@ retrylock:
 				if (r->expire != -1)
 					ast_sched_del(sched, r->expire);
 				expires=atoi(get_header(req, "expires"));
-				if (!expires) expires=20;
-				r->expire=ast_sched_add(sched, (expires-2)*1000, sip_reregister, r); 
+				if (!expires) expires=DEFAULT_EXPIREY;
+					r->expire=ast_sched_add(sched, (expires-2)*1000, sip_reregister, r); 
 
 			}
 			break;
@@ -2855,7 +2878,7 @@ static int handle_request(struct sip_pvt *p, struct sip_request *req, struct soc
 	char *cmd;
 	char *cseq;
 	char *e;
-	struct ast_channel *c;
+	struct ast_channel *c=NULL;
 	int seqno;
 	int len;
 	int ignore=0;
@@ -3006,24 +3029,24 @@ static int handle_request(struct sip_pvt *p, struct sip_request *req, struct soc
 				ast_log(LOG_NOTICE, "Unable to create/find channel\n");
 				transmit_response(p, "503 Unavailable", req);
 				sip_destroy(p);
+			}
 		}
-		}
-		} else if (!strcasecmp(cmd, "REFER")) {
-		        struct ast_channel *transfer_to;
-		        ast_log(LOG_DEBUG, "We found a REFER!\n");
-		        if (!strlen(p->context))
-			        strncpy(p->context, context, sizeof(p->context) - 1);
-			    res = get_refer_info(p, req);
-			    if (res < 0)
-				    transmit_response_with_allow(p, "404 Not Found", req);
-			    else if (res > 0)
-				   transmit_response_with_allow(p, "484 Address Incomplete", req);
-			    else
-				   transmit_response(p, "202 Accepted", req);
-			    ast_log(LOG_DEBUG,"202 Accepted\n");
-			    transfer_to = c->bridge;
-				if (transfer_to)
-				   ast_async_goto(transfer_to,"", p->refer_to,1, 1);
+	} else if (!strcasecmp(cmd, "REFER")) {
+		struct ast_channel *transfer_to;
+		ast_log(LOG_DEBUG, "We found a REFER!\n");
+		if (!strlen(p->context))
+			strncpy(p->context, context, sizeof(p->context) - 1);
+		res = get_refer_info(p, req);
+		if (res < 0)
+			transmit_response_with_allow(p, "404 Not Found", req);
+		else if (res > 0)
+			transmit_response_with_allow(p, "484 Address Incomplete", req);
+		else
+			transmit_response(p, "202 Accepted", req);
+		ast_log(LOG_DEBUG,"202 Accepted\n");
+		transfer_to = c->bridge;
+		if (transfer_to)
+			ast_async_goto(transfer_to,"", p->refer_to,1, 1);
 			
 	} else if (!strcasecmp(cmd, "CANCEL") || !strcasecmp(cmd, "BYE")) {
 		copy_request(&p->initreq, req);
@@ -3055,9 +3078,9 @@ static int handle_request(struct sip_pvt *p, struct sip_request *req, struct soc
 		transmit_response(p, "100 Trying", req);
 		if ((res = register_verify(p, sin, req, e)) < 0) 
 			ast_log(LOG_NOTICE, "Registration from '%s' failed for '%s'\n", get_header(req, "To"), inet_ntoa(sin->sin_addr));
-		sip_send_mwi(p);
-		if (res < 1)
+		if (res < 1) {
 			sip_destroy(p);
+		}
 	} else if (!strcasecmp(cmd, "ACK")) {
 		/* Uhm, I haven't figured out the point of the ACK yet.  Are we
 		   supposed to retransmit responses until we get an ack? 
@@ -3117,11 +3140,55 @@ static int sipsock_read(int *id, int fd, short events, void *ignore)
 	return 1;
 }
 
+static int sip_send_mwi_to_peer(struct sip_peer *peer)
+{
+	/* Called with peerl lock, but releases it */
+	struct sip_pvt *p;
+	int hasmsgs;
+	char name[256] = "";
+	/* Check for messages */
+	hasmsgs = ast_app_has_voicemail(peer->mailbox);
+	
+	time(&peer->lastmsgcheck);
+	
+	/* Return now if it's the same thing we told them last time */
+	if (hasmsgs == peer->lastmsgssent) {
+		ast_pthread_mutex_unlock(&peerl.lock);
+		return 0;
+	}
+	
+	p = sip_alloc(NULL, NULL);
+	if (!p) {
+		ast_log(LOG_WARNING, "Unable to build sip pvt data for MWI\n");
+		ast_pthread_mutex_unlock(&peerl.lock);
+		return -1;
+	}
+	strncpy(name, peer->name, sizeof(name) - 1);
+	peer->lastmsgssent = hasmsgs;
+	ast_pthread_mutex_unlock(&peerl.lock);
+	if (create_addr(p, peer->name)) {
+		/* Maybe they're not registered, etc. */
+		sip_destroy(p);
+		return 0;
+	}
+	/* Recalculate our side, and recalculate Call ID */
+	memcpy(&p->ourip, myaddrfor(&p->sa.sin_addr), sizeof(p->ourip));
+	snprintf(p->via, sizeof(p->via), "SIP/2.0/UDP %s:%d;branch=%08x", inet_ntoa(p->ourip), ourport, p->branch);
+	build_callid(p->callid, sizeof(p->callid), p->ourip);
+	/* Send MWI */
+	transmit_notify(p, hasmsgs);
+	/* Destroy channel */
+	sip_destroy(p);
+	return 0;
+}
+
 static void *do_monitor(void *data)
 {
 	int res;
 	struct sip_pkt *p;
 	struct sip_pvt *sip;
+	struct sip_peer *peer;
+	time_t t;
 	/* Add an I/O event to our UDP socket */
 	if (sipsock > -1) 
 		ast_io_add(io, sipsock, sipsock_read, AST_IO_IN, NULL);
@@ -3165,6 +3232,19 @@ restartsearch:
 		ast_pthread_mutex_lock(&monlock);
 		if (res >= 0) 
 			ast_sched_runq(sched);
+		ast_pthread_mutex_lock(&peerl.lock);
+		peer = peerl.peers;
+		time(&t);
+		while(peer) {
+			if (strlen(peer->mailbox) && (t - peer->lastmsgcheck > 10)) {
+				sip_send_mwi_to_peer(peer);
+				break;
+			}
+			peer = peer->next;
+		}
+		/* Remember, sip_send_mwi_to_peer releases the lock if we've called it */
+		if (!peer)
+			ast_pthread_mutex_unlock(&peerl.lock);
 		ast_pthread_mutex_unlock(&monlock);
 	}
 	/* Never reached */
@@ -3260,60 +3340,6 @@ static int sip_poke_peer(struct sip_peer *peer)
 }
 
 
-static int sip_send_mwi(struct sip_pvt *p)
-{
-	struct sip_request req;
-	int res;
-
-	if(strlen(p->mailbox)) {
-		ast_log(LOG_NOTICE, "mwi: check mailbox: %s\n", p->mailbox);
-		res = ast_app_has_voicemail(p->mailbox);
-		if(res) {
-			ast_log(LOG_NOTICE, "mwi: mailbox has messages\n");
-			reqprep(&req, p, "NOTIFY", 1);
-			add_header(&req, "Event", "message-summary");
-			add_header(&req, "Content-Type", "text/plain");
-			add_line(&req, "Message-Waiting: yes\n");
-			send_request(p, &req);
-
-		} else {
-
-			ast_log(LOG_NOTICE, "mwi: mailbox does not contain messages\n");
-                        reqprep(&req, p, "NOTIFY", 1);
-			add_header(&req, "Event", "message-summary");
-                        add_header(&req, "Content-Type", "text/plain");
-			add_line(&req, "Message-Waiting: no\n");
-			send_request(p, &req);
-		}
-
-	}
-	return 0;
-
-}
-
-static int sip_send_mwi_to_peer(struct sip_peer *peer)
-{
-	struct sip_pvt *p;
-	p = sip_alloc(NULL, NULL);
-	if (!p) {
-		ast_log(LOG_WARNING, "Unable to build sip pvt data for MWI\n");
-		return -1;
-	}
-	if (create_addr(p, peer->name)) {
-		sip_destroy(p);
-		return -1;
-	}
-	/* Recalculate our side, and recalculate Call ID */
-	memcpy(&p->ourip, myaddrfor(&p->sa.sin_addr), sizeof(p->ourip));
-	snprintf(p->via, sizeof(p->via), "SIP/2.0/UDP %s:%d;branch=%08x", inet_ntoa(p->ourip), ourport, p->branch);
-	build_callid(p->callid, sizeof(p->callid), p->ourip);
-	/* Send MWI */
-	sip_send_mwi(p);
-	/* Destroy channel */
-	sip_destroy(p);
-	return 0;
-}
-
 static struct ast_channel *sip_request(char *type, int format, void *data)
 {
 	int oldformat;
@@ -3326,7 +3352,7 @@ static struct ast_channel *sip_request(char *type, int format, void *data)
 	oldformat = format;
 	format &= capability;
 	if (!format) {
-		ast_log(LOG_NOTICE, "Asked to get a channel of unsupported format '%d'\n", format);
+		ast_log(LOG_NOTICE, "Asked to get a channel of unsupported format %d while capability is %d\n", oldformat, capability);
 		return NULL;
 	}
 	p = sip_alloc(NULL, NULL);
@@ -3397,8 +3423,6 @@ static struct sip_user *build_user(char *name, struct ast_variable *v)
 				user->hascallerid=1;
 			} else if (!strcasecmp(v->name, "accountcode")) {
 				strncpy(user->accountcode, v->value, sizeof(user->accountcode)-1);
-			} else if (!strcasecmp(v->name, "mailbox")) {
-                                strncpy(user->mailbox, v->value, sizeof(user->mailbox)-1);
 			} else if (!strcasecmp(v->name, "amaflags")) {
 				format = ast_cdr_amaflags2int(v->value);
 				if (format < 0) {
@@ -3451,6 +3475,7 @@ static struct sip_peer *build_peer(char *name, struct ast_variable *v)
 		memset(peer, 0, sizeof(struct sip_peer));
 		peer->expire = -1;
 		peer->pokeexpire = -1;
+		peer->lastmsgssent = -1;
 	}
 	if (peer) {
 		if (!found) {
@@ -3515,7 +3540,7 @@ static struct sip_peer *build_peer(char *name, struct ast_variable *v)
 			} else if (!strcasecmp(v->name, "username")) {
 				strncpy(peer->username, v->value, sizeof(peer->username)-1);
 			} else if (!strcasecmp(v->name, "mailbox")) {
-                                strncpy(peer->mailbox, v->value, sizeof(peer->mailbox)-1);
+				strncpy(peer->mailbox, v->value, sizeof(peer->mailbox)-1);
 			} else if (!strcasecmp(v->name, "allow")) {
 				format = ast_getformatbyname(v->value);
 				if (format < 1) 
diff --git a/channels/chan_zap.c b/channels/chan_zap.c
index 342038e3db..5244bbe685 100755
--- a/channels/chan_zap.c
+++ b/channels/chan_zap.c
@@ -3320,6 +3320,8 @@ static struct ast_channel *zt_new(struct zt_pvt *i, int state, int startpbx, int
 		/* Assume calls are not idle calls unless we're told differently */
 		i->isidlecall = 0;
 #endif
+		/* Assure there is no confmute on this channel */
+		zt_confmute(i, 0);
 		if (startpbx) {
 			if (ast_pbx_start(tmp)) {
 				ast_log(LOG_WARNING, "Unable to start PBX on %s\n", tmp->name);
@@ -5260,6 +5262,7 @@ static void *pri_dchannel(void *vpri)
 							pri->pvt[x]->owner->_softhangup |= AST_SOFTHANGUP_DEV;
 				}
 				break;
+			case PRI_EVENT_INFO_RECEIVED:
 			case PRI_EVENT_RING:
 				chan = e->ring.channel;
 				if ((chan < 1) || (chan > pri->channels)) {
@@ -5281,20 +5284,22 @@ static void *pri_dchannel(void *vpri)
 				if (!chan && (e->ring.flexible))
 					chan = pri_find_empty_chan(pri);
 				if (chan) {
-					/* Get caller ID */
-					if (pri->pvt[chan]->use_callerid) {
-						if (strlen(e->ring.callingname)) {
-							snprintf(pri->pvt[chan]->callerid, sizeof(pri->pvt[chan]->callerid), "\"%s\" <%s>", e->ring.callingname, e->ring.callingnum);
+					if (e->e==PRI_EVENT_RING) {
+						/* Get caller ID */
+						if (pri->pvt[chan]->use_callerid) {
+							if (strlen(e->ring.callingname)) {
+								snprintf(pri->pvt[chan]->callerid, sizeof(pri->pvt[chan]->callerid), "\"%s\" <%s>", e->ring.callingname, e->ring.callingnum);
+							} else
+								strncpy(pri->pvt[chan]->callerid, e->ring.callingnum, sizeof(pri->pvt[chan]->callerid)-1);
 						} else
-							strncpy(pri->pvt[chan]->callerid, e->ring.callingnum, sizeof(pri->pvt[chan]->callerid)-1);
-					} else
-						strcpy(pri->pvt[chan]->callerid, "");
+							strcpy(pri->pvt[chan]->callerid, "");
+						strncpy(pri->pvt[chan]->rdnis, e->ring.redirectingnum, sizeof(pri->pvt[chan]->rdnis));
+					}
 					/* Get called number */
 					if (strlen(e->ring.callednum)) {
 						strncpy(pri->pvt[chan]->exten, e->ring.callednum, sizeof(pri->pvt[chan]->exten)-1);
 					} else
 						strcpy(pri->pvt[chan]->exten, "s");
-					strncpy(pri->pvt[chan]->rdnis, e->ring.redirectingnum, sizeof(pri->pvt[chan]->rdnis));
 					/* Make sure extension exists */
 					if (ast_exists_extension(NULL, pri->pvt[chan]->context, pri->pvt[chan]->exten, 1, pri->pvt[chan]->callerid)) {
 						/* Setup law */
@@ -5324,10 +5329,15 @@ static void *pri_dchannel(void *vpri)
 							pri->pvt[chan]->call = 0;
 						}
 					} else {
-						if (option_verbose > 2) 
-							ast_verbose(VERBOSE_PREFIX_3 "Extension '%s' in context '%s' from '%s' does not exist.  Rejecting call on channel %d, span %d\n", 
-								pri->pvt[chan]->exten, pri->pvt[chan]->context, pri->pvt[chan]->callerid, chan, pri->span);
-						pri_release(pri->pri, e->ring.call, PRI_CAUSE_UNALLOCATED);
+						if (ast_matchmore_extension(NULL, pri->pvt[chan]->context, pri->pvt[chan]->exten, 1, pri->pvt[chan]->callerid))
+						{
+							if (e->e==PRI_EVENT_RING) pri_need_more_info(pri->pri, e->ring.call, chan, 1);
+						} else {
+							if (option_verbose > 2)
+								ast_verbose(VERBOSE_PREFIX_3 "Extension '%s' in context '%s' from '%s' does not exist.  Rejecting call on channel %d, span %d\n",
+							pri->pvt[chan]->exten, pri->pvt[chan]->context, pri->pvt[chan]->callerid, chan, pri->span);
+							pri_release(pri->pri, e->ring.call, PRI_CAUSE_UNALLOCATED);
+						}
 					}
 				} else 
 					pri_release(pri->pri, e->ring.call, PRI_CAUSE_REQUESTED_CHAN_UNAVAIL);
diff --git a/channels/ixjuser.h b/channels/ixjuser.h
index 2de8abd1ab..ac98a6c0c0 100755
--- a/channels/ixjuser.h
+++ b/channels/ixjuser.h
@@ -1,8 +1,11 @@
 /******************************************************************************
 $Id$
 $Log$
-Revision 1.15  1999/12/01 05:25:58  markster
-Version 0.3.0 from FTP
+Revision 1.16  2003/02/12 13:59:14  matteo
+mer feb 12 14:56:57 CET 2003
+
+Revision 1.1.1.1  2003/02/12 13:59:14  matteo
+mer feb 12 14:56:57 CET 2003
 
 Revision 1.1  1999/12/01 05:25:58  markster
 Start on the Internet Phone Jack channel
diff --git a/cli.c b/cli.c
index 14cf3956ca..d7ebcc7585 100755
--- a/cli.c
+++ b/cli.c
@@ -198,6 +198,7 @@ static int handle_chanlist(int fd, int argc, char *argv[])
 #define FORMAT_STRING  "%15s  (%-10s %-12s %-4d) %7s %-12s  %-15s\n"
 #define FORMAT_STRING2 "%15s  (%-10s %-12s %-4s) %7s %-12s  %-15s\n"
 	struct ast_channel *c=NULL;
+	int numchans = 0;
 	if (argc != 2)
 		return RESULT_SHOWUSAGE;
 	c = ast_channel_walk(NULL);
@@ -205,8 +206,10 @@ static int handle_chanlist(int fd, int argc, char *argv[])
 	while(c) {
 		ast_cli(fd, FORMAT_STRING, c->name, c->context, c->exten, c->priority, ast_state2str(c->_state),
 		c->appl ? c->appl : "(None)", c->data ? ( strlen(c->data) ? c->data : "(Empty)" ): "(None)");
+		numchans++;
 		c = ast_channel_walk(c);
 	}
+	ast_cli(fd, "%d active channel(s)\n", numchans);
 	return RESULT_SUCCESS;
 }
 
diff --git a/codecs/.cvsignore b/codecs/.cvsignore
new file mode 100755
index 0000000000..428ba001b5
--- /dev/null
+++ b/codecs/.cvsignore
@@ -0,0 +1,2 @@
+g723.1
+g723.1b
diff --git a/codecs/lpc10/analys.c b/codecs/lpc10/analys.c
index c90f2c1ecd..c9d078a855 100755
--- a/codecs/lpc10/analys.c
+++ b/codecs/lpc10/analys.c
@@ -1,8 +1,11 @@
 /*
 
 $Log$
-Revision 1.13  2000/01/05 08:20:39  markster
-Version 0.3.0 from FTP
+Revision 1.14  2003/02/12 13:59:14  matteo
+mer feb 12 14:56:57 CET 2003
+
+Revision 1.1.1.1  2003/02/12 13:59:14  matteo
+mer feb 12 14:56:57 CET 2003
 
 Revision 1.2  2000/01/05 08:20:39  markster
 Some OSS fixes and a few lpc changes to make it actually work
@@ -79,9 +82,12 @@ static integer c__1 = 1;
 /* 	ANALYS Version 55 */
 
 /* $Log$
- * Revision 1.13  2000/01/05 08:20:39  markster
- * Version 0.3.0 from FTP
+ * Revision 1.14  2003/02/12 13:59:14  matteo
+ * mer feb 12 14:56:57 CET 2003
  *
+/* Revision 1.1.1.1  2003/02/12 13:59:14  matteo
+/* mer feb 12 14:56:57 CET 2003
+/*
 /* Revision 1.2  2000/01/05 08:20:39  markster
 /* Some OSS fixes and a few lpc changes to make it actually work
 /*
@@ -246,9 +252,12 @@ static integer c__1 = 1;
     real phi[100]	/* was [10][10] */, psi[10];
 
 /* $Log$
- * Revision 1.13  2000/01/05 08:20:39  markster
- * Version 0.3.0 from FTP
+ * Revision 1.14  2003/02/12 13:59:14  matteo
+ * mer feb 12 14:56:57 CET 2003
  *
+/* Revision 1.1.1.1  2003/02/12 13:59:14  matteo
+/* mer feb 12 14:56:57 CET 2003
+/*
 /* Revision 1.2  2000/01/05 08:20:39  markster
 /* Some OSS fixes and a few lpc changes to make it actually work
 /*
@@ -277,9 +286,12 @@ static integer c__1 = 1;
 /* Frame size, Prediction order, Pitch period */
 /*       Arguments to ANALYS */
 /* $Log$
- * Revision 1.13  2000/01/05 08:20:39  markster
- * Version 0.3.0 from FTP
+ * Revision 1.14  2003/02/12 13:59:14  matteo
+ * mer feb 12 14:56:57 CET 2003
  *
+/* Revision 1.1.1.1  2003/02/12 13:59:14  matteo
+/* mer feb 12 14:56:57 CET 2003
+/*
 /* Revision 1.2  2000/01/05 08:20:39  markster
 /* Some OSS fixes and a few lpc changes to make it actually work
 /*
diff --git a/codecs/lpc10/bsynz.c b/codecs/lpc10/bsynz.c
index c0dedea1ea..6c15ebb624 100755
--- a/codecs/lpc10/bsynz.c
+++ b/codecs/lpc10/bsynz.c
@@ -1,8 +1,11 @@
 /*
 
 $Log$
-Revision 1.13  2000/01/05 08:20:39  markster
-Version 0.3.0 from FTP
+Revision 1.14  2003/02/12 13:59:14  matteo
+mer feb 12 14:56:57 CET 2003
+
+Revision 1.1.1.1  2003/02/12 13:59:14  matteo
+mer feb 12 14:56:57 CET 2003
 
 Revision 1.2  2000/01/05 08:20:39  markster
 Some OSS fixes and a few lpc changes to make it actually work
@@ -48,9 +51,12 @@ extern struct {
 /* 	BSYNZ Version 54 */
 
 /* $Log$
- * Revision 1.13  2000/01/05 08:20:39  markster
- * Version 0.3.0 from FTP
+ * Revision 1.14  2003/02/12 13:59:14  matteo
+ * mer feb 12 14:56:57 CET 2003
  *
+/* Revision 1.1.1.1  2003/02/12 13:59:14  matteo
+/* mer feb 12 14:56:57 CET 2003
+/*
 /* Revision 1.2  2000/01/05 08:20:39  markster
 /* Some OSS fixes and a few lpc changes to make it actually work
 /*
@@ -144,9 +150,12 @@ extern struct {
     real lpi0, hpi0;
 
 /* $Log$
- * Revision 1.13  2000/01/05 08:20:39  markster
- * Version 0.3.0 from FTP
+ * Revision 1.14  2003/02/12 13:59:14  matteo
+ * mer feb 12 14:56:57 CET 2003
  *
+/* Revision 1.1.1.1  2003/02/12 13:59:14  matteo
+/* mer feb 12 14:56:57 CET 2003
+/*
 /* Revision 1.2  2000/01/05 08:20:39  markster
 /* Some OSS fixes and a few lpc changes to make it actually work
 /*
@@ -175,9 +184,12 @@ extern struct {
 /* Frame size, Prediction order, Pitch period */
 /*       Arguments */
 /* $Log$
- * Revision 1.13  2000/01/05 08:20:39  markster
- * Version 0.3.0 from FTP
+ * Revision 1.14  2003/02/12 13:59:14  matteo
+ * mer feb 12 14:56:57 CET 2003
  *
+/* Revision 1.1.1.1  2003/02/12 13:59:14  matteo
+/* mer feb 12 14:56:57 CET 2003
+/*
 /* Revision 1.2  2000/01/05 08:20:39  markster
 /* Some OSS fixes and a few lpc changes to make it actually work
 /*
diff --git a/codecs/lpc10/chanwr.c b/codecs/lpc10/chanwr.c
index ebd5631d54..5b600822fd 100755
--- a/codecs/lpc10/chanwr.c
+++ b/codecs/lpc10/chanwr.c
@@ -1,8 +1,11 @@
 /*
 
 $Log$
-Revision 1.13  2000/01/05 08:20:39  markster
-Version 0.3.0 from FTP
+Revision 1.14  2003/02/12 13:59:14  matteo
+mer feb 12 14:56:57 CET 2003
+
+Revision 1.1.1.1  2003/02/12 13:59:14  matteo
+mer feb 12 14:56:57 CET 2003
 
 Revision 1.2  2000/01/05 08:20:39  markster
 Some OSS fixes and a few lpc changes to make it actually work
@@ -35,9 +38,12 @@ extern int chanrd_(integer *order, integer *ipitv, integer *irms, integer *irc,
 /* 	CHANL Version 49 */
 
 /* $Log$
- * Revision 1.13  2000/01/05 08:20:39  markster
- * Version 0.3.0 from FTP
+ * Revision 1.14  2003/02/12 13:59:14  matteo
+ * mer feb 12 14:56:57 CET 2003
  *
+/* Revision 1.1.1.1  2003/02/12 13:59:14  matteo
+/* mer feb 12 14:56:57 CET 2003
+/*
 /* Revision 1.2  2000/01/05 08:20:39  markster
 /* Some OSS fixes and a few lpc changes to make it actually work
 /*
diff --git a/codecs/lpc10/dcbias.c b/codecs/lpc10/dcbias.c
index 5aa29e4b08..b34480a4e5 100755
--- a/codecs/lpc10/dcbias.c
+++ b/codecs/lpc10/dcbias.c
@@ -1,8 +1,11 @@
 /*
 
 $Log$
-Revision 1.13  2000/01/05 08:20:39  markster
-Version 0.3.0 from FTP
+Revision 1.14  2003/02/12 13:59:14  matteo
+mer feb 12 14:56:57 CET 2003
+
+Revision 1.1.1.1  2003/02/12 13:59:14  matteo
+mer feb 12 14:56:57 CET 2003
 
 Revision 1.2  2000/01/05 08:20:39  markster
 Some OSS fixes and a few lpc changes to make it actually work
@@ -29,9 +32,12 @@ extern int dcbias_(integer *len, real *speech, real *sigout);
 /* 	DCBIAS Version 50 */
 
 /* $Log$
- * Revision 1.13  2000/01/05 08:20:39  markster
- * Version 0.3.0 from FTP
+ * Revision 1.14  2003/02/12 13:59:14  matteo
+ * mer feb 12 14:56:57 CET 2003
  *
+/* Revision 1.1.1.1  2003/02/12 13:59:14  matteo
+/* mer feb 12 14:56:57 CET 2003
+/*
 /* Revision 1.2  2000/01/05 08:20:39  markster
 /* Some OSS fixes and a few lpc changes to make it actually work
 /*
diff --git a/codecs/lpc10/decode.c b/codecs/lpc10/decode.c
index 51319daff2..3e7b5747a2 100755
--- a/codecs/lpc10/decode.c
+++ b/codecs/lpc10/decode.c
@@ -1,8 +1,11 @@
 /*
 
 $Log$
-Revision 1.13  2000/01/05 08:20:39  markster
-Version 0.3.0 from FTP
+Revision 1.14  2003/02/12 13:59:14  matteo
+mer feb 12 14:56:57 CET 2003
+
+Revision 1.1.1.1  2003/02/12 13:59:14  matteo
+mer feb 12 14:56:57 CET 2003
 
 Revision 1.2  2000/01/05 08:20:39  markster
 Some OSS fixes and a few lpc changes to make it actually work
@@ -53,9 +56,12 @@ static integer c__2 = 2;
 /* 	DECODE Version 54 */
 
 /* $Log$
- * Revision 1.13  2000/01/05 08:20:39  markster
- * Version 0.3.0 from FTP
+ * Revision 1.14  2003/02/12 13:59:14  matteo
+ * mer feb 12 14:56:57 CET 2003
  *
+/* Revision 1.1.1.1  2003/02/12 13:59:14  matteo
+/* mer feb 12 14:56:57 CET 2003
+/*
 /* Revision 1.2  2000/01/05 08:20:39  markster
 /* Some OSS fixes and a few lpc changes to make it actually work
 /*
@@ -188,9 +194,12 @@ static integer c__2 = 2;
     integer ishift, errcnt, lsb;
 
 /* $Log$
- * Revision 1.13  2000/01/05 08:20:39  markster
- * Version 0.3.0 from FTP
+ * Revision 1.14  2003/02/12 13:59:14  matteo
+ * mer feb 12 14:56:57 CET 2003
  *
+/* Revision 1.1.1.1  2003/02/12 13:59:14  matteo
+/* mer feb 12 14:56:57 CET 2003
+/*
 /* Revision 1.2  2000/01/05 08:20:39  markster
 /* Some OSS fixes and a few lpc changes to make it actually work
 /*
@@ -219,9 +228,12 @@ static integer c__2 = 2;
 /* Frame size, Prediction order, Pitch period */
 /*       Arguments */
 /* $Log$
- * Revision 1.13  2000/01/05 08:20:39  markster
- * Version 0.3.0 from FTP
+ * Revision 1.14  2003/02/12 13:59:14  matteo
+ * mer feb 12 14:56:57 CET 2003
  *
+/* Revision 1.1.1.1  2003/02/12 13:59:14  matteo
+/* mer feb 12 14:56:57 CET 2003
+/*
 /* Revision 1.2  2000/01/05 08:20:39  markster
 /* Some OSS fixes and a few lpc changes to make it actually work
 /*
diff --git a/codecs/lpc10/deemp.c b/codecs/lpc10/deemp.c
index 52e20886ac..a79d84adc9 100755
--- a/codecs/lpc10/deemp.c
+++ b/codecs/lpc10/deemp.c
@@ -1,8 +1,11 @@
 /*
 
 $Log$
-Revision 1.13  2000/01/05 08:20:39  markster
-Version 0.3.0 from FTP
+Revision 1.14  2003/02/12 13:59:14  matteo
+mer feb 12 14:56:57 CET 2003
+
+Revision 1.1.1.1  2003/02/12 13:59:14  matteo
+mer feb 12 14:56:57 CET 2003
 
 Revision 1.2  2000/01/05 08:20:39  markster
 Some OSS fixes and a few lpc changes to make it actually work
@@ -37,9 +40,12 @@ extern int deemp_(real *x, integer *n, struct lpc10_decoder_state *st);
 /* 	DEEMP Version 48 */
 
 /* $Log$
- * Revision 1.13  2000/01/05 08:20:39  markster
- * Version 0.3.0 from FTP
+ * Revision 1.14  2003/02/12 13:59:14  matteo
+ * mer feb 12 14:56:57 CET 2003
  *
+/* Revision 1.1.1.1  2003/02/12 13:59:14  matteo
+/* mer feb 12 14:56:57 CET 2003
+/*
 /* Revision 1.2  2000/01/05 08:20:39  markster
 /* Some OSS fixes and a few lpc changes to make it actually work
 /*
diff --git a/codecs/lpc10/difmag.c b/codecs/lpc10/difmag.c
index 918b68c254..734ad9665a 100755
--- a/codecs/lpc10/difmag.c
+++ b/codecs/lpc10/difmag.c
@@ -1,8 +1,11 @@
 /*
 
 $Log$
-Revision 1.13  2000/01/05 08:20:39  markster
-Version 0.3.0 from FTP
+Revision 1.14  2003/02/12 13:59:14  matteo
+mer feb 12 14:56:57 CET 2003
+
+Revision 1.1.1.1  2003/02/12 13:59:14  matteo
+mer feb 12 14:56:57 CET 2003
 
 Revision 1.2  2000/01/05 08:20:39  markster
 Some OSS fixes and a few lpc changes to make it actually work
@@ -29,9 +32,12 @@ extern int difmag_(real *speech, integer *lpita, integer *tau, integer *ltau, in
 /* 	DIFMAG Version 49 */
 
 /* $Log$
- * Revision 1.13  2000/01/05 08:20:39  markster
- * Version 0.3.0 from FTP
+ * Revision 1.14  2003/02/12 13:59:14  matteo
+ * mer feb 12 14:56:57 CET 2003
  *
+/* Revision 1.1.1.1  2003/02/12 13:59:14  matteo
+/* mer feb 12 14:56:57 CET 2003
+/*
 /* Revision 1.2  2000/01/05 08:20:39  markster
 /* Some OSS fixes and a few lpc changes to make it actually work
 /*
diff --git a/codecs/lpc10/dyptrk.c b/codecs/lpc10/dyptrk.c
index 227c97887c..7a5c136b99 100755
--- a/codecs/lpc10/dyptrk.c
+++ b/codecs/lpc10/dyptrk.c
@@ -1,8 +1,11 @@
 /*
 
 $Log$
-Revision 1.13  2000/01/05 08:20:39  markster
-Version 0.3.0 from FTP
+Revision 1.14  2003/02/12 13:59:15  matteo
+mer feb 12 14:56:57 CET 2003
+
+Revision 1.1.1.1  2003/02/12 13:59:15  matteo
+mer feb 12 14:56:57 CET 2003
 
 Revision 1.2  2000/01/05 08:20:39  markster
 Some OSS fixes and a few lpc changes to make it actually work
@@ -47,9 +50,12 @@ extern struct {
 /* 	DYPTRK Version 52 */
 
 /* $Log$
- * Revision 1.13  2000/01/05 08:20:39  markster
- * Version 0.3.0 from FTP
+ * Revision 1.14  2003/02/12 13:59:15  matteo
+ * mer feb 12 14:56:57 CET 2003
  *
+/* Revision 1.1.1.1  2003/02/12 13:59:15  matteo
+/* mer feb 12 14:56:57 CET 2003
+/*
 /* Revision 1.2  2000/01/05 08:20:39  markster
 /* Some OSS fixes and a few lpc changes to make it actually work
 /*
@@ -136,9 +142,12 @@ extern struct {
 
 /*       Arguments */
 /* $Log$
- * Revision 1.13  2000/01/05 08:20:39  markster
- * Version 0.3.0 from FTP
+ * Revision 1.14  2003/02/12 13:59:15  matteo
+ * mer feb 12 14:56:57 CET 2003
  *
+/* Revision 1.1.1.1  2003/02/12 13:59:15  matteo
+/* mer feb 12 14:56:57 CET 2003
+/*
 /* Revision 1.2  2000/01/05 08:20:39  markster
 /* Some OSS fixes and a few lpc changes to make it actually work
 /*
diff --git a/codecs/lpc10/encode.c b/codecs/lpc10/encode.c
index e1733171fd..81093ac607 100755
--- a/codecs/lpc10/encode.c
+++ b/codecs/lpc10/encode.c
@@ -1,8 +1,11 @@
 /*
 
 $Log$
-Revision 1.13  2000/01/05 08:20:39  markster
-Version 0.3.0 from FTP
+Revision 1.14  2003/02/12 13:59:15  matteo
+mer feb 12 14:56:57 CET 2003
+
+Revision 1.1.1.1  2003/02/12 13:59:15  matteo
+mer feb 12 14:56:57 CET 2003
 
 Revision 1.2  2000/01/05 08:20:39  markster
 Some OSS fixes and a few lpc changes to make it actually work
@@ -43,9 +46,12 @@ static integer c__2 = 2;
 /* 	ENCODE Version 54 */
 
 /* $Log$
- * Revision 1.13  2000/01/05 08:20:39  markster
- * Version 0.3.0 from FTP
+ * Revision 1.14  2003/02/12 13:59:15  matteo
+ * mer feb 12 14:56:57 CET 2003
  *
+/* Revision 1.1.1.1  2003/02/12 13:59:15  matteo
+/* mer feb 12 14:56:57 CET 2003
+/*
 /* Revision 1.2  2000/01/05 08:20:39  markster
 /* Some OSS fixes and a few lpc changes to make it actually work
 /*
@@ -128,9 +134,12 @@ static integer c__2 = 2;
     integer idel, nbit, i__, j, i2, i3, mrk;
 
 /* $Log$
- * Revision 1.13  2000/01/05 08:20:39  markster
- * Version 0.3.0 from FTP
+ * Revision 1.14  2003/02/12 13:59:15  matteo
+ * mer feb 12 14:56:57 CET 2003
  *
+/* Revision 1.1.1.1  2003/02/12 13:59:15  matteo
+/* mer feb 12 14:56:57 CET 2003
+/*
 /* Revision 1.2  2000/01/05 08:20:39  markster
 /* Some OSS fixes and a few lpc changes to make it actually work
 /*
@@ -151,9 +160,12 @@ static integer c__2 = 2;
 /* Frame size, Prediction order, Pitch period */
 /*       Arguments */
 /* $Log$
- * Revision 1.13  2000/01/05 08:20:39  markster
- * Version 0.3.0 from FTP
+ * Revision 1.14  2003/02/12 13:59:15  matteo
+ * mer feb 12 14:56:57 CET 2003
  *
+/* Revision 1.1.1.1  2003/02/12 13:59:15  matteo
+/* mer feb 12 14:56:57 CET 2003
+/*
 /* Revision 1.2  2000/01/05 08:20:39  markster
 /* Some OSS fixes and a few lpc changes to make it actually work
 /*
diff --git a/codecs/lpc10/energy.c b/codecs/lpc10/energy.c
index d5b9700d8c..f159dd52ac 100755
--- a/codecs/lpc10/energy.c
+++ b/codecs/lpc10/energy.c
@@ -1,8 +1,11 @@
 /*
 
 $Log$
-Revision 1.13  2000/01/05 08:20:39  markster
-Version 0.3.0 from FTP
+Revision 1.14  2003/02/12 13:59:15  matteo
+mer feb 12 14:56:57 CET 2003
+
+Revision 1.1.1.1  2003/02/12 13:59:15  matteo
+mer feb 12 14:56:57 CET 2003
 
 Revision 1.2  2000/01/05 08:20:39  markster
 Some OSS fixes and a few lpc changes to make it actually work
@@ -29,9 +32,12 @@ extern int energy_(integer *len, real *speech, real *rms);
 /* 	ENERGY Version 50 */
 
 /* $Log$
- * Revision 1.13  2000/01/05 08:20:39  markster
- * Version 0.3.0 from FTP
+ * Revision 1.14  2003/02/12 13:59:15  matteo
+ * mer feb 12 14:56:57 CET 2003
  *
+/* Revision 1.1.1.1  2003/02/12 13:59:15  matteo
+/* mer feb 12 14:56:57 CET 2003
+/*
 /* Revision 1.2  2000/01/05 08:20:39  markster
 /* Some OSS fixes and a few lpc changes to make it actually work
 /*
diff --git a/codecs/lpc10/f2c.h b/codecs/lpc10/f2c.h
index 594d3706de..7f4bcf2578 100755
--- a/codecs/lpc10/f2c.h
+++ b/codecs/lpc10/f2c.h
@@ -1,8 +1,11 @@
 /*
 
 $Log$
-Revision 1.13  2000/01/05 08:20:39  markster
-Version 0.3.0 from FTP
+Revision 1.14  2003/02/12 13:59:15  matteo
+mer feb 12 14:56:57 CET 2003
+
+Revision 1.1.1.1  2003/02/12 13:59:15  matteo
+mer feb 12 14:56:57 CET 2003
 
 Revision 1.2  2000/01/05 08:20:39  markster
 Some OSS fixes and a few lpc changes to make it actually work
diff --git a/codecs/lpc10/f2clib.c b/codecs/lpc10/f2clib.c
index 0e7e8dc87f..e72c307c6a 100755
--- a/codecs/lpc10/f2clib.c
+++ b/codecs/lpc10/f2clib.c
@@ -1,8 +1,11 @@
 /*
 
 $Log$
-Revision 1.13  2000/01/05 08:20:39  markster
-Version 0.3.0 from FTP
+Revision 1.14  2003/02/12 13:59:15  matteo
+mer feb 12 14:56:57 CET 2003
+
+Revision 1.1.1.1  2003/02/12 13:59:15  matteo
+mer feb 12 14:56:57 CET 2003
 
 Revision 1.2  2000/01/05 08:20:39  markster
 Some OSS fixes and a few lpc changes to make it actually work
diff --git a/codecs/lpc10/ham84.c b/codecs/lpc10/ham84.c
index a9665d690d..c4848b1eee 100755
--- a/codecs/lpc10/ham84.c
+++ b/codecs/lpc10/ham84.c
@@ -1,8 +1,11 @@
 /*
 
 $Log$
-Revision 1.13  2000/01/05 08:20:39  markster
-Version 0.3.0 from FTP
+Revision 1.14  2003/02/12 13:59:15  matteo
+mer feb 12 14:56:57 CET 2003
+
+Revision 1.1.1.1  2003/02/12 13:59:15  matteo
+mer feb 12 14:56:57 CET 2003
 
 Revision 1.2  2000/01/05 08:20:39  markster
 Some OSS fixes and a few lpc changes to make it actually work
@@ -29,9 +32,12 @@ extern int ham84_(integer *input, integer *output, integer *errcnt);
 /* 	HAM84 Version 45G */
 
 /* $Log$
- * Revision 1.13  2000/01/05 08:20:39  markster
- * Version 0.3.0 from FTP
+ * Revision 1.14  2003/02/12 13:59:15  matteo
+ * mer feb 12 14:56:57 CET 2003
  *
+/* Revision 1.1.1.1  2003/02/12 13:59:15  matteo
+/* mer feb 12 14:56:57 CET 2003
+/*
 /* Revision 1.2  2000/01/05 08:20:39  markster
 /* Some OSS fixes and a few lpc changes to make it actually work
 /*
diff --git a/codecs/lpc10/hp100.c b/codecs/lpc10/hp100.c
index b223d43dff..7dae73b7ff 100755
--- a/codecs/lpc10/hp100.c
+++ b/codecs/lpc10/hp100.c
@@ -1,8 +1,11 @@
 /*
 
 $Log$
-Revision 1.13  2000/01/05 08:20:39  markster
-Version 0.3.0 from FTP
+Revision 1.14  2003/02/12 13:59:15  matteo
+mer feb 12 14:56:57 CET 2003
+
+Revision 1.1.1.1  2003/02/12 13:59:15  matteo
+mer feb 12 14:56:57 CET 2003
 
 Revision 1.2  2000/01/05 08:20:39  markster
 Some OSS fixes and a few lpc changes to make it actually work
@@ -39,9 +42,12 @@ extern int inithp100_(void);
 /*      HP100 Version 55 */
 
 /* $Log$
- * Revision 1.13  2000/01/05 08:20:39  markster
- * Version 0.3.0 from FTP
+ * Revision 1.14  2003/02/12 13:59:15  matteo
+ * mer feb 12 14:56:57 CET 2003
  *
+/* Revision 1.1.1.1  2003/02/12 13:59:15  matteo
+/* mer feb 12 14:56:57 CET 2003
+/*
 /* Revision 1.2  2000/01/05 08:20:39  markster
 /* Some OSS fixes and a few lpc changes to make it actually work
 /*
diff --git a/codecs/lpc10/invert.c b/codecs/lpc10/invert.c
index 203c7acdea..56045915e9 100755
--- a/codecs/lpc10/invert.c
+++ b/codecs/lpc10/invert.c
@@ -1,8 +1,11 @@
 /*
 
 $Log$
-Revision 1.13  2000/01/05 08:20:39  markster
-Version 0.3.0 from FTP
+Revision 1.14  2003/02/12 13:59:15  matteo
+mer feb 12 14:56:57 CET 2003
+
+Revision 1.1.1.1  2003/02/12 13:59:15  matteo
+mer feb 12 14:56:57 CET 2003
 
 Revision 1.2  2000/01/05 08:20:39  markster
 Some OSS fixes and a few lpc changes to make it actually work
@@ -29,9 +32,12 @@ extern int invert_(integer *order, real *phi, real *psi, real *rc);
 /* 	INVERT Version 45G */
 
 /* $Log$
- * Revision 1.13  2000/01/05 08:20:39  markster
- * Version 0.3.0 from FTP
+ * Revision 1.14  2003/02/12 13:59:15  matteo
+ * mer feb 12 14:56:57 CET 2003
  *
+/* Revision 1.1.1.1  2003/02/12 13:59:15  matteo
+/* mer feb 12 14:56:57 CET 2003
+/*
 /* Revision 1.2  2000/01/05 08:20:39  markster
 /* Some OSS fixes and a few lpc changes to make it actually work
 /*
@@ -91,9 +97,12 @@ extern int invert_(integer *order, real *phi, real *psi, real *rc);
 
 /*       Arguments */
 /* $Log$
- * Revision 1.13  2000/01/05 08:20:39  markster
- * Version 0.3.0 from FTP
+ * Revision 1.14  2003/02/12 13:59:15  matteo
+ * mer feb 12 14:56:57 CET 2003
  *
+/* Revision 1.1.1.1  2003/02/12 13:59:15  matteo
+/* mer feb 12 14:56:57 CET 2003
+/*
 /* Revision 1.2  2000/01/05 08:20:39  markster
 /* Some OSS fixes and a few lpc changes to make it actually work
 /*
diff --git a/codecs/lpc10/irc2pc.c b/codecs/lpc10/irc2pc.c
index 6f0b2d1b5d..a178442e60 100755
--- a/codecs/lpc10/irc2pc.c
+++ b/codecs/lpc10/irc2pc.c
@@ -1,8 +1,11 @@
 /*
 
 $Log$
-Revision 1.13  2000/01/05 08:20:39  markster
-Version 0.3.0 from FTP
+Revision 1.14  2003/02/12 13:59:15  matteo
+mer feb 12 14:56:57 CET 2003
+
+Revision 1.1.1.1  2003/02/12 13:59:15  matteo
+mer feb 12 14:56:57 CET 2003
 
 Revision 1.2  2000/01/05 08:20:39  markster
 Some OSS fixes and a few lpc changes to make it actually work
@@ -29,9 +32,12 @@ extern int irc2pc_(real *rc, real *pc, integer *order, real *gprime, real *g2pas
 /* 	IRC2PC Version 48 */
 
 /* $Log$
- * Revision 1.13  2000/01/05 08:20:39  markster
- * Version 0.3.0 from FTP
+ * Revision 1.14  2003/02/12 13:59:15  matteo
+ * mer feb 12 14:56:57 CET 2003
  *
+/* Revision 1.1.1.1  2003/02/12 13:59:15  matteo
+/* mer feb 12 14:56:57 CET 2003
+/*
 /* Revision 1.2  2000/01/05 08:20:39  markster
 /* Some OSS fixes and a few lpc changes to make it actually work
 /*
@@ -82,9 +88,12 @@ extern int irc2pc_(real *rc, real *pc, integer *order, real *gprime, real *g2pas
 
 /* 	Arguments */
 /* $Log$
- * Revision 1.13  2000/01/05 08:20:39  markster
- * Version 0.3.0 from FTP
+ * Revision 1.14  2003/02/12 13:59:15  matteo
+ * mer feb 12 14:56:57 CET 2003
  *
+/* Revision 1.1.1.1  2003/02/12 13:59:15  matteo
+/* mer feb 12 14:56:57 CET 2003
+/*
 /* Revision 1.2  2000/01/05 08:20:39  markster
 /* Some OSS fixes and a few lpc changes to make it actually work
 /*
diff --git a/codecs/lpc10/ivfilt.c b/codecs/lpc10/ivfilt.c
index 2f559012a7..98184e4f03 100755
--- a/codecs/lpc10/ivfilt.c
+++ b/codecs/lpc10/ivfilt.c
@@ -1,8 +1,11 @@
 /*
 
 $Log$
-Revision 1.13  2000/01/05 08:20:39  markster
-Version 0.3.0 from FTP
+Revision 1.14  2003/02/12 13:59:15  matteo
+mer feb 12 14:56:57 CET 2003
+
+Revision 1.1.1.1  2003/02/12 13:59:15  matteo
+mer feb 12 14:56:57 CET 2003
 
 Revision 1.2  2000/01/05 08:20:39  markster
 Some OSS fixes and a few lpc changes to make it actually work
@@ -29,9 +32,12 @@ extern int ivfilt_(real *lpbuf, real *ivbuf, integer *len, integer *nsamp, real
 /* 	IVFILT Version 48 */
 
 /* $Log$
- * Revision 1.13  2000/01/05 08:20:39  markster
- * Version 0.3.0 from FTP
+ * Revision 1.14  2003/02/12 13:59:15  matteo
+ * mer feb 12 14:56:57 CET 2003
  *
+/* Revision 1.1.1.1  2003/02/12 13:59:15  matteo
+/* mer feb 12 14:56:57 CET 2003
+/*
 /* Revision 1.2  2000/01/05 08:20:39  markster
 /* Some OSS fixes and a few lpc changes to make it actually work
 /*
diff --git a/codecs/lpc10/lpc10.h b/codecs/lpc10/lpc10.h
index 5804fc57b9..ef7d4eeacc 100755
--- a/codecs/lpc10/lpc10.h
+++ b/codecs/lpc10/lpc10.h
@@ -1,8 +1,11 @@
 /*
 
 $Log$
-Revision 1.13  2000/01/05 00:20:06  markster
-Version 0.3.0 from FTP
+Revision 1.14  2003/02/12 13:59:15  matteo
+mer feb 12 14:56:57 CET 2003
+
+Revision 1.1.1.1  2003/02/12 13:59:15  matteo
+mer feb 12 14:56:57 CET 2003
 
 Revision 1.1  2000/01/05 00:20:06  markster
 Add broken lpc10 code...  It's not too far from working I don't think...
diff --git a/codecs/lpc10/lpcdec.c b/codecs/lpc10/lpcdec.c
index ea68c61d64..9929d1fbfe 100755
--- a/codecs/lpc10/lpcdec.c
+++ b/codecs/lpc10/lpcdec.c
@@ -1,8 +1,11 @@
 /*
 
 $Log$
-Revision 1.13  2000/01/05 08:20:39  markster
-Version 0.3.0 from FTP
+Revision 1.14  2003/02/12 13:59:15  matteo
+mer feb 12 14:56:57 CET 2003
+
+Revision 1.1.1.1  2003/02/12 13:59:15  matteo
+mer feb 12 14:56:57 CET 2003
 
 Revision 1.2  2000/01/05 08:20:39  markster
 Some OSS fixes and a few lpc changes to make it actually work
@@ -58,9 +61,12 @@ static integer c__10 = 10;
 /* ***************************************************************** */
 
 /* $Log$
- * Revision 1.13  2000/01/05 08:20:39  markster
- * Version 0.3.0 from FTP
+ * Revision 1.14  2003/02/12 13:59:15  matteo
+ * mer feb 12 14:56:57 CET 2003
  *
+/* Revision 1.1.1.1  2003/02/12 13:59:15  matteo
+/* mer feb 12 14:56:57 CET 2003
+/*
 /* Revision 1.2  2000/01/05 08:20:39  markster
 /* Some OSS fixes and a few lpc changes to make it actually work
 /*
@@ -113,9 +119,12 @@ static integer c__10 = 10;
     real rms;
 
 /* $Log$
- * Revision 1.13  2000/01/05 08:20:39  markster
- * Version 0.3.0 from FTP
+ * Revision 1.14  2003/02/12 13:59:15  matteo
+ * mer feb 12 14:56:57 CET 2003
  *
+/* Revision 1.1.1.1  2003/02/12 13:59:15  matteo
+/* mer feb 12 14:56:57 CET 2003
+/*
 /* Revision 1.2  2000/01/05 08:20:39  markster
 /* Some OSS fixes and a few lpc changes to make it actually work
 /*
@@ -147,9 +156,12 @@ static integer c__10 = 10;
 /* Frame size, Prediction order, Pitch period */
 /*       Arguments */
 /* $Log$
- * Revision 1.13  2000/01/05 08:20:39  markster
- * Version 0.3.0 from FTP
+ * Revision 1.14  2003/02/12 13:59:15  matteo
+ * mer feb 12 14:56:57 CET 2003
  *
+/* Revision 1.1.1.1  2003/02/12 13:59:15  matteo
+/* mer feb 12 14:56:57 CET 2003
+/*
 /* Revision 1.2  2000/01/05 08:20:39  markster
 /* Some OSS fixes and a few lpc changes to make it actually work
 /*
diff --git a/codecs/lpc10/lpcenc.c b/codecs/lpc10/lpcenc.c
index 680da5b609..a3222af9dc 100755
--- a/codecs/lpc10/lpcenc.c
+++ b/codecs/lpc10/lpcenc.c
@@ -1,8 +1,11 @@
 /*
 
 $Log$
-Revision 1.13  2000/01/05 08:20:39  markster
-Version 0.3.0 from FTP
+Revision 1.14  2003/02/12 13:59:15  matteo
+mer feb 12 14:56:57 CET 2003
+
+Revision 1.1.1.1  2003/02/12 13:59:15  matteo
+mer feb 12 14:56:57 CET 2003
 
 Revision 1.2  2000/01/05 08:20:39  markster
 Some OSS fixes and a few lpc changes to make it actually work
@@ -50,9 +53,12 @@ static integer c__10 = 10;
 /* ***************************************************************** */
 
 /* $Log$
- * Revision 1.13  2000/01/05 08:20:39  markster
- * Version 0.3.0 from FTP
+ * Revision 1.14  2003/02/12 13:59:15  matteo
+ * mer feb 12 14:56:57 CET 2003
  *
+/* Revision 1.1.1.1  2003/02/12 13:59:15  matteo
+/* mer feb 12 14:56:57 CET 2003
+/*
 /* Revision 1.2  2000/01/05 08:20:39  markster
 /* Some OSS fixes and a few lpc changes to make it actually work
 /*
@@ -109,9 +115,12 @@ static integer c__10 = 10;
 
 /*       Arguments */
 /* $Log$
- * Revision 1.13  2000/01/05 08:20:39  markster
- * Version 0.3.0 from FTP
+ * Revision 1.14  2003/02/12 13:59:15  matteo
+ * mer feb 12 14:56:57 CET 2003
  *
+/* Revision 1.1.1.1  2003/02/12 13:59:15  matteo
+/* mer feb 12 14:56:57 CET 2003
+/*
 /* Revision 1.2  2000/01/05 08:20:39  markster
 /* Some OSS fixes and a few lpc changes to make it actually work
 /*
diff --git a/codecs/lpc10/lpcini.c b/codecs/lpc10/lpcini.c
index bd6b01ae7c..90d61b9878 100755
--- a/codecs/lpc10/lpcini.c
+++ b/codecs/lpc10/lpcini.c
@@ -1,8 +1,11 @@
 /*
 
 $Log$
-Revision 1.13  2000/01/05 08:20:39  markster
-Version 0.3.0 from FTP
+Revision 1.14  2003/02/12 13:59:15  matteo
+mer feb 12 14:56:57 CET 2003
+
+Revision 1.1.1.1  2003/02/12 13:59:15  matteo
+mer feb 12 14:56:57 CET 2003
 
 Revision 1.2  2000/01/05 08:20:39  markster
 Some OSS fixes and a few lpc changes to make it actually work
@@ -45,9 +48,12 @@ struct {
 /* ***************************************************************** */
 
 /* $Log$
- * Revision 1.13  2000/01/05 08:20:39  markster
- * Version 0.3.0 from FTP
+ * Revision 1.14  2003/02/12 13:59:15  matteo
+ * mer feb 12 14:56:57 CET 2003
  *
+/* Revision 1.1.1.1  2003/02/12 13:59:15  matteo
+/* mer feb 12 14:56:57 CET 2003
+/*
 /* Revision 1.2  2000/01/05 08:20:39  markster
 /* Some OSS fixes and a few lpc changes to make it actually work
 /*
@@ -71,9 +77,12 @@ struct {
 {
 
 /* $Log$
- * Revision 1.13  2000/01/05 08:20:39  markster
- * Version 0.3.0 from FTP
+ * Revision 1.14  2003/02/12 13:59:15  matteo
+ * mer feb 12 14:56:57 CET 2003
  *
+/* Revision 1.1.1.1  2003/02/12 13:59:15  matteo
+/* mer feb 12 14:56:57 CET 2003
+/*
 /* Revision 1.2  2000/01/05 08:20:39  markster
 /* Some OSS fixes and a few lpc changes to make it actually work
 /*
@@ -97,9 +106,12 @@ struct {
 /*   LPC Configuration parameters: */
 /* Frame size, Prediction order, Pitch period */
 /* $Log$
- * Revision 1.13  2000/01/05 08:20:39  markster
- * Version 0.3.0 from FTP
+ * Revision 1.14  2003/02/12 13:59:15  matteo
+ * mer feb 12 14:56:57 CET 2003
  *
+/* Revision 1.1.1.1  2003/02/12 13:59:15  matteo
+/* mer feb 12 14:56:57 CET 2003
+/*
 /* Revision 1.2  2000/01/05 08:20:39  markster
 /* Some OSS fixes and a few lpc changes to make it actually work
 /*
diff --git a/codecs/lpc10/lpfilt.c b/codecs/lpc10/lpfilt.c
index 3f599f542a..9dff6b52a6 100755
--- a/codecs/lpc10/lpfilt.c
+++ b/codecs/lpc10/lpfilt.c
@@ -1,8 +1,11 @@
 /*
 
 $Log$
-Revision 1.13  2000/01/05 08:20:39  markster
-Version 0.3.0 from FTP
+Revision 1.14  2003/02/12 13:59:15  matteo
+mer feb 12 14:56:57 CET 2003
+
+Revision 1.1.1.1  2003/02/12 13:59:15  matteo
+mer feb 12 14:56:57 CET 2003
 
 Revision 1.2  2000/01/05 08:20:39  markster
 Some OSS fixes and a few lpc changes to make it actually work
@@ -29,9 +32,12 @@ extern int lpfilt_(real *inbuf, real *lpbuf, integer *len, integer *nsamp);
 /* 	LPFILT Version 55 */
 
 /* $Log$
- * Revision 1.13  2000/01/05 08:20:39  markster
- * Version 0.3.0 from FTP
+ * Revision 1.14  2003/02/12 13:59:15  matteo
+ * mer feb 12 14:56:57 CET 2003
  *
+/* Revision 1.1.1.1  2003/02/12 13:59:15  matteo
+/* mer feb 12 14:56:57 CET 2003
+/*
 /* Revision 1.2  2000/01/05 08:20:39  markster
 /* Some OSS fixes and a few lpc changes to make it actually work
 /*
diff --git a/codecs/lpc10/median.c b/codecs/lpc10/median.c
index fcd3d7dce2..376c46c426 100755
--- a/codecs/lpc10/median.c
+++ b/codecs/lpc10/median.c
@@ -1,8 +1,11 @@
 /*
 
 $Log$
-Revision 1.13  2000/01/05 08:20:39  markster
-Version 0.3.0 from FTP
+Revision 1.14  2003/02/12 13:59:15  matteo
+mer feb 12 14:56:57 CET 2003
+
+Revision 1.1.1.1  2003/02/12 13:59:15  matteo
+mer feb 12 14:56:57 CET 2003
 
 Revision 1.2  2000/01/05 08:20:39  markster
 Some OSS fixes and a few lpc changes to make it actually work
@@ -29,9 +32,12 @@ extern integer median_(integer *d1, integer *d2, integer *d3);
 /* 	MEDIAN Version 45G */
 
 /* $Log$
- * Revision 1.13  2000/01/05 08:20:39  markster
- * Version 0.3.0 from FTP
+ * Revision 1.14  2003/02/12 13:59:15  matteo
+ * mer feb 12 14:56:57 CET 2003
  *
+/* Revision 1.1.1.1  2003/02/12 13:59:15  matteo
+/* mer feb 12 14:56:57 CET 2003
+/*
 /* Revision 1.2  2000/01/05 08:20:39  markster
 /* Some OSS fixes and a few lpc changes to make it actually work
 /*
diff --git a/codecs/lpc10/mload.c b/codecs/lpc10/mload.c
index 63bcf5ca07..0789cfa43a 100755
--- a/codecs/lpc10/mload.c
+++ b/codecs/lpc10/mload.c
@@ -1,8 +1,11 @@
 /*
 
 $Log$
-Revision 1.13  2000/01/05 08:20:39  markster
-Version 0.3.0 from FTP
+Revision 1.14  2003/02/12 13:59:15  matteo
+mer feb 12 14:56:57 CET 2003
+
+Revision 1.1.1.1  2003/02/12 13:59:15  matteo
+mer feb 12 14:56:57 CET 2003
 
 Revision 1.2  2000/01/05 08:20:39  markster
 Some OSS fixes and a few lpc changes to make it actually work
@@ -29,9 +32,12 @@ extern int mload_(integer *order, integer *awins, integer *awinf, real *speech,
 /* 	MLOAD Version 48 */
 
 /* $Log$
- * Revision 1.13  2000/01/05 08:20:39  markster
- * Version 0.3.0 from FTP
+ * Revision 1.14  2003/02/12 13:59:15  matteo
+ * mer feb 12 14:56:57 CET 2003
  *
+/* Revision 1.1.1.1  2003/02/12 13:59:15  matteo
+/* mer feb 12 14:56:57 CET 2003
+/*
 /* Revision 1.2  2000/01/05 08:20:39  markster
 /* Some OSS fixes and a few lpc changes to make it actually work
 /*
diff --git a/codecs/lpc10/onset.c b/codecs/lpc10/onset.c
index 8a115f17c5..1e9c1d0f75 100755
--- a/codecs/lpc10/onset.c
+++ b/codecs/lpc10/onset.c
@@ -1,8 +1,11 @@
 /*
 
 $Log$
-Revision 1.13  2000/01/05 08:20:39  markster
-Version 0.3.0 from FTP
+Revision 1.14  2003/02/12 13:59:15  matteo
+mer feb 12 14:56:57 CET 2003
+
+Revision 1.1.1.1  2003/02/12 13:59:15  matteo
+mer feb 12 14:56:57 CET 2003
 
 Revision 1.2  2000/01/05 08:20:39  markster
 Some OSS fixes and a few lpc changes to make it actually work
@@ -41,9 +44,12 @@ static real c_b2 = 1.f;
 /* 	ONSET Version 49 */
 
 /* $Log$
- * Revision 1.13  2000/01/05 08:20:39  markster
- * Version 0.3.0 from FTP
+ * Revision 1.14  2003/02/12 13:59:15  matteo
+ * mer feb 12 14:56:57 CET 2003
  *
+/* Revision 1.1.1.1  2003/02/12 13:59:15  matteo
+/* mer feb 12 14:56:57 CET 2003
+/*
 /* Revision 1.2  2000/01/05 08:20:39  markster
 /* Some OSS fixes and a few lpc changes to make it actually work
 /*
@@ -143,9 +149,12 @@ static real c_b2 = 1.f;
 
 /*       Arguments */
 /* $Log$
- * Revision 1.13  2000/01/05 08:20:39  markster
- * Version 0.3.0 from FTP
+ * Revision 1.14  2003/02/12 13:59:15  matteo
+ * mer feb 12 14:56:57 CET 2003
  *
+/* Revision 1.1.1.1  2003/02/12 13:59:15  matteo
+/* mer feb 12 14:56:57 CET 2003
+/*
 /* Revision 1.2  2000/01/05 08:20:39  markster
 /* Some OSS fixes and a few lpc changes to make it actually work
 /*
diff --git a/codecs/lpc10/pitsyn.c b/codecs/lpc10/pitsyn.c
index 52e41ccac2..b5bffde5cb 100755
--- a/codecs/lpc10/pitsyn.c
+++ b/codecs/lpc10/pitsyn.c
@@ -1,8 +1,11 @@
 /*
 
 $Log$
-Revision 1.13  2000/01/05 08:20:39  markster
-Version 0.3.0 from FTP
+Revision 1.14  2003/02/12 13:59:15  matteo
+mer feb 12 14:56:57 CET 2003
+
+Revision 1.1.1.1  2003/02/12 13:59:15  matteo
+mer feb 12 14:56:57 CET 2003
 
 Revision 1.2  2000/01/05 08:20:39  markster
 Some OSS fixes and a few lpc changes to make it actually work
@@ -37,9 +40,12 @@ extern int pitsyn_(integer *order, integer *voice, integer *pitch, real *rms, re
 /* 	PITSYN Version 53 */
 
 /* $Log$
- * Revision 1.13  2000/01/05 08:20:39  markster
- * Version 0.3.0 from FTP
+ * Revision 1.14  2003/02/12 13:59:15  matteo
+ * mer feb 12 14:56:57 CET 2003
  *
+/* Revision 1.1.1.1  2003/02/12 13:59:15  matteo
+/* mer feb 12 14:56:57 CET 2003
+/*
 /* Revision 1.2  2000/01/05 08:20:39  markster
 /* Some OSS fixes and a few lpc changes to make it actually work
 /*
@@ -143,9 +149,12 @@ extern int pitsyn_(integer *order, integer *voice, integer *pitch, real *rms, re
 
 /*       Arguments */
 /* $Log$
- * Revision 1.13  2000/01/05 08:20:39  markster
- * Version 0.3.0 from FTP
+ * Revision 1.14  2003/02/12 13:59:15  matteo
+ * mer feb 12 14:56:57 CET 2003
  *
+/* Revision 1.1.1.1  2003/02/12 13:59:15  matteo
+/* mer feb 12 14:56:57 CET 2003
+/*
 /* Revision 1.2  2000/01/05 08:20:39  markster
 /* Some OSS fixes and a few lpc changes to make it actually work
 /*
diff --git a/codecs/lpc10/placea.c b/codecs/lpc10/placea.c
index 3db692cdec..7e705e7f1d 100755
--- a/codecs/lpc10/placea.c
+++ b/codecs/lpc10/placea.c
@@ -1,8 +1,11 @@
 /*
 
 $Log$
-Revision 1.13  2001/04/12 21:27:53  markster
-Version 0.3.0 from FTP
+Revision 1.14  2003/02/12 13:59:15  matteo
+mer feb 12 14:56:57 CET 2003
+
+Revision 1.1.1.1  2003/02/12 13:59:15  matteo
+mer feb 12 14:56:57 CET 2003
 
 Revision 1.3  2001/04/12 21:27:53  markh
 app_record now supports wildcards of sort so your output file is not overwritten every time it's run.  File.h got a documentation update on the ast_fileexists to include the return call.  Watch out for the placea.c placev.c code, it's updates have not been tested yet.  Just a few parenthesis to make it compile nicer on newer gcc versions with all the -W flags set.
@@ -32,9 +35,12 @@ extern int placea_(integer *ipitch, integer *voibuf, integer *obound, integer *a
 /* 	PLACEA Version 48 */
 
 /* $Log$
- * Revision 1.13  2001/04/12 21:27:53  markster
- * Version 0.3.0 from FTP
+ * Revision 1.14  2003/02/12 13:59:15  matteo
+ * mer feb 12 14:56:57 CET 2003
  *
+/* Revision 1.1.1.1  2003/02/12 13:59:15  matteo
+/* mer feb 12 14:56:57 CET 2003
+/*
 /* Revision 1.3  2001/04/12 21:27:53  markh
 /* app_record now supports wildcards of sort so your output file is not overwritten every time it's run.  File.h got a documentation update on the ast_fileexists to include the return call.  Watch out for the placea.c placev.c code, it's updates have not been tested yet.  Just a few parenthesis to make it compile nicer on newer gcc versions with all the -W flags set.
 /*
diff --git a/codecs/lpc10/placev.c b/codecs/lpc10/placev.c
index 93dbd6d5ac..eae5fcdec1 100755
--- a/codecs/lpc10/placev.c
+++ b/codecs/lpc10/placev.c
@@ -1,8 +1,11 @@
 /*
 
 $Log$
-Revision 1.13  2001/04/12 21:27:53  markster
-Version 0.3.0 from FTP
+Revision 1.14  2003/02/12 13:59:15  matteo
+mer feb 12 14:56:57 CET 2003
+
+Revision 1.1.1.1  2003/02/12 13:59:15  matteo
+mer feb 12 14:56:57 CET 2003
 
 Revision 1.3  2001/04/12 21:27:53  markh
 app_record now supports wildcards of sort so your output file is not overwritten every time it's run.  File.h got a documentation update on the ast_fileexists to include the return call.  Watch out for the placea.c placev.c code, it's updates have not been tested yet.  Just a few parenthesis to make it compile nicer on newer gcc versions with all the -W flags set.
@@ -32,9 +35,12 @@ extern int placev_(integer *osbuf, integer *osptr, integer *oslen, integer *obou
 /* 	PLACEV Version 48 */
 
 /* $Log$
- * Revision 1.13  2001/04/12 21:27:53  markster
- * Version 0.3.0 from FTP
+ * Revision 1.14  2003/02/12 13:59:15  matteo
+ * mer feb 12 14:56:57 CET 2003
  *
+/* Revision 1.1.1.1  2003/02/12 13:59:15  matteo
+/* mer feb 12 14:56:57 CET 2003
+/*
 /* Revision 1.3  2001/04/12 21:27:53  markh
 /* app_record now supports wildcards of sort so your output file is not overwritten every time it's run.  File.h got a documentation update on the ast_fileexists to include the return call.  Watch out for the placea.c placev.c code, it's updates have not been tested yet.  Just a few parenthesis to make it compile nicer on newer gcc versions with all the -W flags set.
 /*
diff --git a/codecs/lpc10/preemp.c b/codecs/lpc10/preemp.c
index f6dec775c8..05fb9fb6d7 100755
--- a/codecs/lpc10/preemp.c
+++ b/codecs/lpc10/preemp.c
@@ -1,8 +1,11 @@
 /*
 
 $Log$
-Revision 1.13  2000/01/05 08:20:39  markster
-Version 0.3.0 from FTP
+Revision 1.14  2003/02/12 13:59:15  matteo
+mer feb 12 14:56:57 CET 2003
+
+Revision 1.1.1.1  2003/02/12 13:59:15  matteo
+mer feb 12 14:56:57 CET 2003
 
 Revision 1.2  2000/01/05 08:20:39  markster
 Some OSS fixes and a few lpc changes to make it actually work
@@ -29,9 +32,12 @@ extern int preemp_(real *inbuf, real *pebuf, integer *nsamp, real *coef, real *z
 /* 	PREEMP Version 55 */
 
 /* $Log$
- * Revision 1.13  2000/01/05 08:20:39  markster
- * Version 0.3.0 from FTP
+ * Revision 1.14  2003/02/12 13:59:15  matteo
+ * mer feb 12 14:56:57 CET 2003
  *
+/* Revision 1.1.1.1  2003/02/12 13:59:15  matteo
+/* mer feb 12 14:56:57 CET 2003
+/*
 /* Revision 1.2  2000/01/05 08:20:39  markster
 /* Some OSS fixes and a few lpc changes to make it actually work
 /*
diff --git a/codecs/lpc10/prepro.c b/codecs/lpc10/prepro.c
index 53c14ba915..e21b4ca386 100755
--- a/codecs/lpc10/prepro.c
+++ b/codecs/lpc10/prepro.c
@@ -1,8 +1,11 @@
 /*
 
 $Log$
-Revision 1.13  2000/01/05 08:20:39  markster
-Version 0.3.0 from FTP
+Revision 1.14  2003/02/12 13:59:15  matteo
+mer feb 12 14:56:57 CET 2003
+
+Revision 1.1.1.1  2003/02/12 13:59:15  matteo
+mer feb 12 14:56:57 CET 2003
 
 Revision 1.2  2000/01/05 08:20:39  markster
 Some OSS fixes and a few lpc changes to make it actually work
@@ -44,9 +47,12 @@ static integer c__1 = 1;
 /* 	PREPRO Version 48 */
 
 /* $Log$
- * Revision 1.13  2000/01/05 08:20:39  markster
- * Version 0.3.0 from FTP
+ * Revision 1.14  2003/02/12 13:59:15  matteo
+ * mer feb 12 14:56:57 CET 2003
  *
+/* Revision 1.1.1.1  2003/02/12 13:59:15  matteo
+/* mer feb 12 14:56:57 CET 2003
+/*
 /* Revision 1.2  2000/01/05 08:20:39  markster
 /* Some OSS fixes and a few lpc changes to make it actually work
 /*
diff --git a/codecs/lpc10/random.c b/codecs/lpc10/random.c
index 4bee0e89e6..ec3ef45e7c 100755
--- a/codecs/lpc10/random.c
+++ b/codecs/lpc10/random.c
@@ -1,8 +1,11 @@
 /*
 
 $Log$
-Revision 1.13  2000/01/05 08:20:39  markster
-Version 0.3.0 from FTP
+Revision 1.14  2003/02/12 13:59:15  matteo
+mer feb 12 14:56:57 CET 2003
+
+Revision 1.1.1.1  2003/02/12 13:59:15  matteo
+mer feb 12 14:56:57 CET 2003
 
 Revision 1.2  2000/01/05 08:20:39  markster
 Some OSS fixes and a few lpc changes to make it actually work
@@ -37,9 +40,12 @@ extern integer random_(struct lpc10_decoder_state *st);
 /* 	RANDOM Version 49 */
 
 /* $Log$
- * Revision 1.13  2000/01/05 08:20:39  markster
- * Version 0.3.0 from FTP
+ * Revision 1.14  2003/02/12 13:59:15  matteo
+ * mer feb 12 14:56:57 CET 2003
  *
+/* Revision 1.1.1.1  2003/02/12 13:59:15  matteo
+/* mer feb 12 14:56:57 CET 2003
+/*
 /* Revision 1.2  2000/01/05 08:20:39  markster
 /* Some OSS fixes and a few lpc changes to make it actually work
 /*
diff --git a/codecs/lpc10/rcchk.c b/codecs/lpc10/rcchk.c
index 17d3c190dd..a2fe86702c 100755
--- a/codecs/lpc10/rcchk.c
+++ b/codecs/lpc10/rcchk.c
@@ -1,8 +1,11 @@
 /*
 
 $Log$
-Revision 1.13  2000/01/05 08:20:39  markster
-Version 0.3.0 from FTP
+Revision 1.14  2003/02/12 13:59:15  matteo
+mer feb 12 14:56:57 CET 2003
+
+Revision 1.1.1.1  2003/02/12 13:59:15  matteo
+mer feb 12 14:56:57 CET 2003
 
 Revision 1.2  2000/01/05 08:20:39  markster
 Some OSS fixes and a few lpc changes to make it actually work
@@ -29,9 +32,12 @@ extern int rcchk_(integer *order, real *rc1f, real *rc2f);
 /* 	RCCHK Version 45G */
 
 /* $Log$
- * Revision 1.13  2000/01/05 08:20:39  markster
- * Version 0.3.0 from FTP
+ * Revision 1.14  2003/02/12 13:59:15  matteo
+ * mer feb 12 14:56:57 CET 2003
  *
+/* Revision 1.1.1.1  2003/02/12 13:59:15  matteo
+/* mer feb 12 14:56:57 CET 2003
+/*
 /* Revision 1.2  2000/01/05 08:20:39  markster
 /* Some OSS fixes and a few lpc changes to make it actually work
 /*
diff --git a/codecs/lpc10/synths.c b/codecs/lpc10/synths.c
index 4f8efac5bd..33becea658 100755
--- a/codecs/lpc10/synths.c
+++ b/codecs/lpc10/synths.c
@@ -1,8 +1,11 @@
 /*
 
 $Log$
-Revision 1.13  2000/01/05 08:20:39  markster
-Version 0.3.0 from FTP
+Revision 1.14  2003/02/12 13:59:15  matteo
+mer feb 12 14:56:57 CET 2003
+
+Revision 1.1.1.1  2003/02/12 13:59:15  matteo
+mer feb 12 14:56:57 CET 2003
 
 Revision 1.2  2000/01/05 08:20:39  markster
 Some OSS fixes and a few lpc changes to make it actually work
@@ -58,9 +61,12 @@ static real c_b2 = .7f;
 /* 	SYNTHS Version 54 */
 
 /* $Log$
- * Revision 1.13  2000/01/05 08:20:39  markster
- * Version 0.3.0 from FTP
+ * Revision 1.14  2003/02/12 13:59:15  matteo
+ * mer feb 12 14:56:57 CET 2003
  *
+/* Revision 1.1.1.1  2003/02/12 13:59:15  matteo
+/* mer feb 12 14:56:57 CET 2003
+/*
 /* Revision 1.2  2000/01/05 08:20:39  markster
 /* Some OSS fixes and a few lpc changes to make it actually work
 /*
@@ -178,9 +184,12 @@ static real c_b2 = .7f;
     real rci[160]	/* was [10][16] */;
 
 /* $Log$
- * Revision 1.13  2000/01/05 08:20:39  markster
- * Version 0.3.0 from FTP
+ * Revision 1.14  2003/02/12 13:59:15  matteo
+ * mer feb 12 14:56:57 CET 2003
  *
+/* Revision 1.1.1.1  2003/02/12 13:59:15  matteo
+/* mer feb 12 14:56:57 CET 2003
+/*
 /* Revision 1.2  2000/01/05 08:20:39  markster
 /* Some OSS fixes and a few lpc changes to make it actually work
 /*
@@ -209,9 +218,12 @@ static real c_b2 = .7f;
 /* Frame size, Prediction order, Pitch period */
 /*       Arguments */
 /* $Log$
- * Revision 1.13  2000/01/05 08:20:39  markster
- * Version 0.3.0 from FTP
+ * Revision 1.14  2003/02/12 13:59:15  matteo
+ * mer feb 12 14:56:57 CET 2003
  *
+/* Revision 1.1.1.1  2003/02/12 13:59:15  matteo
+/* mer feb 12 14:56:57 CET 2003
+/*
 /* Revision 1.2  2000/01/05 08:20:39  markster
 /* Some OSS fixes and a few lpc changes to make it actually work
 /*
diff --git a/codecs/lpc10/tbdm.c b/codecs/lpc10/tbdm.c
index d3b49c9e71..c04c9ddc48 100755
--- a/codecs/lpc10/tbdm.c
+++ b/codecs/lpc10/tbdm.c
@@ -1,8 +1,11 @@
 /*
 
 $Log$
-Revision 1.13  2000/01/05 08:20:40  markster
-Version 0.3.0 from FTP
+Revision 1.14  2003/02/12 13:59:15  matteo
+mer feb 12 14:56:57 CET 2003
+
+Revision 1.1.1.1  2003/02/12 13:59:15  matteo
+mer feb 12 14:56:57 CET 2003
 
 Revision 1.2  2000/01/05 08:20:40  markster
 Some OSS fixes and a few lpc changes to make it actually work
@@ -30,9 +33,12 @@ extern int tbdm_(real *speech, integer *lpita, integer *tau, integer *ltau, real
 /* 	TBDM Version 49 */
 
 /* $Log$
- * Revision 1.13  2000/01/05 08:20:40  markster
- * Version 0.3.0 from FTP
+ * Revision 1.14  2003/02/12 13:59:15  matteo
+ * mer feb 12 14:56:57 CET 2003
  *
+/* Revision 1.1.1.1  2003/02/12 13:59:15  matteo
+/* mer feb 12 14:56:57 CET 2003
+/*
 /* Revision 1.2  2000/01/05 08:20:40  markster
 /* Some OSS fixes and a few lpc changes to make it actually work
 /*
diff --git a/codecs/lpc10/voicin.c b/codecs/lpc10/voicin.c
index 2c92aad33c..ae7eb1507b 100755
--- a/codecs/lpc10/voicin.c
+++ b/codecs/lpc10/voicin.c
@@ -1,8 +1,11 @@
 /*
 
 $Log$
-Revision 1.13  2000/01/05 08:20:40  markster
-Version 0.3.0 from FTP
+Revision 1.14  2003/02/12 13:59:15  matteo
+mer feb 12 14:56:57 CET 2003
+
+Revision 1.1.1.1  2003/02/12 13:59:15  matteo
+mer feb 12 14:56:57 CET 2003
 
 Revision 1.2  2000/01/05 08:20:40  markster
 Some OSS fixes and a few lpc changes to make it actually work
@@ -48,9 +51,12 @@ extern struct {
 /* 	VOICIN Version 52 */
 
 /* $Log$
- * Revision 1.13  2000/01/05 08:20:40  markster
- * Version 0.3.0 from FTP
+ * Revision 1.14  2003/02/12 13:59:15  matteo
+ * mer feb 12 14:56:57 CET 2003
  *
+/* Revision 1.1.1.1  2003/02/12 13:59:15  matteo
+/* mer feb 12 14:56:57 CET 2003
+/*
 /* Revision 1.2  2000/01/05 08:20:40  markster
 /* Some OSS fixes and a few lpc changes to make it actually work
 /*
@@ -290,9 +296,12 @@ s*/
 /* 	Global Variables: */
 /*       Arguments */
 /* $Log$
- * Revision 1.13  2000/01/05 08:20:40  markster
- * Version 0.3.0 from FTP
+ * Revision 1.14  2003/02/12 13:59:15  matteo
+ * mer feb 12 14:56:57 CET 2003
  *
+/* Revision 1.1.1.1  2003/02/12 13:59:15  matteo
+/* mer feb 12 14:56:57 CET 2003
+/*
 /* Revision 1.2  2000/01/05 08:20:40  markster
 /* Some OSS fixes and a few lpc changes to make it actually work
 /*
diff --git a/codecs/lpc10/vparms.c b/codecs/lpc10/vparms.c
index 3bd2d58d2c..5973b9a91a 100755
--- a/codecs/lpc10/vparms.c
+++ b/codecs/lpc10/vparms.c
@@ -1,8 +1,11 @@
 /*
 
 $Log$
-Revision 1.13  2000/01/05 08:20:40  markster
-Version 0.3.0 from FTP
+Revision 1.14  2003/02/12 13:59:15  matteo
+mer feb 12 14:56:57 CET 2003
+
+Revision 1.1.1.1  2003/02/12 13:59:15  matteo
+mer feb 12 14:56:57 CET 2003
 
 Revision 1.2  2000/01/05 08:20:40  markster
 Some OSS fixes and a few lpc changes to make it actually work
@@ -33,9 +36,12 @@ static real c_b2 = 1.f;
 /* 	VPARMS Version 50 */
 
 /* $Log$
- * Revision 1.13  2000/01/05 08:20:40  markster
- * Version 0.3.0 from FTP
+ * Revision 1.14  2003/02/12 13:59:15  matteo
+ * mer feb 12 14:56:57 CET 2003
  *
+/* Revision 1.1.1.1  2003/02/12 13:59:15  matteo
+/* mer feb 12 14:56:57 CET 2003
+/*
 /* Revision 1.2  2000/01/05 08:20:40  markster
 /* Some OSS fixes and a few lpc changes to make it actually work
 /*
diff --git a/configs/extensions.conf.sample b/configs/extensions.conf.sample
index b408feb46b..325cf2e2a2 100755
--- a/configs/extensions.conf.sample
+++ b/configs/extensions.conf.sample
@@ -2,8 +2,7 @@
 ; Static extension configuration files, used by
 ; the pbx_config module.
 ;
-; The "General" category is for certain variables.  All other categories
-; are interpreted as extension contexts
+; The "General" category is for certain variables.  
 ;
 [general]
 ;
@@ -14,24 +13,68 @@
 ; XXX Not yet implemented XXX
 ;
 static=yes
-
 ;
-; if stati=yes and writeprotect=no, you can save dialplan by
+; if static=yes and writeprotect=no, you can save dialplan by
 ; CLI command 'save dialplan' too
 ;
 writeprotect=no
 
-; Remote things always ring all phones first.
-;[remote]
-;exten => s,1,Dial,AdtranVoFR/4200&AdtranVoFR/4151&AdtranVoFR/4300|15
-;exten => s,2,Goto,default|s|2
-;include => default
+;
+; The "Globals" category contains global variables that can be referenced
+; in the dialplan with ${VARIABLE}
+;
+[globals]
+CONSOLE=Console/dsp				; Console interface for demo
+;CONSOLE=Zap/1
+;CONSOLE=Phone/phone0
+IAXINFO=guest					; IAXtel username/password
+;IAXINFO=myuser:mypass
+TRUNK=Zap/g2					; Trunk interface
+;TRUNK=IAX/user:pass@provider
+
+;
+; Any category other than "General" and "Globals" represent 
+; extension contexts, which are collections of extensions.  
+;
+; Extension names may be numbers, letters, or combinations
+; thereof. If an extension name is prefixed by a '_'
+; character, it is interpreted as a pattern rather than a
+; literal.  In patterns, some characters have special meanings:
+;
+;   X - any digit from 0-9
+;   N - any digit from 2-9
+;   [1235-9] - any digit in the brackets (in this example, 1,2,3,5,6,7,8,9)
+;   . - wildcard, matches anything remaining (e.g. _9011. matches anything starting with 9011 including 9011)
+;
+; For example the extenion _NXXXXXX would match normal 7 digit dialings, while
+; _1NXXNXXXXXX would represent an area code plus phone number
+; preceeded by a one.
+;
+; Contexts contain several lines, one for each step of each
+; extension, which can take one of two forms as listed below,
+; with the first form being preferred.  One may include another
+; context in the current one as well, optionally with a
+; date and time.  Included contexts are included in the order
+; they are listed.
+;
+;[context]
+;exten => someexten,priority,application(arg1,arg2,...)
+;exten => someexten,priority,application,arg1|arg2...
 ;
 ; Timing list for includes is 
 ;
 ;   <time range>|<days of week>|<days of month>|<months>
 ;
 ;include => daytime|9:00-17:00|mon-fri|*|*
+;
+; ignorepat can be used to instruct drivers to not cancel dialtone upon
+; receipt of a particular pattern.  The most commonly used example is
+; of course '9' like this:
+;
+;ignorepat => 9
+;
+; so that dialtone remains even after dialing a 9.
+;
 
 ;
 ; Here are the entries you need to participate in the IAXTEL
@@ -39,35 +82,73 @@ writeprotect=no
 ; there are exceptions.  For more information, and to sign
 ; up, please go to www.gnophone.com or www.iaxtel.com
 ;
-[iaxtel]
-exten => _91NXXNXXXXXX,1,StripMSD,1
-exten => _1NXXNXXXXXX,2,Dial,IAX/iaxtel.com/BYEXTENSION@iaxtel
+[iaxtel700]
+exten => _91700NXXXXXX,1,Dial(IAX/${IAXINFO}@iaxtel.com/${EXTEN-1}@iaxtel)
 
-[provider]
+[iaxprovider]
 ;switch => IAX/user:[key]@myserver/mycontext
 
-; Local stuff
-[local]
-; Special extension for local phone numbers, long distance, etc, going
-; out via the Frame Relay interface.  Patterns are prefixed with "_", which
-; is ignored.
+[trunkint]
 ;
-; ignorepat can be used to instruct drivers to not cancel dialtone upon
-; receipt of a particular pattern.  The most commonly used example is
-; of course '9' like this:
+; International long distance through trunk
 ;
-; ignorepat => 9
+exten => 9011.,1,Dial(${TRUNK}/${EXTEN-1})
+exten => 9011.,2,Congestion
+
+[trunkld]
 ;
-; so that dialtone remains even after dialing a 9.
+; Long distance context accessed through trunk
+;
+exten => _91NXXNXXXXXX,1,Dial(${TRUNK}/${EXTEN-1})
+exten => _91NXXNXXXXXX,2,Congestion
+
+[trunklocal]
+;
+; Local seven-digit dialing accessed through trunk interface
+;
+exten => _9NXXXXXX,1,Dial(${TRUNK}/${EXTEN-1})
+exten => _9NXXXXXX,2,Congestion
+
+[trunktollfree]
+;
+; Long distance context accessed through trunk interface
+;
+exten => _91800NXXXXXX,1,Dial(${TRUNK}/${EXTEN-1})
+exten => _91800NXXXXXX,2,Congestion
+exten => _91888NXXXXXX,1,Dial(${TRUNK}/${EXTEN-1})
+exten => _91888NXXXXXX,2,Congestion
+exten => _91877NXXXXXX,1,Dial(${TRUNK}/${EXTEN-1})
+exten => _91877NXXXXXX,2,Congestion
+exten => _91866NXXXXXX,1,Dial(${TRUNK}/${EXTEN-1})
+exten => _91866NXXXXXX,2,Congestion
+
+[international]
+;
+; Master context for international long distance
+;
+ignorepat => 9
+include => longdistance
+include => trunkint
+
+[longdistance]
+;
+; Master context for long distance
+;
+ignorepat => 9
+include => local
+include => trunkld
+
+[local]
+;
+; Master context for local, toll-free, and iaxtel calls only
 ;
 ignorepat => 9
-;exten => _9NXXXXXX,1,Dial,IAX/user:[key]@myserver/BYEXTENSION
-;exten => _91NXXNXXXXXX,1,Dial,IAX/user:[key]@myserver/BYEXTENSION
-;exten => _9911,1,Dial,IAX/user:[key]@myserver/BYEXTENSION
-include => parkedcalls
 include => default
+include => parkedcalls
+include => trunklocal
+include => iaxtel700
+include => trunktollfree
 include => provider
-include => iaxtel
 ;
 ; You can use an alternative switch type as well, to resolve
 ; extensions that are not known here, for example with remote 
@@ -75,6 +156,18 @@ include => iaxtel
 ; 
 ; switch => IAX/user:password@bigserver/local
 
+[macro-stdexten];
+;
+; Standard extension macro:
+;   ${ARG1} - Extension  (we could have used ${MACRO_EXTEN} here as well
+;   ${ARG2} - Device(s) to ring
+;
+exten => s,1,Dial(${ARG2},20)					; Ring the interface, 20 seconds maximum
+exten => s,2,Voicemail(u${ARG1})				; If unavailable, send to voicemail w/ unavail announce
+exten => s,3,Goto(default,s,1)					; If they press #, return to start
+exten => s,102,Voicemail(b${ARG1})				; If busy, send to voicemail w/ busy announce
+exten => s,103,Goto(default,s,1)				; If they press #, return to start
+
 
 [demo]
 ;
@@ -84,71 +177,85 @@ exten => s,1,Wait,1			; Wait a second, just for fun
 exten => s,2,Answer			; Answer the line
 exten => s,3,DigitTimeout,5		; Set Digit Timeout to 5 seconds
 exten => s,4,ResponseTimeout,10		; Set Response Timeout to 10 seconds
-exten => s,5,BackGround,demo-congrats	; Play a congratulatory message
-exten => s,6,BackGround,demo-instruct	; Play some instructions
+exten => s,5,BackGround(demo-congrats)	; Play a congratulatory message
+exten => s,6,BackGround(demo-instruct)	; Play some instructions
 
-exten => 2,1,BackGround,demo-moreinfo	; Give some more information.
-exten => 2,2,Goto,s|6
+exten => 2,1,BackGround(demo-moreinfo)	; Give some more information.
+exten => 2,2,Goto(s,6)
 
-exten => 3,1,SetLanguage,fr		; Set language to french
-exten => 3,2,Goto,s|5			; Start with the congratulations
+exten => 3,1,SetLanguage(fr)		; Set language to french
+exten => 3,2,Goto(s,5)			; Start with the congratulations
 
+exten => 1000,1,Goto(default,s,1)
 ;
 ; We also create an example user, 1234, who is on the console and has
 ; voicemail, etc.
 ;
-exten => 1234,1,Playback,transfer|skip		; "Please hold while..." 
+exten => 1234,1,Playback(transfer,skip)		; "Please hold while..." 
 					; (but skip if channel is not up)
-exten => 1234,2,Dial,Console/dsp|10	; Ring the console, 10 secs max
-exten => 1234,3,Voicemail,u1234		; Send to voicemail...
-exten => 1234,5,Goto,s|6			; Start over
-exten => 1234,103,Voicemail,b1234	; (2 + 101) "I'm on the phone"
-exten => 1234,104,Goto,5			; Go to voicemail, etc.
+exten => 1234,2,Macro(stdexten,1234,${CONSOLE})
 
-exten => 1235,1,Goto,1234|3		; Right to voicemail
+exten => 1235,1,Voicemail(u1234)		; Right to voicemail
 
-exten => 1236,1,Dial,Console/dsp		; Ring forever
-exten => 1236,2,Goto,1234|103		; Unless busy
+exten => 1236,1,Dial(Console/dsp)		; Ring forever
+exten => 1236,2,Voicemail(u1234)		; Unless busy
 
 ;
 ; # for when they're done with the demo
 ;
-exten => #,1,Playback,demo-thanks		; "Thanks for trying the demo"
+exten => #,1,Playback(demo-thanks)		; "Thanks for trying the demo"
 exten => #,2,Hangup			; Hang them up.
 
 ;
 ; A timeout and "invalid extension rule"
 ;
-exten => t,1,Goto,#|1			; If they take too long, give up
-exten => i,1,Playback,invalid		; "That's not valid, try again"
+exten => t,1,Goto(#,1)			; If they take too long, give up
+exten => i,1,Playback(invalid)		; "That's not valid, try again"
 
 ;
 ; Create an extension, 500, for dialing the
 ; Asterisk demo.
 ;
-exten => 500,1,Playback,demo-abouttotry	; Let them know what's going on
-exten => 500,2,Dial,IAX/asterisk@demo	; Call the Asterisk demo
-exten => 500,3,Playback,demo-nogo		; Couldn't connect to the demo site
-exten => 500,4,Goto,s|6			; Return to the start over message.
+exten => 500,1,Playback(demo-abouttotry); Let them know what's going on
+exten => 500,2,Dial(IAX/guest@misery.digium.com/s@default)	; Call the Asterisk demo
+exten => 500,3,Playback(demo-nogo)	; Couldn't connect to the demo site
+exten => 500,4,Goto(s,6)		; Return to the start over message.
 
 ;
 ; Create an extension, 600, for evaulating echo latency.
 ;
-exten => 600,1,Playback,demo-echotest	; Let them know what's going on
+exten => 600,1,Playback(demo-echotest)	; Let them know what's going on
 exten => 600,2,Echo			; Do the echo test
-exten => 600,3,Playback,demo-echodone	; Let them know it's over
-exten => 600,4,Goto,s|6			; Start over
+exten => 600,3,Playback(demo-echodone)	; Let them know it's over
+exten => 600,4,Goto(s,6)		; Start over
 
 ;
 ; Give voicemail at extension 8500
 ;
 exten => 8500,1,VoicemailMain
-exten => 8500,2,Goto,s|6
+exten => 8500,2,Goto(s,6)
 ;
 ; Here's what a phone entry would look like (IXJ for example)
 ;
-;exten => 1265,1,Dial,Phone/phone0|15
-;exten => 1265,2,Goto,s|5
+;exten => 1265,1,Dial(Phone/phone0,15)
+;exten => 1265,2,Goto(s,5)
+
+;[mainmenu]
+;
+; Example "main menu" context with submenu
+;
+;exten => s,1,Answer
+;exten => s,2,Background(thanks)		; "Thanks for calling press 1 for sales, 2 for support, ..."
+;exten => 1,1,Goto(submenu,s,1)
+;exten => 2,1,Hangup
+;include => default
+;
+;[submenu]
+;exten => s,1,Ringing					; Make them comfortable with 2 seconds of ringback
+;exten => s,2,Wait,2
+;exten => s,3,Background(submenuopts)	; "Thanks for calling the sales department.  Press 1 for steve, 2 for..."
+;exten => 1,1,Goto(default,steve,1)
+;exten => 2,1,Goto(default,mark,2)
 
 [default]
 ;
@@ -157,95 +264,29 @@ exten => 8500,2,Goto,s|6
 ;
 include => demo
 
-; This is a more complicated sample extension configuration, similar to
-; what we used to use at LSS.
-
-;[default]
-;exten => s,1,Wait,0
-;exten => s,2,Answer
-;exten => s,3,DigitTimeout,5
-;exten => s,4,ResponseTimeout,10
-;exten => s,5,BackGround,welcome
-;exten => *,1,Directory,default
-;exten => *,2,Goto,s|4
-;exten => #,1,Playback,goodbye
-;exten => #,2,Hangup
-;exten => 100,1,Goto,other|s|1
-;exten => 200,1,Intercom
-;exten => 400,1,MP3Player,song8.mp3
-;exten => 401,1,MP3Player,sample.mp3
-;exten => 402,1,MP3Player,sunscreen.mp3
-;exten => 403,1,MP3Player,http://trode.vergenet.net:8000
-;exten => 404,1,MP3Player,http://216.32.166.94:14900
-;exten => 405,1,Playback,sample
-;
-; Here's the template for a typical extension, carefully broken apart
-; for analysis.  The others are pretty much the same, but not as well
-; documented.
-;
-; Step 1:  Play back a "Please hold while I try that extension" message
-;exten => 4300,1,Playback,transfer
-; Step 2:  Dial the numbers where Ben is likely to be.  Try for no more
-;          than 15 seconds.
-;exten => 4300,2,Dial,AdtranVoFR/4300|15
-; Step 3:  Send them to voicemail, preceeded by their unavailable message.
-;exten => 4300,3,Voicemail,u4300
-; Step 4:  If they return from voicemail, go back to the top
-;exten => 4300,4,Goto,s|4
-; Step 103: If the Dialing is busy, it will try here first.  We'll play a
-;           special "I'm busy" message and send them to voicemail
-;exten => 4300,103,Voicemail,b4300
-; Step 104: And then continue from whereever the other would
-;exten => 4300,104,Goto,4
-; Exten. 4301: Provide a short-circuit so we can transfer striaght to 
-;              voicemail.
-;exten => 4301,1,Goto,4300|3
-; Exten. 4302: Provide a way to ring a given phone indefinitely
-;exten => 4302,1,Dial,AdtranVoFR/4300
-
-;exten => 4200,1,Playback,transfer
-;exten => 4200,2,Dial,AdtranVoFR/4200|15
-;exten => 4200,3,Playback,vm/4200/unavail
-;exten => 4200,4,Voicemail,4200
-;exten => 4200,5,Goto,s|4
-;exten => 4200,103,Playback,vm/4200/busy
-;exten => 4200,104,Goto,4
-;exten => 4201,1,Goto,4200|3
-;exten => 4202,1,Dial,AdtranVoFR/4200
-
-;exten => 4110,1,Playback,transfer
-;exten => 4110,2,Dial,AdtranVoFR/4110|15
-;exten => 4110,2,Wait,5
-;exten => 4110,3,Playback,vm/4110/unavail
-;exten => 4110,4,Voicemail,4110
-;exten => 4110,5,Goto,s|4
-;exten => 4110,103,Playback,vm/4110/busy
-;exten => 4110,104,Goto,4
-;exten => 4111,1,Goto,4110|3
-;exten => 4112,1,Dial,AdtranVoFR/4110
-;exten => 4113,1,Voicemail,s4110
 
-;exten => 8500,1,VoicemailMain
-;exten => 8500,2,Goto,s|4
-;exten => 762,1,Playback,somepeople
-;exten => 762,2,Wait,4
-;exten => 762,3,Goto,s|4
-
-; Timeout stuff...  We could send to an operator, or just ditch them.
-;exten => t,1,Goto,#|1
-;exten => i,1,BackGround,invalid
-include => parkedcalls
+; Real extensions would go here.  Generally you want real extensions to be 4 or 5
+; digits long (although there is no such requirement) and start with a single
+; digit that is fairly large (like 6 or 7) so that you have plenty of room to
+; overlap extensions and menu options without conflict.  You can alias them with
+; names, too and use global variables
 
-;[other]
-;exten => s,1,Playback,digits/9
-;exten => s,2,Playback,digits/8
-;exten => s,3,Playback,digits/7
-;exten => s,4,Goto,100|1
-;exten => 100,1,Playback,digits/6
-;exten => 100,2,Playback,digits/5
-;exten => 100,3,Goto,default|s|4
-
-;[outboundpri]
-;exten => _91NXXNXXXXXX,1,StripMSD,1
-;exten => _1NXXNXXXXXX,2,Dial,Zap/g2/BYEXTENSION
-;ignorepat => 9
+
+;exten => 6275,Macro(stdexten,6275,${MARK})			; assuming ${MARK} is something like Zap/2
+;exten => mark,1,Goto(6275|1)						; alias mark to 6275
+;exten => 6236,Macro(stdexten,6236,${WIL})			; Ditto for wil
+;exten => wil,1,Goto(6236|1)
+;
+; Some other handy things are an extension for checking voicemail via
+; voicemailmain
+;
+;exten => 8500,1,VoicemailMain
+;exten => 8500,2,Hangup
+;
+; Or a conference room (you'll need to edit meetme.conf to enable this room)
+;
+;exten => 8600,1,Meetme,1234
+;
+; For more information on applications, just type "show applications" at your
+; friendly Asterisk CLI prompt.
+;
diff --git a/editline/.cvsignore b/editline/.cvsignore
new file mode 100755
index 0000000000..995bc1ac8f
--- /dev/null
+++ b/editline/.cvsignore
@@ -0,0 +1,22 @@
+np/vis.o_a
+np/unvis.o_a
+np/strlcpy.o_a
+np/strlcat.o_a
+np/fgetln.o_a
+vi.h
+tokenizer.o_a
+readline.o_a
+history.o_a
+help.h
+help.c
+fcns.h
+fcns.c
+emacs.h
+editline.o_a
+editline.c
+config.status
+config.log
+config.h
+common.h
+config.cache
+Makefile
diff --git a/editline/np/.cvsignore b/editline/np/.cvsignore
new file mode 100755
index 0000000000..67d3a1d90e
--- /dev/null
+++ b/editline/np/.cvsignore
@@ -0,0 +1,5 @@
+vis.o_a
+unvis.o_a
+strlcpy.o_a
+strlcat.o_a
+fgetln.o_a
diff --git a/include/asterisk/pbx.h b/include/asterisk/pbx.h
index 8e18bbc97f..f6034b61e6 100755
--- a/include/asterisk/pbx.h
+++ b/include/asterisk/pbx.h
@@ -435,6 +435,10 @@ struct ast_ignorepat *ast_walk_context_ignorepats(struct ast_context *con,
 	struct ast_ignorepat *ip);
 struct ast_sw *ast_walk_context_switches(struct ast_context *con, struct ast_sw *sw);
 
+extern char *pbx_builtin_getvar_helper(struct ast_channel *chan, char *name);
+extern void pbx_builtin_setvar_helper(struct ast_channel *chan, char *name, char *value);
+extern void pbx_builtin_clear_globals(void);
+
 #if defined(__cplusplus) || defined(c_plusplus)
 }
 #endif
diff --git a/include/asterisk/rtp.h b/include/asterisk/rtp.h
index 8b21767f37..8137eb38d1 100755
--- a/include/asterisk/rtp.h
+++ b/include/asterisk/rtp.h
@@ -44,6 +44,10 @@ void ast_rtp_set_data(struct ast_rtp *rtp, void *data);
 
 int ast_rtp_write(struct ast_rtp *rtp, struct ast_frame *f);
 
+struct ast_frame *ast_rtp_read(struct ast_rtp *rtp);
+
+int ast_rtp_fd(struct ast_rtp *rtp);
+
 int ast_rtp_senddigit(struct ast_rtp *rtp, char digit);
 
 int ast_rtp_settos(struct ast_rtp *rtp, int tos);
diff --git a/pbx.c b/pbx.c
index cd6389f8ac..59cb83bad8 100755
--- a/pbx.c
+++ b/pbx.c
@@ -145,10 +145,12 @@ static int pbx_builtin_ringing(struct ast_channel *, void *);
 static int pbx_builtin_congestion(struct ast_channel *, void *);
 static int pbx_builtin_busy(struct ast_channel *, void *);
 static int pbx_builtin_setvar(struct ast_channel *, void *);
+static int pbx_builtin_noop(struct ast_channel *, void *);
 static int pbx_builtin_gotoif(struct ast_channel *, void *);
 void pbx_builtin_setvar_helper(struct ast_channel *chan, char *name, char *value);
 char *pbx_builtin_getvar_helper(struct ast_channel *chan, char *name);
 
+static struct varshead globals = AST_LIST_HEAD_INITIALIZER(varshead);
 
 static struct pbx_builtin {
 	char name[AST_MAX_APP];
@@ -261,6 +263,10 @@ static struct pbx_builtin {
 "Set variable to value",
 "  Setvar(#n=value): Sets variable n to value" },
 
+	{ "NoOp", pbx_builtin_noop,
+"No operation",
+"  NoOp(): No-operation; Does nothing." },
+
 	{ "GotoIf", pbx_builtin_gotoif,
 "Conditional goto",
 "  GotoIf(Condition?label1:label2): Go to label 1 if condition is\n"
@@ -417,47 +423,83 @@ static void pbx_destroy(struct ast_pbx *p)
 	free(p);
 }
 
+#define EXTENSION_MATCH_CORE(data,pattern,match) {\
+	/* All patterns begin with _ */\
+	if (pattern[0] != '_') \
+		return 0;\
+	/* Start optimistic */\
+	match=1;\
+	pattern++;\
+	while(match && *data && *pattern && (*pattern != '/')) {\
+		switch(toupper(*pattern)) {\
+		case '[': \
+		{\
+			int i,border=0;\
+			char *where;\
+			match=0;\
+			pattern++;\
+			where=strchr(pattern,']');\
+			if (where)\
+				border=(int)(where-pattern);\
+			if (!where || border > strlen(pattern)) {\
+				ast_log(LOG_WARNING, "Wrong usage of [] in the extension\n");\
+				return match;\
+			}\
+			for (i=0; i<border; i++) {\
+				int res=0;\
+				if (i+2<border)\
+					if (pattern[i+1]=='-') {\
+						if (*data >= pattern[i] && *data <= pattern[i+2]) {\
+							res=1;\
+						} else {\
+							i+=2;\
+							continue;\
+						}\
+					}\
+				if (res==1 || *data==pattern[i]) {\
+					match = 1;\
+					break;\
+				}\
+			}\
+			pattern+=border;\
+			break;\
+		}\
+		case 'N':\
+			if ((*data < '2') || (*data > '9'))\
+				match=0;\
+			break;\
+		case 'X':\
+			if ((*data < '0') || (*data > '9'))\
+				match = 0;\
+			break;\
+		case 'Z':\
+			if ((*data < '1') || (*data > '9'))\
+				match = 0;\
+			break;\
+		case '.':\
+			/* Must match */\
+			return 1;\
+		case ' ':\
+		case '-':\
+			/* Ignore these characters */\
+			data--;\
+			break;\
+		default:\
+			if (*data != *pattern)\
+				match =0;\
+		}\
+		data++;\
+		pattern++;\
+	}\
+}
+
 int ast_extension_match(char *pattern, char *data)
 {
 	int match;
 	/* If they're the same return */
 	if (!strcasecmp(pattern, data))
 		return 1;
-	/* All patterns begin with _ */
-	if (pattern[0] != '_') 
-		return 0;
-	/* Start optimistic */
-	match=1;
-	pattern++;
-	while(match && *data && *pattern && (*pattern != '/')) {
-		switch(toupper(*pattern)) {
-		case 'N':
-			if ((*data < '2') || (*data > '9'))
-				match=0;
-			break;
-		case 'X':
-			if ((*data < '0') || (*data > '9'))
-				match = 0;
-			break;
-		case 'Z':
-			if ((*data < '1') || (*data > '9'))
-				match = 0;
-			break;
-		case '.':
-			/* Must match */
-			return 1;
-		case ' ':
-		case '-':
-			/* Ignore these characters */
-			data--;
-			break;
-		default:
-			if (*data != *pattern)
-				match =0;
-		}
-		data++;
-		pattern++;
-	}
+	EXTENSION_MATCH_CORE(data,pattern,match);
 	/* Must be at the end of both */
 	if (*data || (*pattern && (*pattern != '/')))
 		match = 0;
@@ -476,41 +518,7 @@ static int extension_close(char *pattern, char *data, int needmore)
 		(!needmore || (strlen(pattern) > strlen(data)))) {
 		return 1;
 	}
-	/* All patterns begin with _ */
-	if (pattern[0] != '_') 
-		return 0;
-	/* Start optimistic */
-	match=1;
-	pattern++;
-	while(match && *data && *pattern && (*pattern != '/')) {
-		switch(toupper(*pattern)) {
-		case 'N':
-			if ((*data < '2') || (*data > '9'))
-				match=0;
-			break;
-		case 'X':
-			if ((*data < '0') || (*data > '9'))
-				match = 0;
-			break;
-		case 'Z':
-			if ((*data < '1') || (*data > '9'))
-				match = 0;
-			break;
-		case '.':
-			/* Must match instantly */
-			return 1;
-		case ' ':
-		case '-':
-			/* Ignore these characters */
-			data--;
-			break;
-		default:
-			if (*data != *pattern)
-				match =0;
-		}
-		data++;
-		pattern++;
-	}
+	EXTENSION_MATCH_CORE(data,pattern,match);
 	/* If there's more or we don't care about more, return non-zero, otlherwise it's a miss */
 	if (!needmore || *pattern) {
 		return match;
@@ -665,7 +673,7 @@ static void *pbx_substitute_variables(struct ast_channel *c, struct ast_exten *e
 	char *cp1,*cp3,*cp4,*cp5;
 	void *cp2;
 	char c1,c2;
-	int m,mve,origlen,quoted,dolsign,docopy;
+	int m,mve,origlen,quoted,dolsign,docopy,offset;
 	struct ast_var_t *variables;
 	struct varshead *headp;
 	char pri[80];
@@ -767,6 +775,13 @@ static void *pbx_substitute_variables(struct ast_channel *c, struct ast_exten *e
 					} else if (!strcmp(cp3, "EXTEN")) {
 						cp4 = c->exten;
 						break;
+					} else if (!strncmp(cp3, "EXTEN-", strlen("EXTEN-")) && 
+						(sscanf(cp3 + strlen("EXTEN-"), "%d", &offset) == 1)) {
+						if (offset < 0)
+							offset=0;
+						if (offset > strlen(c->exten))
+							offset = strlen(c->exten);
+						cp4 = c->exten + offset;
 					} else if (!strcmp(cp3, "RDNIS")) {
 						cp4 = c->rdnis;
 						if (!cp4)
@@ -782,12 +797,22 @@ static void *pbx_substitute_variables(struct ast_channel *c, struct ast_exten *e
 					} else {
 		        		AST_LIST_TRAVERSE(headp,variables,entries) {
 //		        			ast_log(LOG_WARNING,"Comparing variable '%s' with '%s'\n",cp3,ast_var_name(variables));
-						if (strncasecmp(ast_var_name(variables),cp3,m)==0) {
-							cp4=ast_var_value(variables);
-							break;
+							if (strncasecmp(ast_var_name(variables),cp3,m)==0) {
+								cp4=ast_var_value(variables);
+								break;
+							}
+						}
+						if (!cp4) {
+							/* Try globals */
+			        		AST_LIST_TRAVERSE(&globals,variables,entries) {
+	//		        			ast_log(LOG_WARNING,"Comparing variable '%s' with '%s'\n",cp3,ast_var_name(variables));
+								if (strncasecmp(ast_var_name(variables),cp3,m)==0) {
+									cp4=ast_var_value(variables);
+									break;
+								}
+							}
 						}
 					}
-				}
 	        		free(cp3);
 	        		break;
 	        	default :
@@ -811,12 +836,13 @@ static void *pbx_substitute_variables(struct ast_channel *c, struct ast_exten *e
 	        		if (cp4!=NULL) {
 		        		cp2=realloc(cp2,origlen+strlen(cp4)+1);
 		        		strncat((char *)cp2,cp4,strlen(cp4));
+					origlen += strlen(cp4);
 		        	} else {
 		        		ast_log(LOG_WARNING,"mve!=0 and cp4=NULL, something gone astray\n");
 		        	}
 	        	}
 	        }
-	                
+	              cp4 = NULL;
 	} while (*cp1++!='\0');
 	
 	/* Second stage, expression evaluation */
@@ -2764,6 +2790,7 @@ int ast_async_goto(struct ast_channel *chan, char *context, char *exten, int pri
 		struct ast_frame *f;
 		tmpchan = ast_channel_alloc(0);
 		if (tmpchan) {
+			ast_setstate(tmpchan, chan->_state);
 			snprintf(tmpchan->name, sizeof(tmpchan->name), "AsyncGoto/%s", chan->name);
 			/* Make formats okay */
 			tmpchan->readformat = chan->readformat;
@@ -2826,7 +2853,8 @@ static void ext_strncpy(char *dst, char *src, int len)
 	while(*src && (count < len - 1)) {
 		switch(*src) {
 		case ' ':
-		case '-':
+//otherwise exten => [a-b],1,... doesn't work
+//		case '-':
 			/* Ignore */
 			break;
 		default:
@@ -3485,21 +3513,35 @@ char *pbx_builtin_getvar_helper(struct ast_channel *chan, char *name) {
 	struct ast_var_t *variables;
 	struct varshead *headp;
 
-	headp = &chan->varshead;
+    if (chan)
+        headp=&chan->varshead;
+	else
+		headp=&globals;
 
-	if (name)
+	if (name) {
 		AST_LIST_TRAVERSE(headp,variables,entries) {
 			if (!strcmp(name, ast_var_name(variables)))
 				return ast_var_value(variables);
 		}
+		if (headp != &globals) {
+			/* Check global variables if we haven't already */
+			headp = &globals;
+			AST_LIST_TRAVERSE(headp,variables,entries) {
+				if (!strcmp(name, ast_var_name(variables)))
+					return ast_var_value(variables);
+			}
+		}
+	}
 	return NULL;
 }
 
 void pbx_builtin_setvar_helper(struct ast_channel *chan, char *name, char *value) {
 	struct ast_var_t *newvariable;
         struct varshead *headp;
-        
+    if (chan)
         headp=&chan->varshead;
+	else
+		headp=&globals;
                 
 	AST_LIST_TRAVERSE (headp,newvariable,entries) {
 		if (strncasecmp(ast_var_name(newvariable),name,strlen(name))==0) {
@@ -3510,10 +3552,12 @@ void pbx_builtin_setvar_helper(struct ast_channel *chan, char *name, char *value
 		}
 	} 
 	
-	newvariable=ast_var_assign(name,value);	
-	AST_LIST_INSERT_HEAD(headp,newvariable,entries);
-	
-        return;
+	if (value) {
+		if ((option_verbose > 1) && (headp == &globals))
+			ast_verbose(VERBOSE_PREFIX_3 "Setting global variable '%s' to '%s'\n",name, value);
+		newvariable=ast_var_assign(name,value);	
+		AST_LIST_INSERT_HEAD(headp,newvariable,entries);
+	}
 }
 
 static int pbx_builtin_setvar(struct ast_channel *chan, void *data)
@@ -3536,6 +3580,22 @@ static int pbx_builtin_setvar(struct ast_channel *chan, void *data)
         return(0);
 }
 
+static int pbx_builtin_noop(struct ast_channel *chan, void *data)
+{
+	return 0;
+}
+
+
+void pbx_builtin_clear_globals(void)
+{
+	struct ast_var_t *vardata;
+	while (!AST_LIST_EMPTY(&globals)) {
+		vardata = AST_LIST_FIRST(&globals);
+		AST_LIST_REMOVE_HEAD(&globals, entries);
+		ast_var_delete(vardata);
+	}
+}
+
 static int pbx_checkcondition(char *condition) {
 	char *s;
 	int ret;
@@ -3552,7 +3612,6 @@ static int pbx_checkcondition(char *condition) {
 	return(ret);
 }
 
-
 static int pbx_builtin_gotoif(struct ast_channel *chan, void *data)
 {
 	char *condition,*branch1,*branch2,*branch;
diff --git a/pbx/.cvsignore b/pbx/.cvsignore
new file mode 100755
index 0000000000..053dfa8f1b
--- /dev/null
+++ b/pbx/.cvsignore
@@ -0,0 +1 @@
+pbx_kdeconsole.moc
diff --git a/pbx/pbx_config.c b/pbx/pbx_config.c
index b37a98f629..56de6ed26d 100755
--- a/pbx/pbx_config.c
+++ b/pbx/pbx_config.c
@@ -1059,6 +1059,7 @@ static int handle_context_add_extension(int fd, int argc, char *argv[])
 	char *whole_exten;
 	char *exten, *prior;
 	char *cidmatch, *app, *app_data;
+	char *start, *end;
 
 	/* check for arguments at first */
 	if (argc != 5 && argc != 6) return RESULT_SHOWUSAGE;
@@ -1075,7 +1076,14 @@ static int handle_context_add_extension(int fd, int argc, char *argv[])
 	}
 	prior       = strsep(&whole_exten,",");
 	app         = strsep(&whole_exten,",");
-	app_data    = whole_exten;
+	if ((start = strchr(app, '(')) && (end = strrchr(app, ')'))) {
+		*start = *end = '\0';
+		app_data = start + 1;
+		for (start = app_data; *start; start++)
+			if (*start == ',')
+				*start = '|';
+	} else
+		app_data    = whole_exten;
 
 	if (!exten || !prior || !app || !app_data) return RESULT_SHOWUSAGE;
 
@@ -1466,6 +1474,7 @@ static int pbx_load_module(void)
 	struct ast_variable *v;
 	char *cxt, *ext, *pri, *appl, *data, *tc, *cidmatch;
 	struct ast_context *con;
+	char *start, *end;
 
 	cfg = ast_load(config);
 	if (cfg) {
@@ -1474,10 +1483,15 @@ static int pbx_load_module(void)
 			"static"));
 		write_protect_config = ast_true(ast_variable_retrieve(cfg, "general",
 			"writeprotect"));
+		v = ast_variable_browse(cfg, "globals");
+		while(v) {
+			pbx_builtin_setvar_helper(NULL, v->name, v->value);
+			v = v->next;
+		}
 		cxt = ast_category_browse(cfg, NULL);
 		while(cxt) {
 			/* All categories but "general" are considered contexts */
-			if (!strcasecmp(cxt, "general")) {
+			if (!strcasecmp(cxt, "general") || !strcasecmp(cxt, "globals")) {
 				cxt = ast_category_browse(cfg, cxt);
 				continue;
 			}
@@ -1495,10 +1509,18 @@ static int pbx_load_module(void)
 							pri = strsep(&stringp, ",");
 							if (!pri)
 								pri="";
-							appl = strsep(&stringp, ",");
+							appl = stringp;
+							if (!(start = strchr(appl, '(')))
+								appl = strsep(&stringp, ",");
 							if (!appl)
 								appl="";
-							if (stringp!=NULL && *stringp=='"') {
+							if (start && (end = strrchr(appl, ')'))) {
+								*start = *end = '\0';
+								data = start + 1;
+								for (start = data; *start; start++)
+									if (*start == ',')
+										*start = '|';
+							} else if (stringp!=NULL && *stringp=='"') {
 								stringp++;
 								data = strsep(&stringp, "\"");
 								stringp++;
@@ -1566,6 +1588,7 @@ int load_module(void)
 int reload(void)
 {
 	ast_context_destroy(NULL, registrar);
+	pbx_builtin_clear_globals();
 	pbx_load_module();
 	return 0;
 }
diff --git a/rtp.c b/rtp.c
index 2a015b6e4a..21bee69801 100755
--- a/rtp.c
+++ b/rtp.c
@@ -61,6 +61,10 @@ struct ast_rtp {
 	ast_rtp_callback callback;
 };
 
+int ast_rtp_fd(struct ast_rtp *rtp)
+{
+	return rtp->s;
+}
 
 static int g723_len(unsigned char buf)
 {
@@ -106,7 +110,7 @@ void ast_rtp_set_callback(struct ast_rtp *rtp, ast_rtp_callback callback)
 	rtp->callback = callback;
 }
 
-static void send_dtmf(struct ast_rtp *rtp)
+static struct ast_frame *send_dtmf(struct ast_rtp *rtp)
 {
 	printf("Sending dtmf: %d (%c)\n", rtp->resp, rtp->resp);
 	rtp->f.frametype = AST_FRAME_DTMF;
@@ -116,15 +120,15 @@ static void send_dtmf(struct ast_rtp *rtp)
 	rtp->f.mallocd = 0;
 	rtp->f.src = "RTP";
 	rtp->resp = 0;
-	if (rtp->callback)
-		rtp->callback(rtp, &rtp->f, rtp->data);
+	return &rtp->f;
 	
 }
 
-static void process_rfc2833(struct ast_rtp *rtp, unsigned char *data, int len)
+static struct ast_frame *process_rfc2833(struct ast_rtp *rtp, unsigned char *data, int len)
 {
 	unsigned int event;
 	char resp = 0;
+	struct ast_frame *f = NULL;
 	event = ntohl(*((unsigned int *)(data)));
 	event >>= 24;
 #if 0
@@ -140,16 +144,17 @@ static void process_rfc2833(struct ast_rtp *rtp, unsigned char *data, int len)
 		resp = 'A' + (event - 12);
 	}
 	if (rtp->resp && (rtp->resp != resp)) {
-		send_dtmf(rtp);
+		f = send_dtmf(rtp);
 	}
 	rtp->resp = resp;
 	rtp->dtmfcount = dtmftimeout;
+	return f;
 }
 
-static void process_type121(struct ast_rtp *rtp, unsigned char *data, int len)
+static struct ast_frame *process_type121(struct ast_rtp *rtp, unsigned char *data, int len)
 {
 	char resp = 0;
-	
+	struct ast_frame *f = NULL;
 	unsigned char b0,b1,b2,b3,b4,b5,b6,b7;
 	
 	b0=*(data+0);b1=*(data+1);b2=*(data+2);b3=*(data+3);
@@ -169,7 +174,7 @@ static void process_type121(struct ast_rtp *rtp, unsigned char *data, int len)
 				resp='A'+(b3-12);
 			}
 			rtp->resp=resp;
-			send_dtmf(rtp);
+			f = send_dtmf(rtp);
 		}
 	}
 	if (b2==3) {
@@ -178,11 +183,23 @@ static void process_type121(struct ast_rtp *rtp, unsigned char *data, int len)
 	if (b2==0) {
 //		printf("Stop(0) %d\n",b3);
 	}
+	return f;
 }
 
 static int rtpread(int *id, int fd, short events, void *cbdata)
 {
 	struct ast_rtp *rtp = cbdata;
+	struct ast_frame *f;
+	f = ast_rtp_read(rtp);
+	if (f) {
+		if (rtp->callback)
+			rtp->callback(rtp, f, rtp->data);
+	}
+	return 1;
+}
+
+struct ast_frame *ast_rtp_read(struct ast_rtp *rtp)
+{
 	int res;
 	struct sockaddr_in sin;
 	int len;
@@ -191,6 +208,7 @@ static int rtpread(int *id, int fd, short events, void *cbdata)
 	int hdrlen = 12;
 	unsigned int timestamp;
 	unsigned int *rtpheader;
+	static struct ast_frame *f, null_frame = { AST_FRAME_NULL, };
 	
 	len = sizeof(sin);
 	
@@ -202,11 +220,11 @@ static int rtpread(int *id, int fd, short events, void *cbdata)
 		ast_log(LOG_WARNING, "RTP Read error: %s\n", strerror(errno));
 		if (errno == EBADF)
 			CRASH;
-		return 1;
+		return &null_frame;
 	}
 	if (res < hdrlen) {
 		ast_log(LOG_WARNING, "RTP Read too short\n");
-		return 1;
+		return &null_frame;
 	}
 	/* Get fields */
 	seqno = ntohl(rtpheader[0]);
@@ -219,19 +237,23 @@ static int rtpread(int *id, int fd, short events, void *cbdata)
 	rtp->f.frametype = AST_FRAME_VOICE;
 	rtp->f.subclass = rtp2ast(payloadtype);
 	if (rtp->f.subclass < 0) {
+		f = NULL;
 		if (payloadtype == 101) {
 			/* It's special -- rfc2833 process it */
-			process_rfc2833(rtp, rtp->rawdata + AST_FRIENDLY_OFFSET + hdrlen, res - hdrlen);
+			f = process_rfc2833(rtp, rtp->rawdata + AST_FRIENDLY_OFFSET + hdrlen, res - hdrlen);
 		} else if (payloadtype == 121) {
 			/* CISCO proprietary DTMF bridge */
-			process_type121(rtp, rtp->rawdata + AST_FRIENDLY_OFFSET + hdrlen, res - hdrlen);
+			f = process_type121(rtp, rtp->rawdata + AST_FRIENDLY_OFFSET + hdrlen, res - hdrlen);
 		} else if (payloadtype == 100) {
 			/* CISCO's notso proprietary DTMF bridge */
-			process_rfc2833(rtp, rtp->rawdata + AST_FRIENDLY_OFFSET + hdrlen, res - hdrlen);
+			f = process_rfc2833(rtp, rtp->rawdata + AST_FRIENDLY_OFFSET + hdrlen, res - hdrlen);
 		} else {
 			ast_log(LOG_NOTICE, "Unknown RTP codec %d received\n", payloadtype);
 		}
-		return 1;
+		if (f)
+			return f;
+		else
+			return &null_frame;
 	}
 
 	if (!rtp->lastrxts)
@@ -253,10 +275,8 @@ static int rtpread(int *id, int fd, short events, void *cbdata)
 
 	/* Send any pending DTMF */
 	if (rtp->resp && !rtp->dtmfcount) {
-		send_dtmf(rtp);
-		/* Setup the voice frame again */
-		rtp->f.frametype = AST_FRAME_VOICE;
-		rtp->f.subclass = rtp2ast(payloadtype);
+		printf("Sending pending DTMF\n");
+		return send_dtmf(rtp);
 	}
 	rtp->f.mallocd = 0;
 	rtp->f.datalen = res - hdrlen;
@@ -287,9 +307,7 @@ static int rtpread(int *id, int fd, short events, void *cbdata)
 		break;
 	}
 	rtp->f.src = "RTP";
-	if (rtp->callback)
-		rtp->callback(rtp, &rtp->f, rtp->data);
-	return 1;
+	return &rtp->f;
 }
 
 static struct {
@@ -370,9 +388,12 @@ struct ast_rtp *ast_rtp_new(struct sched_context *sched, struct io_context *io)
 			return NULL;
 		}
 	}
-	rtp->io = io;
-	rtp->sched = sched;
-	rtp->ioid = ast_io_add(rtp->io, rtp->s, rtpread, AST_IO_IN, rtp);
+	if (io && sched) {
+		/* Operate this one in a callback mode */
+		rtp->sched = sched;
+		rtp->io = io;
+		rtp->ioid = ast_io_add(rtp->io, rtp->s, rtpread, AST_IO_IN, rtp);
+	}
 	return rtp;
 }
 
-- 
GitLab