[asterisk-commits] murf: branch murf/sched-rbtree r106172 - in /team/murf/sched-rbtree: ./ apps/...

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Wed Mar 5 13:43:50 CST 2008


Author: murf
Date: Wed Mar  5 13:43:49 2008
New Revision: 106172

URL: http://svn.digium.com/view/asterisk?view=rev&rev=106172
Log:
Merged revisions 106003-106170 via svnmerge from 
https://origsvn.digium.com/svn/asterisk/trunk

................
  r106036 | tilghman | 2008-03-05 08:23:32 -0700 (Wed, 05 Mar 2008) | 15 lines
  
  Merged revisions 106015 via svnmerge from 
  https://origsvn.digium.com/svn/asterisk/branches/1.4
  
  ........
  r106015 | tilghman | 2008-03-05 09:17:16 -0600 (Wed, 05 Mar 2008) | 7 lines
  
  Correctly initialize retransid in SIP, and ensure that the warning when failing to delete a schedule entry can actually hit the log.
  (closes issue #12140)
   Reported by: slavon
   Patches: 
         sch2.patch uploaded by slavon (license 288)
  (Patch slightly modified by me)
  
  ........
................
  r106040 | kpfleming | 2008-03-05 08:40:40 -0700 (Wed, 05 Mar 2008) | 15 lines
  
  Merged revisions 106038 via svnmerge from 
  https://origsvn.digium.com/svn/asterisk/branches/1.4
  
  ........
  r106038 | kpfleming | 2008-03-05 09:32:35 -0600 (Wed, 05 Mar 2008) | 7 lines
  
  when a PRI call must be moved to a different B channel at the request of the other endpoint, ensure that any DSP active on the original channel is moved to the new one
  
  (closes issue #11917)
  Reported by: mavetju
  Tested by: mavetju
  
  
  ........
................
  r106072 | tilghman | 2008-03-05 09:23:44 -0700 (Wed, 05 Mar 2008) | 7 lines
  
  Create a centralized configuration option for silencethreshold
  (closes issue #11236)
   Reported by: philipps
   Patches: 
         20080218__bug11236.diff.txt uploaded by Corydon76 (license 14)
   Tested by: philipps
................
  r106110 | file | 2008-03-05 09:39:22 -0700 (Wed, 05 Mar 2008) | 2 lines
  
  Fix code up to what it was meant to be.
................
  r106139 | tilghman | 2008-03-05 10:40:42 -0700 (Wed, 05 Mar 2008) | 3 lines
  
  Should check these values for non-NULL before scanning.
  (Closes issue #12147)
................

Added:
    team/murf/sched-rbtree/configs/dsp.conf.sample
      - copied unchanged from r106139, trunk/configs/dsp.conf.sample
Modified:
    team/murf/sched-rbtree/   (props changed)
    team/murf/sched-rbtree/CHANGES
    team/murf/sched-rbtree/UPGRADE.txt
    team/murf/sched-rbtree/apps/app_amd.c
    team/murf/sched-rbtree/apps/app_dial.c
    team/murf/sched-rbtree/apps/app_followme.c
    team/murf/sched-rbtree/apps/app_meetme.c
    team/murf/sched-rbtree/apps/app_minivm.c
    team/murf/sched-rbtree/apps/app_record.c
    team/murf/sched-rbtree/apps/app_talkdetect.c
    team/murf/sched-rbtree/apps/app_voicemail.c
    team/murf/sched-rbtree/apps/app_waitforsilence.c
    team/murf/sched-rbtree/channels/chan_sip.c
    team/murf/sched-rbtree/channels/chan_zap.c
    team/murf/sched-rbtree/include/asterisk/dsp.h
    team/murf/sched-rbtree/include/asterisk/sched.h
    team/murf/sched-rbtree/main/app.c
    team/murf/sched-rbtree/main/asterisk.c
    team/murf/sched-rbtree/main/dsp.c
    team/murf/sched-rbtree/main/loader.c
    team/murf/sched-rbtree/res/res_agi.c

Propchange: team/murf/sched-rbtree/
------------------------------------------------------------------------------
Binary property 'branch-1.4-merged' - no diff available.

Propchange: team/murf/sched-rbtree/
------------------------------------------------------------------------------
--- svnmerge-integrated (original)
+++ svnmerge-integrated Wed Mar  5 13:43:49 2008
@@ -1,1 +1,1 @@
-/trunk:1-106002
+/trunk:1-106170

Modified: team/murf/sched-rbtree/CHANGES
URL: http://svn.digium.com/view/asterisk/team/murf/sched-rbtree/CHANGES?view=diff&rev=106172&r1=106171&r2=106172
==============================================================================
--- team/murf/sched-rbtree/CHANGES (original)
+++ team/murf/sched-rbtree/CHANGES Wed Mar  5 13:43:49 2008
@@ -175,7 +175,7 @@
   * Proper codec support in chan_skinny.
   * Added settings for IP and Ethernet QoS requests
 
-
+MGCP changes
 ------------
   * Added separate settings for media QoS in mgcp.conf
 
@@ -387,6 +387,8 @@
   * The ChannelRedirect application no longer exits the dialplan if the given channel
      does not exist. It will now set the CHANNELREDIRECT_STATUS variable to SUCCESS upon success
      or NOCHANNEL if the given channel was not found.
+  * The silencethreshold setting that was previously configurable in multiple
+     applications is now settable globally via dsp.conf.
 
 Music On Hold Changes
 ---------------------

Modified: team/murf/sched-rbtree/UPGRADE.txt
URL: http://svn.digium.com/view/asterisk/team/murf/sched-rbtree/UPGRADE.txt?view=diff&rev=106172&r1=106171&r2=106172
==============================================================================
--- team/murf/sched-rbtree/UPGRADE.txt (original)
+++ team/murf/sched-rbtree/UPGRADE.txt Wed Mar  5 13:43:49 2008
@@ -55,6 +55,9 @@
 
 * The concise versions of various CLI commands are now deprecated. We recommend
   using the manager interface (AMI) for application integration with Asterisk.
+
+* The silencethreshold used for various applications is now settable via a
+  centralized config option in dsp.conf.
 
 Voicemail:
 

Modified: team/murf/sched-rbtree/apps/app_amd.c
URL: http://svn.digium.com/view/asterisk/team/murf/sched-rbtree/apps/app_amd.c?view=diff&rev=106172&r1=106171&r2=106172
==============================================================================
--- team/murf/sched-rbtree/apps/app_amd.c (original)
+++ team/murf/sched-rbtree/apps/app_amd.c Wed Mar  5 13:43:49 2008
@@ -371,6 +371,8 @@
 	struct ast_variable *var = NULL;
 	struct ast_flags config_flags = { reload ? CONFIG_FLAG_FILEUNCHANGED : 0 };
 
+	dfltSilenceThreshold = ast_dsp_get_threshold_from_settings(THRESHOLD_SILENCE);
+
 	if (!(cfg = ast_config_load("amd.conf", config_flags))) {
 		ast_log(LOG_ERROR, "Configuration file amd.conf missing.\n");
 		return -1;

Modified: team/murf/sched-rbtree/apps/app_dial.c
URL: http://svn.digium.com/view/asterisk/team/murf/sched-rbtree/apps/app_dial.c?view=diff&rev=106172&r1=106171&r2=106172
==============================================================================
--- team/murf/sched-rbtree/apps/app_dial.c (original)
+++ team/murf/sched-rbtree/apps/app_dial.c Wed Mar  5 13:43:49 2008
@@ -60,6 +60,7 @@
 #include "asterisk/privacy.h"
 #include "asterisk/stringfields.h"
 #include "asterisk/global_datastores.h"
+#include "asterisk/dsp.h"
 
 static char *app = "Dial";
 
@@ -1115,6 +1116,7 @@
 	char callerid[60];
 	int res;
 	char *l;
+	int silencethreshold;
 
 	if (!ast_strlen_zero(chan->cid.cid_num)) {
 		l = ast_strdupa(chan->cid.cid_num);
@@ -1188,8 +1190,9 @@
 			   "At the tone, please say your name:"
 
 			*/
+			silencethreshold = ast_dsp_get_threshold_from_settings(THRESHOLD_SILENCE);
 			ast_answer(chan);
-			res = ast_play_and_record(chan, "priv-recordintro", pa->privintro, 4, "gsm", &duration, 128, 2000, 0);  /* NOTE: I've reduced the total time to 4 sec */
+			res = ast_play_and_record(chan, "priv-recordintro", pa->privintro, 4, "gsm", &duration, silencethreshold, 2000, 0);  /* NOTE: I've reduced the total time to 4 sec */
 									/* don't think we'll need a lock removed, we took care of
 									   conflicts by naming the pa.privintro file */
 			if (res == -1) {

Modified: team/murf/sched-rbtree/apps/app_followme.c
URL: http://svn.digium.com/view/asterisk/team/murf/sched-rbtree/apps/app_followme.c?view=diff&rev=106172&r1=106171&r2=106172
==============================================================================
--- team/murf/sched-rbtree/apps/app_followme.c (original)
+++ team/murf/sched-rbtree/apps/app_followme.c Wed Mar  5 13:43:49 2008
@@ -55,6 +55,7 @@
 #include "asterisk/utils.h"
 #include "asterisk/causes.h"
 #include "asterisk/astdb.h"
+#include "asterisk/dsp.h"
 #include "asterisk/app.h"
 
 static char *app = "FollowMe";
@@ -130,7 +131,7 @@
 	int ynidx; 
 	long digts;
 	int cleared;
-	AST_LIST_ENTRY(findme_user) entry;	
+	AST_LIST_ENTRY(findme_user) entry;
 };
 
 enum {
@@ -183,7 +184,6 @@
 		/* Free the whitelisted number */
 		ast_free(prev);
 	AST_LIST_HEAD_INIT_NOLOCK(&f->wlnumbers);
-	
 }
 
 
@@ -258,7 +258,6 @@
 {
 	struct number *cur;
 	char *tmp;
-	
 
 	if (!(cur = ast_calloc(1, sizeof(*cur))))
 		return NULL;
@@ -284,7 +283,7 @@
 	char numberstr[90];
 	int timeout;
 	char *timeoutstr;
-	int numorder;	
+	int numorder;
 	const char *takecallstr;
 	const char *declinecallstr;
 	const char *tmpstr;
@@ -307,7 +306,7 @@
 	}
 
 	featuredigittostr = ast_variable_retrieve(cfg, "general", "featuredigittimeout");
-	
+
 	if (!ast_strlen_zero(featuredigittostr)) {
 		if (!sscanf(featuredigittostr, "%d", &featuredigittimeout))
 			featuredigittimeout = 5000;
@@ -316,7 +315,7 @@
 	takecallstr = ast_variable_retrieve(cfg, "general", "takecall");
 	if (!ast_strlen_zero(takecallstr))
 		ast_copy_string(takecall, takecallstr, sizeof(takecall));
-	
+
 	declinecallstr = ast_variable_retrieve(cfg, "general", "declinecall");
 	if (!ast_strlen_zero(declinecallstr))
 		ast_copy_string(nextindp, declinecallstr, sizeof(nextindp));
@@ -369,7 +368,7 @@
 		/* Totally fail if we fail to find/create an entry */
 		if (!f)
 			continue;
-		
+
 		if (!new)
 			ast_mutex_lock(&f->lock);
 		/* Re-initialize the profile */
@@ -399,8 +398,8 @@
 					timeout = 25;
 					numorder = 0;
 				}
-				
-				if (!numorder) {	
+
+				if (!numorder) {
 					idx = 1;
 					AST_LIST_TRAVERSE(&f->numbers, nm, entry) 
 						idx++;
@@ -414,7 +413,7 @@
 			}
 			var = var->next;
 		} /* End while(var) loop */
-		
+
 		if (!new) 
 			ast_mutex_unlock(&f->lock);
 		else
@@ -431,7 +430,7 @@
 static void clear_caller(struct findme_user *tmpuser)
 {
 	struct ast_channel *outbound;
-	
+
 	if (tmpuser && tmpuser->ochan && tmpuser->state >= 0) {
 		outbound = tmpuser->ochan;
 		if (!outbound->cdr) {
@@ -460,12 +459,11 @@
 static void clear_calling_tree(struct findme_user_listptr *findme_user_list) 
 {
 	struct findme_user *tmpuser;
-	
+
 	AST_LIST_TRAVERSE(findme_user_list, tmpuser, entry) {
 		clear_caller(tmpuser);
 		tmpuser->cleared = 1;
 	}
-	
 }
 
 
@@ -489,29 +487,29 @@
 	/* ------------ wait_for_winner_channel start --------------- */ 
 
 	callfromname = ast_strdupa(tpargs->callfromprompt);
-	pressbuttonname = ast_strdupa(tpargs->optionsprompt);	
+	pressbuttonname = ast_strdupa(tpargs->optionsprompt);
 
 	if (AST_LIST_EMPTY(findme_user_list)) {
 		ast_verb(3, "couldn't reach at this number.\n");
 		return NULL;
 	}
-	
+
 	if (!caller) {
 		ast_verb(3, "Original caller hungup. Cleanup.\n");
 		clear_calling_tree(findme_user_list);
 		return NULL;
 	}
-	
+
 	totalwait = nm->timeout * 1000;
-	
+
 	while (!ctstatus) {
 		to = 1000;
 		pos = 1; 
 		livechannels = 0;
 		watchers[0] = caller;
-		
-		dg = 0;	
-		winner = NULL;	
+
+		dg = 0;
+		winner = NULL;
 		AST_LIST_TRAVERSE(findme_user_list, tmpuser, entry) {
 			if (tmpuser->state >= 0 && tmpuser->ochan) {
 				if (tmpuser->state == 3) 
@@ -526,7 +524,7 @@
 						} else {
 							ast_log(LOG_WARNING, "Unable to playback %s.\n", callfromname);
 							return NULL;
-						}							
+						}
 					} else {
 						tmpuser->state = 2;
 						tmpuser->digts = 0;
@@ -566,7 +564,6 @@
 							tmpuser->ynidx = 0;
 							if (!ast_streamfile(tmpuser->ochan, pressbuttonname, tmpuser->ochan->language)) {
 								tmpuser->state = 3;
-								
 							} else {
 								return NULL;
 							} 
@@ -580,7 +577,7 @@
 				livechannels++;
 			}
 		}
-		
+
 		tmpto = to;
 		if (to < 0) {
 			to = 1000;
@@ -590,7 +587,7 @@
 		winner = ast_waitfor_n(watchers, pos, &to);
 		tmpto -= to;
 		totalwait -= tmpto;
-		wtd = to;	
+		wtd = to;
 		if (totalwait <= 0) {
 			ast_verb(3, "We've hit our timeout for this step. Drop everyone and move on to the next one. %ld\n", totalwait);
 			clear_calling_tree(findme_user_list);
@@ -631,8 +628,8 @@
 									ast_log(LOG_WARNING, "Unable to playback %s.\n", callfromname);
 									ast_frfree(f);
 									return NULL;
-								}				
-							} else {			
+								}
+							} else {
 								tmpuser->state = 2;
 								if (!ast_streamfile(tmpuser->ochan, tpargs->norecordingprompt, tmpuser->ochan->language))
 									ast_sched_runq(tmpuser->ochan->sched);
@@ -693,18 +690,18 @@
 						if (!strcmp(tmpuser->yn, tpargs->takecall)) {
 							ast_debug(1, "Match to take the call!\n");
 							ast_frfree(f);
-							return tmpuser->ochan;	
+							return tmpuser->ochan;
 						}
 						if (!strcmp(tmpuser->yn, tpargs->nextindp)) {
 							ast_debug(1, "Next in dial plan step requested.\n");
 							*status = 1;
 							ast_frfree(f);
 							return NULL;
-						}	
-						
+						}
+
 					}
 				}
-				
+
 				ast_frfree(f);
 			} else {
 				if (winner) {
@@ -723,12 +720,12 @@
 						}
 					}
 				}
-			}					
-			
+			}
+
 		} else
 			ast_debug(1, "timed out waiting for action\n");
 	}
-	
+
 	/* --- WAIT FOR WINNER NUMBER END! -----------*/
 	return NULL;
 }
@@ -748,7 +745,7 @@
 	struct findme_user_listptr *findme_user_list;
 	int status;
 
-	findme_user_list = ast_calloc(1, sizeof(*findme_user_list));		
+	findme_user_list = ast_calloc(1, sizeof(*findme_user_list));
 	AST_LIST_HEAD_INIT_NOLOCK(findme_user_list);
 
 	/* We're going to figure out what the longest possible string of digits to collect is */
@@ -782,14 +779,14 @@
 				sprintf(dialarg, "%s", number);
 			else
 				sprintf(dialarg, "%s@%s", number, tpargs->context);
-					
+
 			tmpuser = ast_calloc(1, sizeof(*tmpuser));
 			if (!tmpuser) {
 				ast_log(LOG_WARNING, "Out of memory!\n");
 				ast_free(findme_user_list);
 				return;
 			}
-					
+
 			outbound = ast_request("Local", ast_best_codec(caller->nativeformats), dialarg, &dg);
 			if (outbound) {
 				ast_set_callerid(outbound, caller->cid.cid_num, caller->cid.cid_name, caller->cid.cid_num);
@@ -824,19 +821,17 @@
 							outbound = NULL;
 						}
 					}
-						
 				}
 			} else 
 				ast_log(LOG_WARNING, "Unable to allocate a channel for Local/%s cause: %s\n", dialarg, ast_cause2str(dg));
-					
+
 			number = rest;
 		} while (number);
-				
-		status = 0;	
+
+		status = 0;
 		if (!AST_LIST_EMPTY(findme_user_list))
 			winner = wait_for_winner(findme_user_list, nm, caller, tpargs->namerecloc, &status, tpargs);
-		
-					
+
 		while ((fmuser = AST_LIST_REMOVE_HEAD(findme_user_list, entry))) {
 			if (!fmuser->cleared && fmuser->ochan != winner)
 				clear_caller(fmuser);
@@ -845,21 +840,21 @@
 
 		fmuser = NULL;
 		tmpuser = NULL;
-		headuser = NULL;	
+		headuser = NULL;
 		if (winner)
 			break;
 
 		if (!caller) {
 			tpargs->status = 1;
 			ast_free(findme_user_list);
-			return;	
+			return;
 		}
 
 		idx++;
-		AST_LIST_TRAVERSE(&tpargs->cnumbers, nm, entry)
+		AST_LIST_TRAVERSE(&tpargs->cnumbers, nm, entry) {
 			if (nm->order == idx)
 				break;
-
+		}
 	}
 	ast_free(findme_user_list);
 	if (!winner) 
@@ -869,9 +864,7 @@
 		tpargs->outbound = winner;
 	}
 
-	
 	return;
-		
 }
 
 static int app_exec(struct ast_channel *chan, void *data)
@@ -887,7 +880,6 @@
 	struct ast_channel *caller;
 	struct ast_channel *outbound;
 	static char toast[80];
-	
 	AST_DECLARE_APP_ARGS(args,
 		AST_APP_ARG(followmeid);
 		AST_APP_ARG(options);
@@ -897,7 +889,7 @@
 		ast_log(LOG_WARNING, "%s requires an argument (followmeid)\n", app);
 		return -1;
 	}
-	
+
 	if (!(argstr = ast_strdupa((char *)data))) {
 		ast_log(LOG_ERROR, "Out of memory!\n");
 		return -1;
@@ -916,7 +908,7 @@
 			break;
 	}
 	AST_RWLIST_UNLOCK(&followmes);
-	
+
 	ast_debug(1, "New profile %s.\n", args.followmeid);
 
 	if (!f) {
@@ -927,7 +919,7 @@
 	/* XXX TODO: Reinsert the db check value to see whether or not follow-me is on or off */
 	if (args.options) 
 		ast_app_parse_options(followme_opts, &targs.followmeflags, NULL, args.options);
-	
+
 	/* Lock the profile lock and copy out everything we need to run with before unlocking it again */
 	ast_mutex_lock(&f->lock);
 	targs.mohclass = ast_strdupa(f->moh);
@@ -948,38 +940,38 @@
 		AST_LIST_INSERT_TAIL(&targs.cnumbers, newnm, entry);
 	}
 	ast_mutex_unlock(&f->lock);
-	
+
 	if (ast_test_flag(&targs.followmeflags, FOLLOWMEFLAG_STATUSMSG)) 
 		ast_stream_and_wait(chan, targs.statusprompt, "");
-	
+
 	snprintf(namerecloc,sizeof(namerecloc),"%s/followme.%s",ast_config_AST_SPOOL_DIR,chan->uniqueid);
 	duration = 5;
-	
+
 	if (ast_test_flag(&targs.followmeflags, FOLLOWMEFLAG_RECORDNAME)) 
-		if (ast_play_and_record(chan, "vm-rec-name", namerecloc, 5, "sln", &duration, 128, 0, NULL) < 0)
+		if (ast_play_and_record(chan, "vm-rec-name", namerecloc, 5, "sln", &duration, ast_dsp_get_threshold_from_settings(THRESHOLD_SILENCE), 0, NULL) < 0)
 			goto outrun;
-	
+
 	if (!ast_fileexists(namerecloc, NULL, chan->language))
-		ast_copy_string(namerecloc, "", sizeof(namerecloc));					
-	
+		ast_copy_string(namerecloc, "", sizeof(namerecloc));
+
 	if (ast_streamfile(chan, targs.plsholdprompt, chan->language))
 		goto outrun;
 	if (ast_waitstream(chan, "") < 0)
 		goto outrun;
 	ast_moh_start(chan, S_OR(targs.mohclass, NULL), NULL);
-	
+
 	targs.status = 0;
 	targs.chan = chan;
 	ast_copy_string(targs.namerecloc, namerecloc, sizeof(targs.namerecloc));
-	
-	findmeexec(&targs);		
-	
+
+	findmeexec(&targs);
+
 	while ((nm = AST_LIST_REMOVE_HEAD(&targs.cnumbers, entry)))
 		ast_free(nm);
-		
+
 	if (!ast_strlen_zero(namerecloc))
-		unlink(namerecloc);	
-	
+		unlink(namerecloc);
+
 	if (targs.status != 100) {
 		ast_moh_stop(chan);
 		if (ast_test_flag(&targs.followmeflags, FOLLOWMEFLAG_UNREACHABLEMSG)) 
@@ -989,12 +981,12 @@
 		caller = chan;
 		outbound = targs.outbound;
 		/* Bridge the two channels. */
-		
-		memset(&config,0,sizeof(struct ast_bridge_config));
+
+		memset(&config, 0, sizeof(config));
 		ast_set_flag(&(config.features_callee), AST_FEATURE_REDIRECT);
 		ast_set_flag(&(config.features_callee), AST_FEATURE_AUTOMON);
 		ast_set_flag(&(config.features_caller), AST_FEATURE_AUTOMON);
-		
+
 		ast_moh_stop(caller);
 		/* Be sure no generators are left on it */
 		ast_deactivate_generator(caller);
@@ -1006,7 +998,7 @@
 			goto outrun;
 		}
 		time(&answer_time);
-		res = ast_bridge_call(caller,outbound,&config);
+		res = ast_bridge_call(caller, outbound, &config);
 		time(&end_time);
 		snprintf(toast, sizeof(toast), "%ld", (long)(end_time - start_time));
 		pbx_builtin_setvar_helper(caller, "DIALEDTIME", toast);
@@ -1017,7 +1009,7 @@
 	}
 
 	outrun:
-	
+
 	return res;
 }
 
@@ -1051,7 +1043,7 @@
 {
 	reload_followme(1);
 
-	return 0;	
+	return 0;
 }
 
 AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_DEFAULT, "Find-Me/Follow-Me Application",

Modified: team/murf/sched-rbtree/apps/app_meetme.c
URL: http://svn.digium.com/view/asterisk/team/murf/sched-rbtree/apps/app_meetme.c?view=diff&rev=106172&r1=106171&r2=106172
==============================================================================
--- team/murf/sched-rbtree/apps/app_meetme.c (original)
+++ team/murf/sched-rbtree/apps/app_meetme.c Wed Mar  5 13:43:49 2008
@@ -1699,7 +1699,7 @@
 			 "%s/meetme/meetme-username-%s-%d", ast_config_AST_SPOOL_DIR,
 			 conf->confno, user->user_no);
 		if (confflags & CONFFLAG_INTROUSERNOREVIEW)
-			res = ast_play_and_record(chan, "vm-rec-name", user->namerecloc, 10, "sln", &duration, 128, 0, NULL);
+			res = ast_play_and_record(chan, "vm-rec-name", user->namerecloc, 10, "sln", &duration, ast_dsp_get_threshold_from_settings(THRESHOLD_SILENCE), 0, NULL);
 		else
 			res = ast_record_review(chan, "vm-rec-name", user->namerecloc, 10, "sln", &duration, NULL);
 		if (res == -1)

Modified: team/murf/sched-rbtree/apps/app_minivm.c
URL: http://svn.digium.com/view/asterisk/team/murf/sched-rbtree/apps/app_minivm.c?view=diff&rev=106172&r1=106171&r2=106172
==============================================================================
--- team/murf/sched-rbtree/apps/app_minivm.c (original)
+++ team/murf/sched-rbtree/apps/app_minivm.c Wed Mar  5 13:43:49 2008
@@ -2360,7 +2360,6 @@
 	/* First, set some default settings */
 	global_externnotify[0] = '\0';
 	global_logfile[0] = '\0';
-	global_silencethreshold = 256;
 	global_vmmaxmessage = 2000;
 	global_maxgreet = 2000;
 	global_vmminmessage = 0;
@@ -2374,6 +2373,8 @@
 	/* Reset statistics */
 	memset(&global_stats, 0, sizeof(global_stats));
 	global_stats.reset = ast_tvnow();
+
+	global_silencethreshold = ast_dsp_get_threshold_from_settings(THRESHOLD_SILENCE);
 
 	/* Make sure we could load configuration file */
 	if (!cfg) {
@@ -2640,7 +2641,7 @@
 	ast_cli(a->fd, "\n");
 	ast_cli(a->fd, "  Mail command (shell):               %s\n", global_mailcmd);
 	ast_cli(a->fd, "  Max silence:                        %d\n", global_maxsilence);
-	ast_cli(a->fd, "  Silence treshold:                   %d\n", global_silencethreshold);
+	ast_cli(a->fd, "  Silence threshold:                  %d\n", global_silencethreshold);
 	ast_cli(a->fd, "  Max message length (secs):          %d\n", global_vmmaxmessage);
 	ast_cli(a->fd, "  Min message length (secs):          %d\n", global_vmminmessage);
 	ast_cli(a->fd, "  Default format:                     %s\n", default_vmformat);

Modified: team/murf/sched-rbtree/apps/app_record.c
URL: http://svn.digium.com/view/asterisk/team/murf/sched-rbtree/apps/app_record.c?view=diff&rev=106172&r1=106171&r2=106172
==============================================================================
--- team/murf/sched-rbtree/apps/app_record.c (original)
+++ team/murf/sched-rbtree/apps/app_record.c Wed Mar  5 13:43:49 2008
@@ -243,7 +243,7 @@
 			ast_log(LOG_WARNING, "Unable to create silence detector :(\n");
 			return -1;
 		}
-		ast_dsp_set_threshold(sildet, 256);
+		ast_dsp_set_threshold(sildet, ast_dsp_get_threshold_from_settings(THRESHOLD_SILENCE));
 	} 
 
 	/* Create the directory if it does not exist. */

Modified: team/murf/sched-rbtree/apps/app_talkdetect.c
URL: http://svn.digium.com/view/asterisk/team/murf/sched-rbtree/apps/app_talkdetect.c?view=diff&rev=106172&r1=106171&r2=106172
==============================================================================
--- team/murf/sched-rbtree/apps/app_talkdetect.c (original)
+++ team/murf/sched-rbtree/apps/app_talkdetect.c Wed Mar  5 13:43:49 2008
@@ -83,11 +83,11 @@
 	tmp = ast_strdupa(data);
 	AST_STANDARD_APP_ARGS(args, tmp);
 
-	if ((sscanf(args.silence, "%d", &x) == 1) && (x > 0))
+	if (!ast_strlen_zero(args.silence) && (sscanf(args.silence, "%d", &x) == 1) && (x > 0))
 		sil = x;
-	if ((sscanf(args.min, "%d", &x) == 1) && (x > 0))
+	if (!ast_strlen_zero(args.min) && (sscanf(args.min, "%d", &x) == 1) && (x > 0))
 		min = x;
-	if ((sscanf(args.max, "%d", &x) == 1) && (x > 0))
+	if (!ast_strlen_zero(args.max) && (sscanf(args.max, "%d", &x) == 1) && (x > 0))
 		max = x;
 
 	ast_debug(1, "Preparing detect of '%s', sil=%d, min=%d, max=%d\n", args.filename, sil, min, max);

Modified: team/murf/sched-rbtree/apps/app_voicemail.c
URL: http://svn.digium.com/view/asterisk/team/murf/sched-rbtree/apps/app_voicemail.c?view=diff&rev=106172&r1=106171&r2=106172
==============================================================================
--- team/murf/sched-rbtree/apps/app_voicemail.c (original)
+++ team/murf/sched-rbtree/apps/app_voicemail.c Wed Mar  5 13:43:49 2008
@@ -8399,7 +8399,7 @@
 		}
 
 		/* Silence treshold */
-		silencethreshold = 256;
+		silencethreshold = ast_dsp_get_threshold_from_settings(THRESHOLD_SILENCE);
 		if ((val = ast_variable_retrieve(cfg, "general", "silencethreshold")))
 			silencethreshold = atoi(val);
 		

Modified: team/murf/sched-rbtree/apps/app_waitforsilence.c
URL: http://svn.digium.com/view/asterisk/team/murf/sched-rbtree/apps/app_waitforsilence.c?view=diff&rev=106172&r1=106171&r2=106172
==============================================================================
--- team/murf/sched-rbtree/apps/app_waitforsilence.c (original)
+++ team/murf/sched-rbtree/apps/app_waitforsilence.c Wed Mar  5 13:43:49 2008
@@ -29,6 +29,12 @@
  *
  * \author David C. Troy <dave at popvox.com>
  *
+ * \brief Wait For Noise
+ * The same as Wait For Silence but listenes noise on the chennel that is above \n
+ * the pre-configured silence threshold from dsp.conf
+ *
+ * \author Philipp Skadorov <skadorov at yahoo.com>
+ *
  * \ingroup applications
  */
 
@@ -42,9 +48,9 @@
 #include "asterisk/dsp.h"
 #include "asterisk/module.h"
 
-static char *app = "WaitForSilence";
-static char *synopsis = "Waits for a specified amount of silence";
-static char *descrip =
+static char *app_silence = "WaitForSilence";
+static char *synopsis_silence = "Waits for a specified amount of silence";
+static char *descrip_silence =
 "  WaitForSilence(silencerequired[,iterations][,timeout]):\n"
 "Wait for Silence: Waits for up to 'silencerequired' \n"
 "milliseconds of silence, 'iterations' times or once if omitted.\n"
@@ -68,14 +74,23 @@
 "SILENCE - if exited with silence detected\n"
 "TIMEOUT - if exited without silence detected after timeout\n";
 
-static int do_waiting(struct ast_channel *chan, int silencereqd, time_t waitstart, int timeout) {
+static char *app_noise = "WaitForNoise";
+static char *synopsis_noise = "Waits for a specified amount of noise";
+static char *descrip_noise =
+"WaitForNoise(noiserequired[,iterations][,timeout]) \n"
+"Wait for Noise: The same as Wait for Silance but waits for noise that is above the threshold specified\n";
+
+static int do_waiting(struct ast_channel *chan, int timereqd, time_t waitstart, int timeout, int wait_for_silence) {
 	struct ast_frame *f;
-	int dspsilence = 0;
-	static int silencethreshold = 128;
+	int dsptime = 0;
 	int rfmt = 0;
 	int res = 0;
 	struct ast_dsp *sildet;	 /* silence detector dsp */
  	time_t now;
+
+	/*Either silence or noise calc depending on wait_for_silence flag*/
+	int (*ast_dsp_func)(struct ast_dsp*, struct ast_frame*, int*) =
+				wait_for_silence ? ast_dsp_silence : ast_dsp_noise;
 
 	rfmt = chan->readformat; /* Set to linear mode */
 	res = ast_set_read_format(chan, AST_FORMAT_SLINEAR);
@@ -89,15 +104,15 @@
 		ast_log(LOG_WARNING, "Unable to create silence detector :(\n");
 		return -1;
 	}
-	ast_dsp_set_threshold(sildet, silencethreshold);
+	ast_dsp_set_threshold(sildet, ast_dsp_get_threshold_from_settings(THRESHOLD_SILENCE));
 
 	/* Await silence... */
 	f = NULL;
 	for(;;) {
 		/* Start with no silence received */
-		dspsilence = 0;
-
-		res = ast_waitfor(chan, silencereqd);
+		dsptime = 0;
+
+		res = ast_waitfor(chan, timereqd);
 
 		/* Must have gotten a hangup; let's exit */
 		if (res <= 0) {
@@ -107,30 +122,36 @@
 		
 		/* We waited and got no frame; sounds like digital silence or a muted digital channel */
 		if (!res) {
-			dspsilence = silencereqd;
+			dsptime = timereqd;
 		} else {
 			/* Looks like we did get a frame, so let's check it out */
 			f = ast_read(chan);
 			if (!f)
 				break;
 			if (f && f->frametype == AST_FRAME_VOICE) {
-				ast_dsp_silence(sildet, f, &dspsilence);
+				ast_dsp_func(sildet, f, &dsptime);
 				ast_frfree(f);
 			}
 		}
 
-		ast_verb(3, "Got %dms silence< %dms required\n", dspsilence, silencereqd);
-
-		if (dspsilence >= silencereqd) {
-			ast_verb(3, "Exiting with %dms silence >= %dms required\n", dspsilence, silencereqd);
+		if (wait_for_silence)
+			ast_verb(6, "Got %dms silence < %dms required\n", dsptime, timereqd);
+		else
+			ast_verb(6, "Got %dms noise < %dms required\n", dsptime, timereqd);
+
+		if (dsptime >= timereqd) {
+			if (wait_for_silence)
+				ast_verb(3, "Exiting with %dms silence >= %dms required\n", dsptime, timereqd);
+			else
+				ast_verb(3, "Exiting with %dms noise >= %dms required\n", dsptime, timereqd);
 			/* Ended happily with silence */
 			res = 1;
-			pbx_builtin_setvar_helper(chan, "WAITSTATUS", "SILENCE");
-			ast_debug(1, "WAITSTATUS was set to SILENCE\n");
+			pbx_builtin_setvar_helper(chan, "WAITSTATUS", wait_for_silence ? "SILENCE" : "NOISE");
+			ast_debug(1, "WAITSTATUS was set to %s\n", wait_for_silence ? "SILENCE" : "NOISE");
 			break;
 		}
 
-		if ( timeout && (difftime(time(&now),waitstart) >= timeout) ) {
+		if (timeout && (difftime(time(&now), waitstart) >= timeout)) {
 			pbx_builtin_setvar_helper(chan, "WAITSTATUS", "TIMEOUT");
 			ast_debug(1, "WAITSTATUS was set to TIMEOUT\n");
 			res = 0;
@@ -146,43 +167,60 @@
 	return res;
 }
 
-static int waitforsilence_exec(struct ast_channel *chan, void *data)
+static int waitfor_exec(struct ast_channel *chan, void *data, int wait_for_silence)
 {
 	int res = 1;
-	int silencereqd = 1000;
+	int timereqd = 1000;
 	int timeout = 0;
 	int iterations = 1, i;
 	time_t waitstart;
 
 	res = ast_answer(chan); /* Answer the channel */
 
-	if (!data || ( (sscanf(data, "%d,%d,%d", &silencereqd, &iterations, &timeout) != 3) &&
-		(sscanf(data, "%d|%d", &silencereqd, &iterations) != 2) &&
-		(sscanf(data, "%d", &silencereqd) != 1) ) ) {
+	if (!data || ( (sscanf(data, "%d,%d,%d", &timereqd, &iterations, &timeout) != 3) &&
+		(sscanf(data, "%d,%d", &timereqd, &iterations) != 2) &&
+		(sscanf(data, "%d", &timereqd) != 1) ) ) {
 		ast_log(LOG_WARNING, "Using default value of 1000ms, 1 iteration, no timeout\n");
 	}
 
-	ast_verb(3, "Waiting %d time(s) for %d ms silence with %d timeout\n", iterations, silencereqd, timeout);
+	ast_verb(3, "Waiting %d time(s) for %d ms silence with %d timeout\n", iterations, timereqd, timeout);
 
 	time(&waitstart);
 	res = 1;
 	for (i=0; (i<iterations) && (res == 1); i++) {
-		res = do_waiting(chan, silencereqd, waitstart, timeout);
+		res = do_waiting(chan, timereqd, waitstart, timeout, wait_for_silence);
 	}
 	if (res > 0)
 		res = 0;
 	return res;
 }
 
+static int waitforsilence_exec(struct ast_channel *chan, void *data)
+{
+	return waitfor_exec(chan, data, 1);
+}
+
+static int waitfornoise_exec(struct ast_channel *chan, void *data)
+{
+	return waitfor_exec(chan, data, 0);
+}
 
 static int unload_module(void)
 {
-	return ast_unregister_application(app);
+	int res;
+	res = ast_unregister_application(app_silence);
+	res |= ast_unregister_application(app_noise);
+
+	return res;
 }
 
 static int load_module(void)
 {
-	return ast_register_application(app, waitforsilence_exec, synopsis, descrip);
+	int res;
+
+	res = ast_register_application(app_silence, waitforsilence_exec, synopsis_silence, descrip_silence);
+	res |= ast_register_application(app_noise, waitfornoise_exec, synopsis_noise, descrip_noise);
+	return res;
 }
 
 AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Wait For Silence");

Modified: team/murf/sched-rbtree/channels/chan_sip.c
URL: http://svn.digium.com/view/asterisk/team/murf/sched-rbtree/channels/chan_sip.c?view=diff&rev=106172&r1=106171&r2=106172
==============================================================================
--- team/murf/sched-rbtree/channels/chan_sip.c (original)
+++ team/murf/sched-rbtree/channels/chan_sip.c Wed Mar  5 13:43:49 2008
@@ -2824,6 +2824,7 @@
 	pkt->next = p->packets;
 	p->packets = pkt;	/* Add it to the queue */
 	pkt->timer_t1 = p->timer_t1;	/* Set SIP timer T1 */
+	pkt->retransid = -1;
 	if (pkt->timer_t1)
 		siptimer_a = pkt->timer_t1 * 2;
 

Modified: team/murf/sched-rbtree/channels/chan_zap.c
URL: http://svn.digium.com/view/asterisk/team/murf/sched-rbtree/channels/chan_zap.c?view=diff&rev=106172&r1=106171&r2=106172
==============================================================================
--- team/murf/sched-rbtree/channels/chan_zap.c (original)
+++ team/murf/sched-rbtree/channels/chan_zap.c Wed Mar  5 13:43:49 2008
@@ -9811,29 +9811,36 @@
 		if (pri->pvts[x]->call == c) {
 			/* Found our call */
 			if (principle != x) {
+				struct zt_pvt *new = pri->pvts[principle], *old = pri->pvts[x];
+
 				ast_verb(3, "Moving call from channel %d to channel %d\n",
-						pri->pvts[x]->channel, pri->pvts[principle]->channel);
-				if (pri->pvts[principle]->owner) {
+					 old->channel, new->channel);
+				if (new->owner) {
 					ast_log(LOG_WARNING, "Can't fix up channel from %d to %d because %d is already in use\n",
-						pri->pvts[x]->channel, pri->pvts[principle]->channel, pri->pvts[principle]->channel);
+						old->channel, new->channel, new->channel);
 					return -1;
 				}
 				/* Fix it all up now */
-				pri->pvts[principle]->owner = pri->pvts[x]->owner;
-				if (pri->pvts[principle]->owner) {
-					ast_string_field_build(pri->pvts[principle]->owner, name, 
+				new->owner = old->owner;
+				old->owner = NULL;
+				if (new->owner) {
+					ast_string_field_build(new->owner, name, 
 							       "Zap/%d:%d-%d", pri->trunkgroup,
-							       pri->pvts[principle]->channel, 1);
-					pri->pvts[principle]->owner->tech_pvt = pri->pvts[principle];
-					ast_channel_set_fd(pri->pvts[principle]->owner, 0, pri->pvts[principle]->subs[SUB_REAL].zfd);
-					pri->pvts[principle]->subs[SUB_REAL].owner = pri->pvts[x]->subs[SUB_REAL].owner;
+							       new->channel, 1);
+					new->owner->tech_pvt = new;
+					ast_channel_set_fd(new->owner, 0, new->subs[SUB_REAL].zfd);
+					new->subs[SUB_REAL].owner = old->subs[SUB_REAL].owner;
+					old->subs[SUB_REAL].owner = NULL;
 				} else
-					ast_log(LOG_WARNING, "Whoa, there's no  owner, and we're having to fix up channel %d to channel %d\n", pri->pvts[x]->channel, pri->pvts[principle]->channel);
-				pri->pvts[principle]->call = pri->pvts[x]->call;
-				/* Free up the old channel, now not in use */
-				pri->pvts[x]->subs[SUB_REAL].owner = NULL;
-				pri->pvts[x]->owner = NULL;
-				pri->pvts[x]->call = NULL;
+					ast_log(LOG_WARNING, "Whoa, there's no  owner, and we're having to fix up channel %d to channel %d\n", old->channel, new->channel);
+				new->call = old->call;
+				old->call = NULL;
+
+				/* Copy any DSP that may be present */
+				new->dsp = old->dsp;
+				new->dsp_features = old->dsp_features;
+				old->dsp = NULL;
+				old->dsp_features = 0;
 			}
 			return principle;
 		}

Modified: team/murf/sched-rbtree/include/asterisk/dsp.h
URL: http://svn.digium.com/view/asterisk/team/murf/sched-rbtree/include/asterisk/dsp.h?view=diff&rev=106172&r1=106171&r2=106172
==============================================================================
--- team/murf/sched-rbtree/include/asterisk/dsp.h (original)
+++ team/murf/sched-rbtree/include/asterisk/dsp.h Wed Mar  5 13:43:49 2008
@@ -58,6 +58,13 @@
 
 struct ast_dsp;
 
+enum threshold {
+	/* Array offsets */
+	THRESHOLD_SILENCE = 0,
+	/* Always the last */
+	THRESHOLD_MAX = 1,
+};
+
 struct ast_dsp *ast_dsp_new(void);
 void ast_dsp_free(struct ast_dsp *dsp);
 
@@ -83,6 +90,10 @@
 /*! \brief Return non-zero if this is silence.  Updates "totalsilence" with the total
    number of seconds of silence  */
 int ast_dsp_silence(struct ast_dsp *dsp, struct ast_frame *f, int *totalsilence);
+
+/*! \brief Return non-zero if this is noise.  Updates "totalnoise" with the total
+   number of seconds of noise  */
+int ast_dsp_noise(struct ast_dsp *dsp, struct ast_frame *f, int *totalnoise);
 
 /*! \brief Return non-zero if historically this should be a busy, request that
   ast_dsp_silence has already been called */
@@ -115,4 +126,12 @@
 /*! \brief Get tcount (Threshold counter) */
 int ast_dsp_get_tcount(struct ast_dsp *dsp);
 
+/*! \brief Get silence threshold from dsp.conf*/
+int ast_dsp_get_threshold_from_settings(enum threshold which);
+
+/* \brief Reloads dsp settings from dsp.conf*/
+int ast_dsp_reload(void);
+
+int ast_dsp_init(void);
+
 #endif /* _ASTERISK_DSP_H */

Modified: team/murf/sched-rbtree/include/asterisk/sched.h
URL: http://svn.digium.com/view/asterisk/team/murf/sched-rbtree/include/asterisk/sched.h?view=diff&rev=106172&r1=106171&r2=106172
==============================================================================
--- team/murf/sched-rbtree/include/asterisk/sched.h (original)
+++ team/murf/sched-rbtree/include/asterisk/sched.h Wed Mar  5 13:43:49 2008
@@ -39,8 +39,9 @@
 #define AST_SCHED_DEL(sched, id) \
 	do { \
 		int _count = 0; \
-		while (id > -1 && ast_sched_del(sched, id) && ++_count < 10) \
-			usleep(1); \
+		while (id > -1 && ast_sched_del(sched, id) && ++_count < 10) { \
+			usleep(1); \
+		} \
 		if (_count == 10) \
 			ast_log(LOG_WARNING, "Unable to cancel schedule ID %d.  This is probably a bug (%s: %s, line %d).\n", id, __FILE__, __PRETTY_FUNCTION__, __LINE__); \
 		id = -1; \
@@ -49,8 +50,9 @@
 #define AST_SCHED_DEL_UNREF(sched, id, refcall)			\
 	do { \
 		int _count = 0; \
-		while (id > -1 && ast_sched_del(sched, id) && ++_count < 10) \
-			usleep(1); \
+		while (id > -1 && ast_sched_del(sched, id) && ++_count < 10) { \
+			usleep(1); \
+		} \
 		if (_count == 10) \
 			ast_log(LOG_WARNING, "Unable to cancel schedule ID %d.  This is probably a bug (%s: %s, line %d).\n", id, __FILE__, __PRETTY_FUNCTION__, __LINE__); \
 		if (id > -1) \
@@ -61,8 +63,9 @@
 #define AST_SCHED_REPLACE_VARIABLE(id, sched, when, callback, data, variable) \
 	do { \
 		int _count = 0; \
-		while (id > -1 && ast_sched_del(sched, id) && _count++ < 10) \
-			usleep(1); \
+		while (id > -1 && ast_sched_del(sched, id) && ++_count < 10) { \
+			usleep(1); \
+		} \
 		if (_count == 10) \
 			ast_log(LOG_WARNING, "Unable to cancel schedule ID %d.  This is probably a bug (%s: %s, line %d).\n", id, __FILE__, __PRETTY_FUNCTION__, __LINE__); \
 		id = ast_sched_add_variable(sched, when, callback, data, variable); \
@@ -75,8 +78,9 @@
 	do { \
 		int _count = 0, _res=1;											 \
 		void *_data = (void *)ast_sched_find_data(sched, id);			\
-		while (id > -1 && (_res = ast_sched_del(sched, id) && _count++ < 10)) \
-			usleep(1); \
+		while (id > -1 && (_res = ast_sched_del(sched, id) && _count++ < 10)) { \
+			usleep(1); \
+		} \
 		if (!_res && _data)							\
 			unrefcall;	/* should ref _data! */		\
 		if (_count == 10) \

Modified: team/murf/sched-rbtree/main/app.c
URL: http://svn.digium.com/view/asterisk/team/murf/sched-rbtree/main/app.c?view=diff&rev=106172&r1=106171&r2=106172
==============================================================================
--- team/murf/sched-rbtree/main/app.c (original)
+++ team/murf/sched-rbtree/main/app.c Wed Mar  5 13:43:49 2008
@@ -1268,7 +1268,7 @@
 
 int ast_record_review(struct ast_channel *chan, const char *playfile, const char *recordfile, int maxtime, const char *fmt, int *duration, const char *path) 
 {
-	int silencethreshold = 128; 
+	int silencethreshold; 
 	int maxsilence = 0;
 	int res = 0;
 	int cmd = 0;
@@ -1285,6 +1285,8 @@
 	}
 
 	cmd = '3';	 /* Want to start by recording */
+
+	silencethreshold = ast_dsp_get_threshold_from_settings(THRESHOLD_SILENCE);
 
 	while ((cmd >= 0) && (cmd != 't')) {
 		switch (cmd) {

Modified: team/murf/sched-rbtree/main/asterisk.c
URL: http://svn.digium.com/view/asterisk/team/murf/sched-rbtree/main/asterisk.c?view=diff&rev=106172&r1=106171&r2=106172
==============================================================================
--- team/murf/sched-rbtree/main/asterisk.c (original)
+++ team/murf/sched-rbtree/main/asterisk.c Wed Mar  5 13:43:49 2008
@@ -121,6 +121,7 @@
 #include "asterisk/linkedlists.h"
 #include "asterisk/devicestate.h"
 #include "asterisk/module.h"
+#include "asterisk/dsp.h"
 
 #include "asterisk/doxyref.h"		/* Doxygen documentation */
 
@@ -3218,7 +3219,7 @@
 	}
 
 	ast_rtp_init();
-
+	ast_dsp_init();
 	ast_udptl_init();
 
 	if (ast_image_init()) {

Modified: team/murf/sched-rbtree/main/dsp.c
URL: http://svn.digium.com/view/asterisk/team/murf/sched-rbtree/main/dsp.c?view=diff&rev=106172&r1=106171&r2=106172
==============================================================================
--- team/murf/sched-rbtree/main/dsp.c (original)
+++ team/murf/sched-rbtree/main/dsp.c Wed Mar  5 13:43:49 2008
@@ -53,6 +53,7 @@
 #include "asterisk/alaw.h"
 #include "asterisk/utils.h"
 #include "asterisk/options.h"
+#include "asterisk/config.h"
 
 /*! Number of goertzels for progress detect */
 enum gsamp_size {
@@ -193,6 +194,8 @@
 #define SAMPLES_IN_FRAME	160
 
 
+#define CONFIG_FILE_NAME "dsp.conf"
+
 typedef struct {
 	int v2;
 	int v3;
@@ -271,6 +274,8 @@
 static char dtmf_positions[] = "123A" "456B" "789C" "*0#D";
 
 static char bell_mf_positions[] = "1247C-358A--69*---0B----#";
+
+static int thresholds[THRESHOLD_MAX];
 
 static inline void goertzel_sample(goertzel_state_t *s, short sample)
 {

[... 137 lines stripped ...]



More information about the asterisk-commits mailing list