new audiod option: clock_diff_count
authorAndre <maan@meins.(none)>
Sun, 24 Sep 2006 09:26:31 +0000 (11:26 +0200)
committerAndre <maan@meins.(none)>
Sun, 24 Sep 2006 09:26:31 +0000 (11:26 +0200)
audiod.c
audiod.ggo
audiod.h

index 0629d7c6add39b778b42567d002cdd7e31bdd45c..40c75952570eb60c09ddf7904eda43cc37f90108 100644 (file)
--- a/audiod.c
+++ b/audiod.c
@@ -262,7 +262,12 @@ static void close_stat_pipe(void)
        stat_task->stat_item_values[SI_STATUS_BAR] = make_message(
                "%s:no connection to para_server\n",
                status_item_list[SI_STATUS_BAR]);
-       stat_client_write(stat_task->stat_item_values[SI_STATUS_BAR], SI_STATUS_BAR);
+       stat_client_write(stat_task->stat_item_values[SI_STATUS_BAR],
+               SI_STATUS_BAR);
+       if (stat_task->clock_diff_count) {
+               stat_task->clock_diff_barrier.tv_sec = now->tv_sec + 1;
+               stat_task->clock_diff_barrier.tv_usec = now->tv_usec;
+       }
 }
 
 void __noreturn clean_exit(int status, const char *msg)
@@ -502,7 +507,7 @@ static void compute_time_diff(const struct timeval *status_time)
                count > 10? sign : sign * time_smooth, &diff,
                &tmp);
        stat_task->sa_time_diff = tmp;
-       PARA_DEBUG_LOG("time diff (cur/avg): %s%lums/%s%lums\n",
+       PARA_INFO_LOG("time diff (cur/avg): %s%lums/%s%lums\n",
                sign > 0? "+" : "-",
                tv2ms(&diff),
                sa_time_diff_sign ? "+" : "-",
@@ -525,6 +530,8 @@ static void check_stat_line(char *line)
                PARA_WARNING_LOG("invalid status line: %s\n", line);
                return;
        }
+       if (stat_task->clock_diff_count && itemnum != SI_CURRENT_TIME)
+               return;
        tmp = make_message("%s\n", line);
        stat_client_write(tmp, itemnum);
        free(tmp);
@@ -562,6 +569,8 @@ static void check_stat_line(char *line)
                        struct timeval tv = {sec, usec};
                        compute_time_diff(&tv);
                }
+               if (stat_task->clock_diff_count)
+                       stat_task->clock_diff_count--;
                break;
        }
 }
@@ -992,23 +1001,37 @@ static void status_event_handler(__a_unused struct task *t)
 static void status_pre_select(struct sched *s, struct task *t)
 {
        struct status_task *st = t->private_data;
-       int argc = 2;
-       char *argv[] = {"audiod", "stat", NULL};
+
        t->ret = 1;
        if (st->pcd && (audiod_status == AUDIOD_OFF || st->pcd->eof))
                close_stat_pipe();
-       if (!st->pcd && audiod_status != AUDIOD_OFF
-               && tv_diff(now, &st->restart_barrier, NULL) > 0) {
-               t->ret = client_parse_config(argc, argv, &st->pcd);
-               if (t->ret < 0)
-                       return;
-               t->ret = client_open(st->pcd);
-               if (t->ret < 0)
+       if (st->pcd || audiod_status == AUDIOD_OFF)
+               return;
+       if (!st->clock_diff_count && tv_diff(now, &st->restart_barrier, NULL)
+                       < 0)
+               return;
+       if (st->clock_diff_count) {
+               char *argv[] = {"audiod", "stat", "1", NULL};
+               int argc = 3;
+               if (tv_diff(now, &st->clock_diff_barrier, NULL) < 0)
                        return;
-               st->pcd->task.event_handler = client_task_event_handler;
-               s->timeout.tv_sec = 0;
-               s->timeout.tv_usec = 1;
+               PARA_INFO_LOG("clock diff count: %d\n", st->clock_diff_count);
+               t->ret = client_parse_config(argc, argv, &st->pcd);
+
+       } else {
+               char *argv[] = {"audiod", "stat", NULL};
+               int argc = 2;
+               t->ret = client_parse_config(argc, argv, &st->pcd);
        }
+
+       if (t->ret < 0)
+               return;
+       t->ret = client_open(st->pcd);
+       if (t->ret < 0)
+               return;
+       st->pcd->task.event_handler = client_task_event_handler;
+       s->timeout.tv_sec = 0;
+       s->timeout.tv_usec = 1;
 }
 
 static void status_post_select(__a_unused struct sched *s, struct task *t)
@@ -1040,6 +1063,7 @@ static void init_status_task(struct status_task *st)
        st->task.event_handler = status_event_handler;
        st->task.private_data = st;
        st->sa_time_diff_sign = 1;
+       st->clock_diff_count = conf.clock_diff_count_arg;
        sprintf(st->task.status, "status task");
 }
 
index 21b485fb4dd46c9717e7eb7a21ed98529cd2b59a..66e81a1129ada287f07a1c815ecd507fc9544f54 100644 (file)
@@ -85,6 +85,20 @@ connect."
        multiple
 
 
+option "clock_diff_count" -
+#~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+"check the clock difference between
+server_host (the host running para_server)
+and the local host (running para_audiod)
+that many times before starting any stream
+I/0. Set this to non-zero for non-local
+setups if the clocks of these two hosts are
+not syncronized by ntp or similar."
+
+       int typestr="count"
+       default="0"
+       optional
 
 
 section "stream i/o options."
index 6f64a5b7cef17305bd521988becaeeaa05bf8381..234c67a0d9eb9d09643544a498d96e5be5d69093 100644 (file)
--- a/audiod.h
+++ b/audiod.h
@@ -77,6 +77,10 @@ struct status_task {
        int sa_time_diff_sign;
        /** non-zero if para_server's status is "playing" */
        int playing;
+       /** number of times the clock difference is to be checked */
+       unsigned clock_diff_count;
+       /** when to start the next check for clock difference */
+       struct timeval clock_diff_barrier;
 };
 
 extern struct status_task *stat_task;