From 3392bf543022cae60dad0ed76486b574a76b1d66 Mon Sep 17 00:00:00 2001 From: Andre Date: Sun, 24 Sep 2006 11:26:31 +0200 Subject: [PATCH] new audiod option: clock_diff_count --- audiod.c | 52 ++++++++++++++++++++++++++++++++++++++-------------- audiod.ggo | 14 ++++++++++++++ audiod.h | 4 ++++ 3 files changed, 56 insertions(+), 14 deletions(-) diff --git a/audiod.c b/audiod.c index 0629d7c6..40c75952 100644 --- 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"); } diff --git a/audiod.ggo b/audiod.ggo index 21b485fb..66e81a11 100644 --- a/audiod.ggo +++ b/audiod.ggo @@ -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." diff --git a/audiod.h b/audiod.h index 6f64a5b7..234c67a0 100644 --- 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; -- 2.39.5