Index: channels/chan_zap.c =================================================================== --- channels/chan_zap.c (revision 9656) +++ channels/chan_zap.c (working copy) @@ -217,6 +217,7 @@ static char progzone[10]= ""; static int usedistinctiveringdetection = 0; +static int distinctiveringaftercid = 0; static int transfertobusy = 1; @@ -6283,6 +6284,58 @@ break; } } + if (res == 1) { + callerid_get(cs, &name, &number, &flags); + if (option_debug) + ast_log(LOG_DEBUG, "CallerID number: %s, name: %s, flags=%d\n", number, name, flags); + } + if (distinctiveringaftercid == 1) { + /* Clear the current ring data array so we dont have old data in it. */ + for (receivedRingT=0; receivedRingT < 3; receivedRingT++) { + curRingData[receivedRingT] = 0; + } + receivedRingT = 0; + ast_verbose( VERBOSE_PREFIX_3 "Detecting post-CID distinctive ring\n"); + for(;;) { + i = ZT_IOMUX_READ | ZT_IOMUX_SIGEVENT; + if ((res = ioctl(p->subs[index].zfd, ZT_IOMUX, &i))) { + ast_log(LOG_WARNING, "I/O MUX failed: %s\n", strerror(errno)); + callerid_free(cs); + ast_hangup(chan); + return NULL; + } + if (i & ZT_IOMUX_SIGEVENT) { + res = zt_get_event(p->subs[index].zfd); + ast_log(LOG_NOTICE, "Got event %d (%s)...\n", res, event2str(res)); + res = 0; + /* Let us detect callerid when the telco uses distinctive ring */ + + curRingData[receivedRingT] = p->ringt; + + if (p->ringt < p->ringt_base/2) + break; + ++receivedRingT; /* Increment the ringT counter so we can match it against + values in zapata.conf for distinctive ring */ + } else if (i & ZT_IOMUX_READ) { + res = read(p->subs[index].zfd, buf, sizeof(buf)); + if (res < 0) { + if (errno != ELAST) { + ast_log(LOG_WARNING, "read returned error: %s\n", strerror(errno)); + callerid_free(cs); + ast_hangup(chan); + return NULL; + } + break; + } + if (p->ringt) + p->ringt--; + if (p->ringt == 1) { + res = -1; + break; + } + } + } + } if (p->usedistinctiveringdetection == 1) { if(option_verbose > 2) /* this only shows up if you have n of the dring patterns filled in */ @@ -6291,6 +6344,12 @@ for (counter=0; counter < 3; counter++) { /* Check to see if the rings we received match any of the ones in zapata.conf for this channel */ + if(option_verbose > 2) + /* this only shows up if you have n of the dring patterns filled in */ + ast_verbose( VERBOSE_PREFIX_3 "Checking %d,%d,%d\n", + p->drings.ringnum[counter].ring[0], + p->drings.ringnum[counter].ring[1], + p->drings.ringnum[counter].ring[2]); distMatches = 0; for (counter1=0; counter1 < 3; counter1++) { if (curRingData[counter1] <= (p->drings.ringnum[counter].ring[counter1]+10) && curRingData[counter1] >= @@ -6308,11 +6367,6 @@ } } } - if (res == 1) { - callerid_get(cs, &name, &number, &flags); - if (option_debug) - ast_log(LOG_DEBUG, "CallerID number: %s, name: %s, flags=%d\n", number, name, flags); - } /* Restore linear mode (if appropriate) for Caller*ID processing */ zt_setlinear(p->subs[index].zfd, p->subs[index].linear); #if 1 @@ -10520,6 +10574,8 @@ } else if (!strcasecmp(v->name, "usedistinctiveringdetection")) { if (ast_true(v->value)) usedistinctiveringdetection = 1; + } else if (!strcasecmp(v->name, "distinctiveringaftercid")) { + if (!strcasecmp(v->value, "yes")) distinctiveringaftercid = 1; } else if (!strcasecmp(v->name, "dring1context")) { ast_copy_string(drings.ringContext[0].contextData,v->value,sizeof(drings.ringContext[0].contextData)); } else if (!strcasecmp(v->name, "dring2context")) { Index: configs/zapata.conf.sample =================================================================== --- configs/zapata.conf.sample (revision 9656) +++ configs/zapata.conf.sample (working copy) @@ -214,7 +214,8 @@ ; Whether or not to do distinctive ring detection on FXO lines ; ;usedistinctiveringdetection=yes - +;distinctiveringaftercid=yes ; enable dring detection after callerid for those countries like Australia + ; where the ring cadence is changed *after* the callerid spill. ; ; Whether or not to use caller ID ;