mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-16 18:06:31 +00:00
app_waitforsilence.c: Use milliseconds to calculate timeout time
The functions WaitForNoise() and WaitForSilence() use the time() functions to calculate elapsed time, which causes the timer to fire on a whole second boundary, and the actual function execution time to fire the timer may be 1 second less than expected. This fix replaces time() with ast_tvnow(). Fixes: #1401
This commit is contained in:
committed by
github-actions[bot]
parent
96e8535e84
commit
39c677e0df
@@ -158,7 +158,7 @@ static const struct wait_type wait_for_noise = {
|
|||||||
.func = ast_dsp_noise,
|
.func = ast_dsp_noise,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int do_waiting(struct ast_channel *chan, int timereqd, time_t waitstart, int timeout, const struct wait_type *wait_for)
|
static int do_waiting(struct ast_channel *chan, int timereqd, struct timeval waitstart, int timeout, const struct wait_type *wait_for)
|
||||||
{
|
{
|
||||||
RAII_VAR(struct ast_format *, rfmt, NULL, ao2_cleanup);
|
RAII_VAR(struct ast_format *, rfmt, NULL, ao2_cleanup);
|
||||||
int res;
|
int res;
|
||||||
@@ -216,7 +216,7 @@ static int do_waiting(struct ast_channel *chan, int timereqd, time_t waitstart,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (timeout && difftime(time(NULL), waitstart) >= timeout) {
|
if (timeout && ast_tvdiff_ms(ast_tvnow(), waitstart) >= timeout * 1000) {
|
||||||
pbx_builtin_setvar_helper(chan, "WAITSTATUS", "TIMEOUT");
|
pbx_builtin_setvar_helper(chan, "WAITSTATUS", "TIMEOUT");
|
||||||
ast_debug(1, "WAITSTATUS was set to TIMEOUT\n");
|
ast_debug(1, "WAITSTATUS was set to TIMEOUT\n");
|
||||||
res = 0;
|
res = 0;
|
||||||
@@ -238,7 +238,7 @@ static int waitfor_exec(struct ast_channel *chan, const char *data, const struct
|
|||||||
int timereqd = 1000;
|
int timereqd = 1000;
|
||||||
int timeout = 0;
|
int timeout = 0;
|
||||||
int iterations = 1, i;
|
int iterations = 1, i;
|
||||||
time_t waitstart;
|
struct timeval waitstart;
|
||||||
char *parse;
|
char *parse;
|
||||||
struct ast_silence_generator *silgen = NULL;
|
struct ast_silence_generator *silgen = NULL;
|
||||||
|
|
||||||
@@ -284,7 +284,7 @@ static int waitfor_exec(struct ast_channel *chan, const char *data, const struct
|
|||||||
silgen = ast_channel_start_silence_generator(chan);
|
silgen = ast_channel_start_silence_generator(chan);
|
||||||
}
|
}
|
||||||
|
|
||||||
time(&waitstart);
|
waitstart = ast_tvnow();
|
||||||
for (i = 0; i < iterations && res == 1; i++) {
|
for (i = 0; i < iterations && res == 1; i++) {
|
||||||
res = do_waiting(chan, timereqd, waitstart, timeout, wait_for);
|
res = do_waiting(chan, timereqd, waitstart, timeout, wait_for);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user