diff -urN asterisk-1.4.11.org/channels/chan_zap.c asterisk-1.4.11/channels/chan_zap.c --- asterisk-1.4.11.org/channels/chan_zap.c 2007-08-17 23:01:43.000000000 +0200 +++ asterisk-1.4.11/channels/chan_zap.c 2007-10-06 06:09:46.353781463 +0200 @@ -137,7 +137,7 @@ * is entirely unwilling to provide any assistance with their channel banks * even though their web site says they support their products for life. */ -/* #define ZHONE_HACK */ +#define ZHONE_HACK 1 /*! \note * Define if you want to check the hook state for an FXO (FXS signalled) interface @@ -3700,21 +3700,17 @@ ast_log(LOG_DEBUG, "Got event %s(%d) on channel %d (index %d)\n", event2str(res), res, p->channel, index); if (res & (ZT_EVENT_PULSEDIGIT | ZT_EVENT_DTMFUP)) { - p->pulsedial = (res & ZT_EVENT_PULSEDIGIT) ? 1 : 0; + int pulse = (res & ZT_EVENT_PULSEDIGIT) ? 1 : 0; - ast_log(LOG_DEBUG, "Detected %sdigit '%c'\n", p->pulsedial ? "pulse ": "", res & 0xff); -#ifdef HAVE_PRI - if (!p->proceeding && p->sig == SIG_PRI && p->pri && p->pri->overlapdial) { - /* absorb event */ - } else { -#endif - p->subs[index].f.frametype = AST_FRAME_DTMF_END; - p->subs[index].f.subclass = res & 0xff; -#ifdef HAVE_PRI + ast_log(LOG_DEBUG, "Detected %sdigit '%c'\n", pulse ? "pulse ": "", res & 0xff); + + if (res & 0xff != 1) { + /* try to reset zhone */ + zt_set_hook(p->subs[SUB_REAL].zfd, ZT_OFFHOOK); + usleep(10); + zt_set_hook(p->subs[SUB_REAL].zfd, ZT_ONHOOK); } -#endif - zt_handle_dtmfup(ast, index, &f); - return f; + /* do nothing */ } if (res & ZT_EVENT_DTMFDOWN) { --- asterisk/channels/chan_zap.c.org 2007-09-26 09:08:42.423698383 +0200 +++ asterisk/channels/chan_zap.c 2007-09-26 09:09:43.422303554 +0200 @@ -1607,11 +1607,18 @@ static inline int zt_set_hook(int fd, int hs) { - int x, res; + int x, res, count = 0; x = hs; res = ioctl(fd, ZT_HOOK, &x); + while (res < 0 && count < 20) { + usleep(100000); /* 1/10 sec. */ + x = hs; + res = ioctl(fd, ZT_HOOK, &x); + count++; + } + if (res < 0) { if (errno == EINPROGRESS) return 0;