aboutsummaryrefslogtreecommitdiffstats
path: root/channels/chan_zap.c
diff options
context:
space:
mode:
authormarkster <markster@f38db490-d61c-443f-a65b-d21fe96a405b>2003-11-05 22:32:20 +0000
committermarkster <markster@f38db490-d61c-443f-a65b-d21fe96a405b>2003-11-05 22:32:20 +0000
commit3489fec50b30c4261310ebc233fd7a97766ffd94 (patch)
tree1374c0be43b7c7dd9a8556a4ce437e960965f01d /channels/chan_zap.c
parent76c431dd6512462a69edb030d9ddb257d36bc493 (diff)
Train echo canceller on FXO before last digit
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@1698 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels/chan_zap.c')
-rwxr-xr-xchannels/chan_zap.c39
1 files changed, 28 insertions, 11 deletions
diff --git a/channels/chan_zap.c b/channels/chan_zap.c
index c68bf8e1c..6ba1ced5e 100755
--- a/channels/chan_zap.c
+++ b/channels/chan_zap.c
@@ -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;
+ }
}
}
}