diff options
author | russell <russell@f38db490-d61c-443f-a65b-d21fe96a405b> | 2008-06-26 15:37:01 +0000 |
---|---|---|
committer | russell <russell@f38db490-d61c-443f-a65b-d21fe96a405b> | 2008-06-26 15:37:01 +0000 |
commit | 5a1f7d897e1381e17edd9cc54271bb4ec2e3a56e (patch) | |
tree | 118582e660d2690096ebef4c51e0bd240a6507e0 | |
parent | 6cafe1a2572a8955f9a5f9e270fec7b12046b182 (diff) |
- 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: http://svn.digium.com/svn/asterisk/trunk@125332 f38db490-d61c-443f-a65b-d21fe96a405b
-rw-r--r-- | include/asterisk/timing.h | 10 | ||||
-rw-r--r-- | main/channel.c | 9 | ||||
-rw-r--r-- | main/timing.c | 14 | ||||
-rw-r--r-- | res/res_timing_dahdi.c | 7 | ||||
-rw-r--r-- | res/res_timing_pthread.c | 7 |
5 files changed, 45 insertions, 2 deletions
diff --git a/include/asterisk/timing.h b/include/asterisk/timing.h index f235e22b8..88f1fc17d 100644 --- a/include/asterisk/timing.h +++ b/include/asterisk/timing.h @@ -72,6 +72,7 @@ struct ast_timing_functions { int (*timer_enable_continuous)(int handle); int (*timer_disable_continuous)(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); +/*! + * \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) } #endif diff --git a/main/channel.c b/main/channel.c index 361d1fb78..a83c3c94d 100644 --- a/main/channel.c +++ b/main/channel.c @@ -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 res; + unsigned int real_rate = rate, max_rate; if (c->timingfd == -1) { return -1; @@ -2184,9 +2185,13 @@ int ast_settimeout(struct ast_channel *c, unsigned int rate, int (*func)(const v 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; + } + + 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, rate); + res = ast_timer_set_rate(c->timingfd, real_rate); c->timingfunc = func; c->timingdata = data; diff --git a/main/timing.c b/main/timing.c index 5f6023203..982186706 100644 --- a/main/timing.c +++ b/main/timing.c @@ -46,6 +46,7 @@ void *ast_install_timing_functions(struct ast_timing_functions *funcs) !funcs->timer_set_rate || !funcs->timer_ack || !funcs->timer_get_event || + !funcs->timer_get_max_rate || !funcs->timer_enable_continuous || !funcs->timer_disable_continuous) { return NULL; @@ -198,6 +199,19 @@ enum ast_timing_event ast_timer_get_event(int handle) 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) { int fd, count = 0; diff --git a/res/res_timing_dahdi.c b/res/res_timing_dahdi.c index 80b7b4977..55791e678 100644 --- a/res/res_timing_dahdi.c +++ b/res/res_timing_dahdi.c @@ -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_disable_continuous(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 = { .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_disable_continuous = dahdi_timer_disable_continuous, .timer_get_event = dahdi_timer_get_event, + .timer_get_max_rate = dahdi_timer_get_max_rate, }; 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) { int fd; diff --git a/res/res_timing_pthread.c b/res/res_timing_pthread.c index f0a1d0e98..3178434c0 100644 --- a/res/res_timing_pthread.c +++ b/res/res_timing_pthread.c @@ -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_disable_continuous(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 = { .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_disable_continuous = pthread_timer_disable_continuous, .timer_get_event = pthread_timer_get_event, + .timer_get_max_rate = pthread_timer_get_max_rate, }; /* 1 tick / 10 ms */ @@ -249,6 +251,11 @@ static enum ast_timing_event pthread_timer_get_event(int handle) 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) { struct pthread_timer *timer; |