]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Train echo canceller on FXO before last digit
authorMark Spencer <markster@digium.com>
Wed, 5 Nov 2003 22:32:20 +0000 (22:32 +0000)
committerMark Spencer <markster@digium.com>
Wed, 5 Nov 2003 22:32:20 +0000 (22:32 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@1698 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channels/chan_zap.c

index c68bf8e1c3ec22b93c9f78f32f8d006d7822f3d9..6ba1ced5e72f40e5377b4e1280fcd8d724d283db 100755 (executable)
@@ -408,6 +408,8 @@ static struct zt_pvt {
        int echotraining;
        int echocanbridged;
        int echocanon;
+       int echobreak;
+       char echorest[10];
        int permcallwaiting;
        int callwaitingcallerid;
        int threewaycalling;
@@ -1497,7 +1499,14 @@ static int zt_call(struct ast_channel *ast, char *rdest, int timeout)
                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 @@ static struct ast_frame *zt_handle_event(struct ast_channel *ast)
                        }
                        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;
+                                               }
                                        }
                                }
                        }