|
|
@ -1331,21 +1331,17 @@ static int say_position(struct queue_ent *qe)
|
|
|
|
return res;
|
|
|
|
return res;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static void recalc_holdtime(struct queue_ent *qe)
|
|
|
|
static void recalc_holdtime(struct queue_ent *qe, int newholdtime)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
int oldvalue, newvalue;
|
|
|
|
int oldvalue;
|
|
|
|
|
|
|
|
|
|
|
|
/* Calculate holdtime using a recursive boxcar filter */
|
|
|
|
/* Calculate holdtime using a recursive boxcar filter */
|
|
|
|
/* Thanks to SRT for this contribution */
|
|
|
|
/* Thanks to SRT for this contribution */
|
|
|
|
/* 2^2 (4) is the filter coefficient; a higher exponent would give old entries more weight */
|
|
|
|
/* 2^2 (4) is the filter coefficient; a higher exponent would give old entries more weight */
|
|
|
|
|
|
|
|
|
|
|
|
newvalue = time(NULL) - qe->start;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ast_mutex_lock(&qe->parent->lock);
|
|
|
|
ast_mutex_lock(&qe->parent->lock);
|
|
|
|
if (newvalue <= qe->parent->servicelevel)
|
|
|
|
|
|
|
|
qe->parent->callscompletedinsl++;
|
|
|
|
|
|
|
|
oldvalue = qe->parent->holdtime;
|
|
|
|
oldvalue = qe->parent->holdtime;
|
|
|
|
qe->parent->holdtime = (((oldvalue << 2) - oldvalue) + newvalue) >> 2;
|
|
|
|
qe->parent->holdtime = (((oldvalue << 2) - oldvalue) + newholdtime) >> 2;
|
|
|
|
ast_mutex_unlock(&qe->parent->lock);
|
|
|
|
ast_mutex_unlock(&qe->parent->lock);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -2082,7 +2078,7 @@ static int wait_our_turn(struct queue_ent *qe, int ringing, enum queue_result *r
|
|
|
|
return res;
|
|
|
|
return res;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static int update_queue(struct call_queue *q, struct member *member)
|
|
|
|
static int update_queue(struct call_queue *q, struct member *member, int callcompletedinsl)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
struct member *cur;
|
|
|
|
struct member *cur;
|
|
|
|
|
|
|
|
|
|
|
@ -2099,6 +2095,8 @@ static int update_queue(struct call_queue *q, struct member *member)
|
|
|
|
cur = cur->next;
|
|
|
|
cur = cur->next;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
q->callscompleted++;
|
|
|
|
q->callscompleted++;
|
|
|
|
|
|
|
|
if (callcompletedinsl)
|
|
|
|
|
|
|
|
q->callscompletedinsl++;
|
|
|
|
ast_mutex_unlock(&q->lock);
|
|
|
|
ast_mutex_unlock(&q->lock);
|
|
|
|
return 0;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -2179,6 +2177,7 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce
|
|
|
|
time_t now = time(NULL);
|
|
|
|
time_t now = time(NULL);
|
|
|
|
struct ast_bridge_config bridge_config;
|
|
|
|
struct ast_bridge_config bridge_config;
|
|
|
|
char nondataquality = 1;
|
|
|
|
char nondataquality = 1;
|
|
|
|
|
|
|
|
int callcompletedinsl;
|
|
|
|
|
|
|
|
|
|
|
|
memset(&bridge_config, 0, sizeof(bridge_config));
|
|
|
|
memset(&bridge_config, 0, sizeof(bridge_config));
|
|
|
|
time(&now);
|
|
|
|
time(&now);
|
|
|
@ -2309,7 +2308,11 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce
|
|
|
|
if (!strcmp(peer->type,"Zap"))
|
|
|
|
if (!strcmp(peer->type,"Zap"))
|
|
|
|
ast_channel_setoption(peer, AST_OPTION_TONE_VERIFY, &nondataquality, sizeof(nondataquality), 0);
|
|
|
|
ast_channel_setoption(peer, AST_OPTION_TONE_VERIFY, &nondataquality, sizeof(nondataquality), 0);
|
|
|
|
/* Update parameters for the queue */
|
|
|
|
/* Update parameters for the queue */
|
|
|
|
recalc_holdtime(qe);
|
|
|
|
time(&now);
|
|
|
|
|
|
|
|
recalc_holdtime(qe, (now - qe->start));
|
|
|
|
|
|
|
|
ast_mutex_lock(&qe->parent->lock);
|
|
|
|
|
|
|
|
callcompletedinsl = ((now - qe->start) <= qe->parent->servicelevel);
|
|
|
|
|
|
|
|
ast_mutex_unlock(&qe->parent->lock);
|
|
|
|
member = lpeer->member;
|
|
|
|
member = lpeer->member;
|
|
|
|
hangupcalls(outgoing, peer);
|
|
|
|
hangupcalls(outgoing, peer);
|
|
|
|
outgoing = NULL;
|
|
|
|
outgoing = NULL;
|
|
|
@ -2454,7 +2457,7 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce
|
|
|
|
|
|
|
|
|
|
|
|
if (bridge != AST_PBX_NO_HANGUP_PEER)
|
|
|
|
if (bridge != AST_PBX_NO_HANGUP_PEER)
|
|
|
|
ast_hangup(peer);
|
|
|
|
ast_hangup(peer);
|
|
|
|
update_queue(qe->parent, member);
|
|
|
|
update_queue(qe->parent, member, callcompletedinsl);
|
|
|
|
res = bridge ? bridge : 1;
|
|
|
|
res = bridge ? bridge : 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
out:
|
|
|
|
out:
|
|
|
|