X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=audiod.c;h=40c75952570eb60c09ddf7904eda43cc37f90108;hp=c88facc798506c7ec567be774044780b872a500d;hb=0c4a3b0f50cf6cdf21e13441b76b7bf963cd6876;hpb=92072448134082d506c35be789f59f24dec4eaef diff --git a/audiod.c b/audiod.c index c88facc7..40c75952 100644 --- a/audiod.c +++ b/audiod.c @@ -41,7 +41,7 @@ /** define the array of error lists needed by para_audiod */ INIT_AUDIOD_ERRLISTS; /** define the array containing all supported audio formats */ -DEFINE_AUDIO_FORMAT_ARRAY; +const char *audio_formats[] = {AUDIOD_AUDIO_FORMAT_ARRAY NULL}; /** defines how to handle one supported audio format */ struct audio_format_info { @@ -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) @@ -456,10 +461,12 @@ static int open_current_receiver(struct sched *s) { int i; struct timeval diff; + char *audio_format = stat_task->stat_item_values[SI_FORMAT]; - if (!stat_task->af_status || !stat_task->pcd) + if (!audio_format || !stat_task->pcd) return 0; - i = get_audio_format_num(stat_task->af_status); + i = get_audio_format_num(audio_format + strlen( + status_item_list[SI_FORMAT]) + 1); if (i < 0) return 0; if (receiver_running(i)) @@ -500,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 ? "+" : "-", @@ -523,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); @@ -533,10 +542,6 @@ static void check_stat_line(char *line) case SI_STATUS: stat_task->playing = strstr(line, "playing")? 1 : 0; break; - case SI_FORMAT: - free(stat_task->af_status); - stat_task->af_status = para_strdup(line + ilen + 1); - break; case SI_OFFSET: stat_task->offset_seconds = atoi(line + ilen + 1); break; @@ -564,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; } } @@ -641,10 +648,6 @@ static void audiod_pre_select(struct sched *s, __a_unused struct task *t) if (!sl->fc || !*sl->fc->out_loaded || sl->wng) continue; if (tv_diff(now, &initial_delay_barrier, &diff) > 0) { - PARA_INFO_LOG("barrier: %lu:%lu, now: %lu, %lu\n", - initial_delay_barrier.tv_sec, - initial_delay_barrier.tv_usec, - now->tv_sec, now->tv_usec); open_writers(i); s->timeout = min_delay; continue; @@ -759,7 +762,6 @@ static int init_receivers(void) for (i = conf.receiver_given - 1; i >= 0; i--) { char *arg = conf.receiver_arg[i]; char *recv_arg = strchr(arg, ':'); - PARA_INFO_LOG("arg: %s\n", arg); ret = -E_MISSING_COLON; if (!recv_arg) goto out; @@ -999,35 +1001,58 @@ 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) { struct status_task *st = t->private_data; + unsigned bytes_left; t->ret = 1; - if (!st->pcd || !st->pcd->loaded - || st->pcd->status != CL_RECEIVING) + if (!st->pcd || st->pcd->status != CL_RECEIVING) return; - st->pcd->loaded = for_each_line(st->pcd->buf, st->pcd->loaded, + bytes_left = for_each_line(st->pcd->buf, st->pcd->loaded, &check_stat_line); + if (st->pcd->loaded != bytes_left) { + st->last_status_read = *now; + st->pcd->loaded = bytes_left; + } else { + struct timeval diff; + tv_diff(now, &st->last_status_read, &diff); + if (diff.tv_sec > 61) + close_stat_pipe(); + } } static void init_status_task(struct status_task *st) @@ -1038,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"); }