diff options
author | Maxim Sobolev <sobomax@FreeBSD.org> | 2005-05-03 13:58:26 +0000 |
---|---|---|
committer | Maxim Sobolev <sobomax@FreeBSD.org> | 2005-05-03 13:58:26 +0000 |
commit | 7150c8301f0ff323d2d3fd487efab9f6805ecf7b (patch) | |
tree | 7ca292dfc161206043d279c879db63f2813670f7 /net/asterisk/files/patch-channels::chan_zap.c | |
parent | Update to 20050503 (diff) |
o chan_sip.c:
- Improve codec negotiation logic.
- make sure to parse SDP on re-INVITE.
o chan_zap.c:
- If unanswered Zap channnel is hanged up wait until the calling party
in turn hangs up (by detecting ring timeout). Otherwise next ring will
trigger a "new" incoming call. This appears to be design limitation of
the analogue telephone system - there is no way to reject the call without
answering it first.
Sponsored by: Porta Software Ltd, PBXpress Inc
Notes
Notes:
svn path=/head/; revision=134555
Diffstat (limited to 'net/asterisk/files/patch-channels::chan_zap.c')
-rw-r--r-- | net/asterisk/files/patch-channels::chan_zap.c | 91 |
1 files changed, 88 insertions, 3 deletions
diff --git a/net/asterisk/files/patch-channels::chan_zap.c b/net/asterisk/files/patch-channels::chan_zap.c index 965a643bb687..458a6147d215 100644 --- a/net/asterisk/files/patch-channels::chan_zap.c +++ b/net/asterisk/files/patch-channels::chan_zap.c @@ -1,9 +1,9 @@ $FreeBSD$ ---- channels/chan_zap.c -+++ channels/chan_zap.c -@@ -42,7 +42,9 @@ +--- channels/chan_zap.c.orig Sun Feb 17 18:01:44 2002 ++++ channels/chan_zap.c Sun Feb 17 18:03:26 2002 +@@ -46,7 +46,9 @@ #include <sys/signal.h> #include <errno.h> #include <stdlib.h> @@ -13,3 +13,88 @@ $FreeBSD$ #include <unistd.h> #include <sys/ioctl.h> #ifdef __linux__ +@@ -320,7 +322,7 @@ + #define CALLWAITING_REPEAT_SAMPLES ( (10000 * 8) / READ_SIZE) /* 300 ms */ + #define CIDCW_EXPIRE_SAMPLES ( (500 * 8) / READ_SIZE) /* 500 ms */ + #define MIN_MS_SINCE_FLASH ( (2000) ) /* 2000 ms */ +-#define RINGT ( (8000 * 8) / READ_SIZE) ++#define RINGT ( (8000 * 8) / READ_SIZE) /* 8000 ms */ + + struct zt_pvt; + +@@ -535,6 +537,7 @@ + int cidpos; + int cidlen; + int ringt; ++ int waitnorings; + int stripmsd; + int callwaiting; + int callwaitcas; +@@ -2134,12 +2137,20 @@ + + if (option_debug) + ast_log(LOG_DEBUG, "zt_hangup(%s)\n", ast->name); ++ + if (!ast->pvt->pvt) { + ast_log(LOG_WARNING, "Asked to hangup channel not connected\n"); + return 0; + } + + ast_mutex_lock(&p->lock); ++ ++ ++ if((p->sig == SIG_FXSGS) || (p->sig == SIG_FXSKS) || (p->sig == SIG_FXSLS)) ++ if((ast->_state == AST_STATE_RING) && (p->ringt > 1)) ++ { ++ p->waitnorings = 1; ++ } + + index = zt_get_index(ast, p, 1); + +@@ -5717,7 +5728,37 @@ + ast_setstate(chan, AST_STATE_RING); + chan->rings = 1; + p->ringt = RINGT; ++ p->waitnorings = 0; + res = ast_pbx_run(chan); ++ ++ if(p->waitnorings) ++ { ++ p->ringt = RINGT; ++ for(;;) ++ { ++ int i,j=0; ++ i = ZT_IOMUX_SIGEVENT | ZT_IOMUX_NOWAIT; ++ if (ioctl(p->subs[index].zfd, ZT_IOMUX, &i) == -1) ++ break; ++ ++ if (ioctl(p->subs[index].zfd, ZT_GETEVENT, &j) == -1) ++ break; ++ ++ if(j == ZT_EVENT_RINGOFFHOOK) ++ p->ringt = RINGT; ++ ++ usleep(20000); ++ ++ if (p->ringt <= 0) ++ break; ++ ++ else if (p->ringt > 0) ++ p->ringt--; ++ } ++ p->ringt = 0; ++ p->waitnorings = 0; ++ } ++ + if (res) { + ast_hangup(chan); + ast_log(LOG_WARNING, "PBX exited non-zero\n"); +@@ -6018,7 +6059,7 @@ + i = iflist; + while(i) { + if ((i->subs[SUB_REAL].zfd > -1) && i->sig && (!i->radio)) { +- if (!i->owner && !i->subs[SUB_REAL].owner) { ++ if (!i->owner && !i->subs[SUB_REAL].owner && !i->waitnorings) { + /* This needs to be watched, as it lacks an owner */ + pfds[count].fd = i->subs[SUB_REAL].zfd; + pfds[count].events = POLLPRI; |