X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=audiod.c;h=e6e9041801e416828d76556929d4a2f7033a1de3;hp=0629d7c6add39b778b42567d002cdd7e31bdd45c;hb=6693375b52f2712ace6dc50b717de9cb371a7c2a;hpb=98d0c34a0377546a4ed0062ad32e8161d611d6e6 diff --git a/audiod.c b/audiod.c index 0629d7c6..e6e90418 100644 --- a/audiod.c +++ b/audiod.c @@ -37,6 +37,7 @@ #include "write.h" #include "write_common.h" #include "error.h" +#include "signal.h" /** define the array of error lists needed by para_audiod */ INIT_AUDIOD_ERRLISTS; @@ -262,7 +263,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) @@ -488,7 +494,7 @@ static void compute_time_diff(const struct timeval *status_time) sa_time_diff_sign = sign; stat_task->sa_time_diff = diff; count++; - return; + goto out; } if (count > 5) { int s = tv_diff(&diff, &stat_task->sa_time_diff, &tmp); @@ -502,12 +508,14 @@ 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 ? "+" : "-", tv2ms(&stat_task->sa_time_diff) ); +out: + stat_task->sa_time_diff_sign = sa_time_diff_sign; } static void check_stat_line(char *line) @@ -525,6 +533,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 +572,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 +1004,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 +1066,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"); }