X-Git-Url: http://git.tuebingen.mpg.de/?a=blobdiff_plain;f=audiod.c;h=8e1da6e80e4c8c23e382cf367412274fd63fce69;hb=fdd8a22e1df57a8c9254e7d0074301e7dde2c557;hp=88599c3fa297337b6a3f598b31f92d6e6b4b0993;hpb=d5e27e2a346da2f18188d317926a60687d082732;p=paraslash.git diff --git a/audiod.c b/audiod.c index 88599c3f..8e1da6e8 100644 --- a/audiod.c +++ b/audiod.c @@ -445,7 +445,8 @@ static void close_receiver(int slot_num) task_reap(&s->receiver_node->task); free(s->receiver_node); s->receiver_node = NULL; - stat_task->current_audio_format_num = -1; + if (audiod_status == AUDIOD_ON) + stat_task->current_audio_format_num = -1; tv_add(now, &(struct timeval)EMBRACE(0, 200 * 1000), &a->restart_barrier); } @@ -479,6 +480,23 @@ static void close_writers(struct slot_info *s) s->wns = NULL; } +static void notify_writers(int error) +{ + int i; + + FOR_EACH_SLOT(i) { + struct slot_info *s = slot + i; + struct audio_format_info *a; + int j; + + if (s->format < 0) + continue; + a = afi + s->format; + for (j = 0; j < a->num_writers; j++) + task_notify(s->wns[j].task, error); + } +} + static void close_filters(struct slot_info *s) { int i; @@ -731,8 +749,8 @@ static void compute_time_diff(const struct timeval *status_time) if (count > 5) { int s = tv_diff(&diff, &stat_task->sa_time_diff, &tmp); if (tv_diff(&max_deviation, &tmp, NULL) < 0) - PARA_WARNING_LOG("time diff jump: %lums\n", - s * tv2ms(&tmp)); + PARA_WARNING_LOG("time diff jump: %c%lums\n", + s < 0? '-' : '+', tv2ms(&tmp)); } count++; sa_time_diff_sign = tv_convex_combination( @@ -1050,7 +1068,7 @@ static int signal_post_select(struct sched *s, void *context) case SIGINT: case SIGTERM: case SIGHUP: - PARA_NOTICE_LOG("received signal %d\n", signum); + PARA_WARNING_LOG("terminating on signal %d\n", signum); task_notify_all(s, E_AUDIOD_SIGNAL); return -E_AUDIOD_SIGNAL; } @@ -1076,7 +1094,7 @@ static int command_post_select(struct sched *s, void *context) return ret; ret = handle_connect(ct->fd, &s->rfds); if (ret < 0) { - PARA_ERROR_LOG("%s\n", para_strerror(-ret)); + PARA_NOTICE_LOG("%s\n", para_strerror(-ret)); if (ret == -E_AUDIOD_TERM) { task_notify_all(s, -ret); return ret; @@ -1217,8 +1235,9 @@ static void start_stop_decoders(void) struct slot_info *sl; close_unused_slots(); - if (audiod_status != AUDIOD_ON || - !(stat_task->vss_status & VSS_STATUS_FLAG_PLAYING)) + if (audiod_status != AUDIOD_ON) + return notify_writers(E_NOT_PLAYING); + if (!(stat_task->vss_status & VSS_STATUS_FLAG_PLAYING)) return notify_receivers(E_NOT_PLAYING); if (!must_start_decoder()) return; @@ -1491,8 +1510,7 @@ int main(int argc, char *argv[]) .context = signal_task, }, &sched); - sched.default_timeout.tv_sec = 2; - sched.default_timeout.tv_usec = 999 * 1000; + sched.default_timeout = 2999; ret = schedule(&sched); audiod_cleanup(); sched_shutdown(&sched);