diff --git a/channels/chan_zap.c b/channels/chan_zap.c index 47c55c893dafa72993405efdda20f89ef208476e..24f886c8f66f37ce423acd0b8e6ae6e5ce62925e 100644 --- a/channels/chan_zap.c +++ b/channels/chan_zap.c @@ -528,6 +528,7 @@ static struct zt_distRings drings; struct distRingData { int ring[3]; + int range; }; struct ringContextData { char contextData[AST_MAX_CONTEXT]; @@ -6609,17 +6610,29 @@ static void *ss_thread(void *data) if (option_verbose > 2) /* this only shows up if you have n of the dring patterns filled in */ ast_verbose( VERBOSE_PREFIX_3 "Detected ring pattern: %d,%d,%d\n",curRingData[0],curRingData[1],curRingData[2]); - 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 */ distMatches = 0; for (counter1 = 0; counter1 < 3; counter1++) { - if (curRingData[counter1] <= (p->drings.ringnum[counter].ring[counter1]+10) && curRingData[counter1] >= - (p->drings.ringnum[counter].ring[counter1]-10)) { + if (p->drings.ringnum[counter].range == 0) { + p->drings.ringnum[counter].range = 10; + } + ast_verbose( VERBOSE_PREFIX_3 "Ring pattern check range: %d\n", p->drings.ringnum[counter].range); + if (p->drings.ringnum[counter].ring[counter1] == -1) { + ast_verbose( VERBOSE_PREFIX_3 "Pattern ignore (-1) detected, so matching pattern %d regardless.\n", + curRingData[counter1]); + distMatches++; + } + else if (curRingData[counter1] <= (p->drings.ringnum[counter].ring[counter1] + p->drings.ringnum[counter].range) && + curRingData[counter1] >= (p->drings.ringnum[counter].ring[counter1] - p->drings.ringnum[counter].range)) { + ast_verbose( VERBOSE_PREFIX_3 "Ring pattern matched in range: %d to %d\n", + (p->drings.ringnum[counter].ring[counter1] - p->drings.ringnum[counter].range), + (p->drings.ringnum[counter].ring[counter1] + p->drings.ringnum[counter].range)); distMatches++; } } + if (distMatches == 3) { /* The ring matches, set the context to whatever is for distinctive ring.. */ ast_copy_string(p->context, p->drings.ringContext[counter].contextData, sizeof(p->context)); @@ -6791,8 +6804,20 @@ static void *ss_thread(void *data) 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] >= - (p->drings.ringnum[counter].ring[counter1]-10)) { + if (p->drings.ringnum[counter].range == 0) { + p->drings.ringnum[counter].range = 10; + } + ast_verbose( VERBOSE_PREFIX_3 "Ring pattern check range: %d\n", p->drings.ringnum[counter].range); + if (p->drings.ringnum[counter].ring[counter1] == -1) { + ast_verbose( VERBOSE_PREFIX_3 "Pattern ignore (-1) detected, so matching pattern %d regardless.\n", + curRingData[counter1]); + distMatches++; + } + else if (curRingData[counter1] <= (p->drings.ringnum[counter].ring[counter1] + p->drings.ringnum[counter].range) && + curRingData[counter1] >= (p->drings.ringnum[counter].ring[counter1] - p->drings.ringnum[counter].range)) { + ast_verbose( VERBOSE_PREFIX_3 "Ring pattern matched in range: %d to %d\n", + (p->drings.ringnum[counter].ring[counter1] - p->drings.ringnum[counter].range), + (p->drings.ringnum[counter].ring[counter1] + p->drings.ringnum[counter].range)); distMatches++; } } @@ -11698,6 +11723,7 @@ static int process_zap(struct ast_variable *v, int reload, int skipchannels) struct zt_pvt *tmp; char *ringc; int y; + int range; int found_pseudo = 0; for (; v; v = v->next) { @@ -11726,6 +11752,15 @@ static int process_zap(struct ast_variable *v, int reload, int skipchannels) ast_copy_string(drings.ringContext[1].contextData,v->value,sizeof(drings.ringContext[1].contextData)); } else if (!strcasecmp(v->name, "dring3context")) { ast_copy_string(drings.ringContext[2].contextData,v->value,sizeof(drings.ringContext[2].contextData)); + } else if (!strcasecmp(v->name, "dring1range")) { + range = atoi(v->value); + drings.ringnum[0].range = range; + } else if (!strcasecmp(v->name, "dring2range")) { + range = atoi(v->value); + drings.ringnum[1].range = range; + } else if (!strcasecmp(v->name, "dring3range")) { + range = atoi(v->value); + drings.ringnum[2].range = range; } else if (!strcasecmp(v->name, "dring1")) { ringc = v->value; sscanf(ringc, "%d,%d,%d", &drings.ringnum[0].ring[0], &drings.ringnum[0].ring[1], &drings.ringnum[0].ring[2]); diff --git a/configs/zapata.conf.sample b/configs/zapata.conf.sample index 14ad2af5f207eb3e2cb6f659d1a5d93452e83529..7549e6152e746a658f8cf7136c6e8e965cc5dae7 100644 --- a/configs/zapata.conf.sample +++ b/configs/zapata.conf.sample @@ -649,10 +649,17 @@ immediate=no ; You can see the dringX patterns is to set any one of the dringXcontext fields ; and they will be printed on the console when an inbound call comes in. ; +; dringXrange is used to change the acceptable ranges for "tone offsets". Defaults to 10. +; Note: a range of 0 is NOT what you might expect - it instead forces it to the default. +; A range of -1 will force it to always match. +; Anything lower than -1 would presumably cause it to never match. +; ;dring1=95,0,0 ;dring1context=internal1 +;dring1range=10 ;dring2=325,95,0 ;dring2context=internal2 +;dring2range=10 ; If no pattern is matched here is where we go. ;context=default ;channel => 1