]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
- add get_max_rate timing API call
authorRussell Bryant <russell@russellbryant.com>
Thu, 26 Jun 2008 15:37:01 +0000 (15:37 +0000)
committerRussell Bryant <russell@russellbryant.com>
Thu, 26 Jun 2008 15:37:01 +0000 (15:37 +0000)
- 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

include/asterisk/timing.h
main/channel.c
main/timing.c
res/res_timing_dahdi.c
res/res_timing_pthread.c

index f235e22b8430a6c86e790a2c9e719989f3475dfc..88f1fc17d7f0ec7bbf4f0f8e0ba4fb6c24e4bce8 100644 (file)
@@ -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
index 361d1fb783aae4899b91134f943df581464f8f02..a83c3c94dc3a9e03eef5bf84989813f77bc6b26d 100644 (file)
@@ -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;
index 5f602320355368736551907a93a563c0625f0670..982186706713f455e85018596fa465a08a034d06 100644 (file)
@@ -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;
index 80b7b497794f0cacca7032b192a9cb190c63a9b5..55791e67825db0ab197a615f6eb4f9db161b7911 100644 (file)
@@ -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;
index f0a1d0e983dac078a5cf1f472da61c306852669d..3178434c05204795b134a5e5266cfe76671e4ec2 100644 (file)
@@ -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;