aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrussell <russell@f38db490-d61c-443f-a65b-d21fe96a405b>2008-06-26 15:37:01 +0000
committerrussell <russell@f38db490-d61c-443f-a65b-d21fe96a405b>2008-06-26 15:37:01 +0000
commit5a1f7d897e1381e17edd9cc54271bb4ec2e3a56e (patch)
tree118582e660d2690096ebef4c51e0bd240a6507e0
parent6cafe1a2572a8955f9a5f9e270fec7b12046b182 (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.h10
-rw-r--r--main/channel.c9
-rw-r--r--main/timing.c14
-rw-r--r--res/res_timing_dahdi.c7
-rw-r--r--res/res_timing_pthread.c7
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;