mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-04 03:50:31 +00:00
- add get_max_rate timing API call
- change ast_settimeout() to honor max rate in edge cases of file playback (this will make some warning messages go away at the end of playing back a file) git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@125332 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
@@ -72,6 +72,7 @@ struct ast_timing_functions {
|
|||||||
int (*timer_enable_continuous)(int handle);
|
int (*timer_enable_continuous)(int handle);
|
||||||
int (*timer_disable_continuous)(int handle);
|
int (*timer_disable_continuous)(int handle);
|
||||||
enum ast_timing_event (*timer_get_event)(int handle);
|
enum ast_timing_event (*timer_get_event)(int handle);
|
||||||
|
unsigned int (*timer_get_max_rate)(int handle);
|
||||||
};
|
};
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -175,6 +176,15 @@ int ast_timer_disable_continuous(int handle);
|
|||||||
*/
|
*/
|
||||||
enum ast_timing_event ast_timer_get_event(int handle);
|
enum ast_timing_event ast_timer_get_event(int handle);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* \brief Get maximum rate supported for a timing handle
|
||||||
|
*
|
||||||
|
* \arg handle timing fd returned by timer_open()
|
||||||
|
*
|
||||||
|
* \return maximum rate supported for timing handle
|
||||||
|
*/
|
||||||
|
unsigned int ast_timer_get_max_rate(int handle);
|
||||||
|
|
||||||
#if defined(__cplusplus) || defined(c_plusplus)
|
#if defined(__cplusplus) || defined(c_plusplus)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@@ -2174,6 +2174,7 @@ int ast_waitfordigit(struct ast_channel *c, int ms)
|
|||||||
int ast_settimeout(struct ast_channel *c, unsigned int rate, int (*func)(const void *data), void *data)
|
int ast_settimeout(struct ast_channel *c, unsigned int rate, int (*func)(const void *data), void *data)
|
||||||
{
|
{
|
||||||
int res;
|
int res;
|
||||||
|
unsigned int real_rate = rate, max_rate;
|
||||||
|
|
||||||
if (c->timingfd == -1) {
|
if (c->timingfd == -1) {
|
||||||
return -1;
|
return -1;
|
||||||
@@ -2184,9 +2185,13 @@ int ast_settimeout(struct ast_channel *c, unsigned int rate, int (*func)(const v
|
|||||||
data = NULL;
|
data = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
ast_debug(1, "Scheduling timer at %u timer ticks per second\n", rate);
|
if (rate && rate > (max_rate = ast_timer_get_max_rate(c->timingfd))) {
|
||||||
|
real_rate = max_rate;
|
||||||
|
}
|
||||||
|
|
||||||
res = ast_timer_set_rate(c->timingfd, rate);
|
ast_debug(1, "Scheduling timer at (%u requested / %u actual) timer ticks per second\n", rate, real_rate);
|
||||||
|
|
||||||
|
res = ast_timer_set_rate(c->timingfd, real_rate);
|
||||||
|
|
||||||
c->timingfunc = func;
|
c->timingfunc = func;
|
||||||
c->timingdata = data;
|
c->timingdata = data;
|
||||||
|
@@ -46,6 +46,7 @@ void *ast_install_timing_functions(struct ast_timing_functions *funcs)
|
|||||||
!funcs->timer_set_rate ||
|
!funcs->timer_set_rate ||
|
||||||
!funcs->timer_ack ||
|
!funcs->timer_ack ||
|
||||||
!funcs->timer_get_event ||
|
!funcs->timer_get_event ||
|
||||||
|
!funcs->timer_get_max_rate ||
|
||||||
!funcs->timer_enable_continuous ||
|
!funcs->timer_enable_continuous ||
|
||||||
!funcs->timer_disable_continuous) {
|
!funcs->timer_disable_continuous) {
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -198,6 +199,19 @@ enum ast_timing_event ast_timer_get_event(int handle)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsigned int ast_timer_get_max_rate(int handle)
|
||||||
|
{
|
||||||
|
unsigned int res;
|
||||||
|
|
||||||
|
ast_rwlock_rdlock(&lock);
|
||||||
|
|
||||||
|
res = timer_funcs.timer_get_max_rate(handle);
|
||||||
|
|
||||||
|
ast_rwlock_unlock(&lock);
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
static char *timing_test(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
|
static char *timing_test(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
|
||||||
{
|
{
|
||||||
int fd, count = 0;
|
int fd, count = 0;
|
||||||
|
@@ -51,6 +51,7 @@ static void dahdi_timer_ack(int handle, unsigned int quantity);
|
|||||||
static int dahdi_timer_enable_continuous(int handle);
|
static int dahdi_timer_enable_continuous(int handle);
|
||||||
static int dahdi_timer_disable_continuous(int handle);
|
static int dahdi_timer_disable_continuous(int handle);
|
||||||
static enum ast_timing_event dahdi_timer_get_event(int handle);
|
static enum ast_timing_event dahdi_timer_get_event(int handle);
|
||||||
|
static unsigned int dahdi_timer_get_max_rate(int handle);
|
||||||
|
|
||||||
static struct ast_timing_functions dahdi_timing_functions = {
|
static struct ast_timing_functions dahdi_timing_functions = {
|
||||||
.timer_open = dahdi_timer_open,
|
.timer_open = dahdi_timer_open,
|
||||||
@@ -60,6 +61,7 @@ static struct ast_timing_functions dahdi_timing_functions = {
|
|||||||
.timer_enable_continuous = dahdi_timer_enable_continuous,
|
.timer_enable_continuous = dahdi_timer_enable_continuous,
|
||||||
.timer_disable_continuous = dahdi_timer_disable_continuous,
|
.timer_disable_continuous = dahdi_timer_disable_continuous,
|
||||||
.timer_get_event = dahdi_timer_get_event,
|
.timer_get_event = dahdi_timer_get_event,
|
||||||
|
.timer_get_max_rate = dahdi_timer_get_max_rate,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int dahdi_timer_open(void)
|
static int dahdi_timer_open(void)
|
||||||
@@ -128,6 +130,11 @@ static enum ast_timing_event dahdi_timer_get_event(int handle)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static unsigned int dahdi_timer_get_max_rate(int handle)
|
||||||
|
{
|
||||||
|
return 1000;
|
||||||
|
}
|
||||||
|
|
||||||
static int dahdi_test_timer(void)
|
static int dahdi_test_timer(void)
|
||||||
{
|
{
|
||||||
int fd;
|
int fd;
|
||||||
|
@@ -46,6 +46,7 @@ static void pthread_timer_ack(int handle, unsigned int quantity);
|
|||||||
static int pthread_timer_enable_continuous(int handle);
|
static int pthread_timer_enable_continuous(int handle);
|
||||||
static int pthread_timer_disable_continuous(int handle);
|
static int pthread_timer_disable_continuous(int handle);
|
||||||
static enum ast_timing_event pthread_timer_get_event(int handle);
|
static enum ast_timing_event pthread_timer_get_event(int handle);
|
||||||
|
static unsigned int pthread_timer_get_max_rate(int handle);
|
||||||
|
|
||||||
static struct ast_timing_functions pthread_timing_functions = {
|
static struct ast_timing_functions pthread_timing_functions = {
|
||||||
.timer_open = pthread_timer_open,
|
.timer_open = pthread_timer_open,
|
||||||
@@ -55,6 +56,7 @@ static struct ast_timing_functions pthread_timing_functions = {
|
|||||||
.timer_enable_continuous = pthread_timer_enable_continuous,
|
.timer_enable_continuous = pthread_timer_enable_continuous,
|
||||||
.timer_disable_continuous = pthread_timer_disable_continuous,
|
.timer_disable_continuous = pthread_timer_disable_continuous,
|
||||||
.timer_get_event = pthread_timer_get_event,
|
.timer_get_event = pthread_timer_get_event,
|
||||||
|
.timer_get_max_rate = pthread_timer_get_max_rate,
|
||||||
};
|
};
|
||||||
|
|
||||||
/* 1 tick / 10 ms */
|
/* 1 tick / 10 ms */
|
||||||
@@ -249,6 +251,11 @@ static enum ast_timing_event pthread_timer_get_event(int handle)
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static unsigned int pthread_timer_get_max_rate(int handle)
|
||||||
|
{
|
||||||
|
return MAX_RATE;
|
||||||
|
}
|
||||||
|
|
||||||
static struct pthread_timer *find_timer(int handle, int unlink)
|
static struct pthread_timer *find_timer(int handle, int unlink)
|
||||||
{
|
{
|
||||||
struct pthread_timer *timer;
|
struct pthread_timer *timer;
|
||||||
|
Reference in New Issue
Block a user