[Asterisk-cvs] asterisk/channels chan_zap.c,1.118,1.119

markster at lists.digium.com markster at lists.digium.com
Wed Nov 5 16:06:10 CST 2003


Update of /usr/cvsroot/asterisk/channels
In directory mongoose.digium.com:/tmp/cvs-serv974/channels

Modified Files:
	chan_zap.c 
Log Message:
Train echo canceller on FXO before last digit


Index: chan_zap.c
===================================================================
RCS file: /usr/cvsroot/asterisk/channels/chan_zap.c,v
retrieving revision 1.118
retrieving revision 1.119
diff -u -d -r1.118 -r1.119
--- chan_zap.c	5 Nov 2003 16:48:38 -0000	1.118
+++ chan_zap.c	5 Nov 2003 22:32:20 -0000	1.119
@@ -408,6 +408,8 @@
 	int echotraining;
 	int echocanbridged;
 	int echocanon;
+	int echobreak;
+	char echorest[10];
 	int permcallwaiting;
 	int callwaitingcallerid;
 	int threewaycalling;
@@ -1497,7 +1499,14 @@
 		if (p->sig == SIG_FEATB) {
 			snprintf(p->dop.dialstr, sizeof(p->dop.dialstr), "M*%s#", c + p->stripmsd);
 		} else 
-			snprintf(p->dop.dialstr, sizeof(p->dop.dialstr), "T%s", c + p->stripmsd);
+			snprintf(p->dop.dialstr, sizeof(p->dop.dialstr), "T%sw", c + p->stripmsd);
+		if (strlen(p->dop.dialstr) > 4) {
+			strcpy(p->echorest, "w");
+			strcpy(p->echorest + 1, p->dop.dialstr + strlen(p->dop.dialstr) - 2);
+			p->echobreak = 1;
+			p->dop.dialstr[strlen(p->dop.dialstr)-2] = '\0';
+		} else
+			p->echobreak = 0;
 		if (!res) {
 			if (ioctl(p->subs[SUB_REAL].zfd, ZT_DIAL, &p->dop)) {
 				x = ZT_ONHOOK;
@@ -2713,16 +2722,24 @@
 			}
 			if (!x) { /* if not still dialing in driver */
 				zt_enable_ec(p);
-				p->dialing = 0;
-				if (ast->_state == AST_STATE_DIALING) {
-					if (p->callprogress && CANPROGRESSDETECT(p) && p->dsp && p->outgoing) {
-						ast_log(LOG_DEBUG, "Done dialing, but waiting for progress detection before doing more...\n");
-					} else if (p->confirmanswer || (!p->dialednone && ((p->sig == SIG_EM) || (p->sig == SIG_EMWINK) || (p->sig == SIG_FEATD) || (p->sig == SIG_FEATDMF) || (p->sig == SIG_FEATB) || (p->sig == SIG_SF) || (p->sig == SIG_SFWINK) || (p->sig == SIG_SF_FEATD) || (p->sig == SIG_SF_FEATDMF) || (p->sig == SIG_SF_FEATB)))) {
-						ast_setstate(ast, AST_STATE_RINGING);
-					} else {
-						ast_setstate(ast, AST_STATE_UP);
-						p->subs[index].f.frametype = AST_FRAME_CONTROL;
-						p->subs[index].f.subclass = AST_CONTROL_ANSWER;
+				zt_train_ec(p);
+				if (p->echobreak) {
+					strcpy(p->dop.dialstr, p->echorest);
+					p->dop.op = ZT_DIAL_OP_REPLACE;
+					res = ioctl(p->subs[SUB_REAL].zfd, ZT_DIAL, &p->dop);
+					p->echobreak = 0;
+				} else {
+					p->dialing = 0;
+					if (ast->_state == AST_STATE_DIALING) {
+						if (p->callprogress && CANPROGRESSDETECT(p) && p->dsp && p->outgoing) {
+							ast_log(LOG_DEBUG, "Done dialing, but waiting for progress detection before doing more...\n");
+						} else if (p->confirmanswer || (!p->dialednone && ((p->sig == SIG_EM) || (p->sig == SIG_EMWINK) || (p->sig == SIG_FEATD) || (p->sig == SIG_FEATDMF) || (p->sig == SIG_FEATB) || (p->sig == SIG_SF) || (p->sig == SIG_SFWINK) || (p->sig == SIG_SF_FEATD) || (p->sig == SIG_SF_FEATDMF) || (p->sig == SIG_SF_FEATB)))) {
+							ast_setstate(ast, AST_STATE_RINGING);
+						} else {
+							ast_setstate(ast, AST_STATE_UP);
+							p->subs[index].f.frametype = AST_FRAME_CONTROL;
+							p->subs[index].f.subclass = AST_CONTROL_ANSWER;
+						}
 					}
 				}
 			}




More information about the svn-commits mailing list