X-Git-Url: http://git.tuebingen.mpg.de/?a=blobdiff_plain;f=audiod.c;h=68c84fb4df31bf54266643e709b40918bce53fb7;hb=63ea5c449c9d944ffcfea2bba906ef42679fa996;hp=56014cad0e832931613abc6ac879dcde5c67c9b7;hpb=a95093cd8b62d411b9448aa77768774e1bdd81e5;p=paraslash.git diff --git a/audiod.c b/audiod.c index 56014cad..68c84fb4 100644 --- a/audiod.c +++ b/audiod.c @@ -105,7 +105,7 @@ static char *af_status, /* the audio format announced in server status */ *socket_name, *hostname; static char *stat_item_values[NUM_STAT_ITEMS]; static FILE *logfile; -static const struct timeval restart_delay = {0, 300 * 1000}; +static const struct timeval restart_delay = {0, 200 * 1000}; static struct audio_format_info afi[NUM_AUDIO_FORMATS]; static struct timeval *now; @@ -499,8 +499,22 @@ static void kill_all_decoders(void) FOR_EACH_SLOT(i) { struct slot_info *s = &slot[i]; - if (s->receiver_node) + if (s->wng && !s->wng->eof) { + PARA_INFO_LOG("unregistering writer node group in slot %d\n", + i); + wng_unregister(s->wng); + s->wng->eof = 1; + } + if (s->fc && !s->fc->eof) { + PARA_INFO_LOG("unregistering filter chain in slot %d\n", i); + unregister_task(&s->fc->task); + s->fc->eof = 1; + } + if (s->receiver_node && !s->receiver_node->eof) { + PARA_INFO_LOG("unregistering receiver_node in slot %d\n", i); + unregister_task(&s->receiver_node->task); s->receiver_node->eof = 1; + } } } @@ -610,12 +624,13 @@ static void open_filters(int slot_num) s->fc->inbuf = s->receiver_node->buf; s->fc->in_loaded = &s->receiver_node->loaded; s->fc->input_eof = &s->receiver_node->eof; - s->fc->task.pre_select = filter_pre_select; s->fc->task.event_handler = filter_event_handler; s->fc->task.private_data = s->fc; s->fc->task.flags = 0; s->fc->eof = 0; + + s->receiver_node->output_eof = &s->fc->eof; sprintf(s->fc->task.status, "filter chain"); for (i = 0; i < nf; i++) { struct filter_node *fn = para_calloc(sizeof(struct filter_node)); @@ -661,8 +676,16 @@ static struct filter_node *find_filter_node(int slot_num, int format, int filter static void wng_event_handler(struct task *t) { - PARA_INFO_LOG("%s\n", PARA_STRERROR(-t->ret)); - unregister_task(t); + struct writer_node_group *wng = t->private_data; + int i; + + wng_unregister(wng); + FOR_EACH_SLOT(i) { + struct slot_info *s = &slot[i]; + if (s->wng != wng) + continue; + PARA_INFO_LOG("slot %d: %s\n", i, PARA_STRERROR(-t->ret)); + } } static void open_writers(int slot_num) @@ -695,7 +718,11 @@ static void open_writers(int slot_num) s->wng->writer_nodes[i].writer = a->writers[i]; sprintf(s->wng->writer_nodes[i].task.status, "writer_node"); } - ret = wng_open(s->wng); /* FIXME */ + ret = wng_open(s->wng); + if (ret < 0) { + PARA_ERROR_LOG("%s\n", PARA_STRERROR(-ret)); + return; + } s->wstime = *now; current_decoder = slot_num; activate_inactive_grab_clients(slot_num, s->format, &s->fc->filters); @@ -793,7 +820,7 @@ static void compute_time_diff(const struct timeval *status_time) count > 10? sign : sign * time_smooth, &diff, &tmp); sa_time_diff = tmp; - PARA_INFO_LOG("time diff (cur/avg): %s%lums/%s%lums\n", + PARA_DEBUG_LOG("time diff (cur/avg): %s%lums/%s%lums\n", sign > 0? "+" : "-", tv2ms(&diff), sa_time_diff_sign ? "+" : "-", @@ -884,7 +911,6 @@ static void try_to_close_slot(int slot_num) return; PARA_INFO_LOG("closing slot %d \n", slot_num); wng_close(s->wng); - wng_destroy(s->wng); close_filters(s->fc); free(s->fc); close_receiver(slot_num);