X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=audiod.c;h=8f6f3560ee37cb6cbb927630bb583937d51693db;hp=12e8f7bb4345df416f2cdc0bc4c615fa7609129f;hb=8cec3d1edb26b4861e2b5bdbb9f70241cdd7f03b;hpb=41f13bf6cac519b46ed24892e2c84384ef5dc500 diff --git a/audiod.c b/audiod.c index 12e8f7bb..8f6f3560 100644 --- a/audiod.c +++ b/audiod.c @@ -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)); @@ -632,8 +647,6 @@ static void open_filters(int slot_num) s->fc->out_loaded = &fn->loaded; } register_task(&s->fc->task); -// PARA_DEBUG_LOG("output loaded for filter chain %p: %p\n", s->fc, -// s->fc->out_loaded); } static struct filter_node *find_filter_node(int slot_num, int format, int filternum) @@ -663,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) @@ -682,7 +703,10 @@ static void open_writers(int slot_num) s->wng->buf = s->fc->outbuf; s->wng->loaded = s->fc->out_loaded; s->wng->input_eof = &s->fc->eof; + s->wng->channels = &s->fc->channels; + s->wng->samplerate = &s->fc->samplerate; s->fc->output_eof = &s->wng->eof; + PARA_INFO_LOG("samplerate: %d\n", *s->wng->samplerate); } else { s->wng->buf = s->receiver_node->buf; s->wng->loaded = &s->receiver_node->loaded; @@ -694,7 +718,7 @@ 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); + ret = wng_open(s->wng); /* FIXME */ s->wstime = *now; current_decoder = slot_num; activate_inactive_grab_clients(slot_num, s->format, &s->fc->filters); @@ -702,7 +726,7 @@ static void open_writers(int slot_num) static void rn_event_handler(struct task *t) { - struct receiver_node *rn = t->private_data; +// struct receiver_node *rn = t->private_data; PARA_NOTICE_LOG("%s\n", PARA_STRERROR(-t->ret)); unregister_task(t); } @@ -883,7 +907,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); @@ -894,22 +917,33 @@ static void audiod_pre_select(struct sched *s, __a_unused struct task *t) { int i; + t->ret = 1; now = &s->now; if (audiod_status != AUDIOD_ON) kill_all_decoders(); else if (playing) open_current_receiver(); FOR_EACH_SLOT(i) { - struct receiver_node *rn; + struct slot_info *s = &slot[i]; + struct audio_format_info *a; try_to_close_slot(i); - if (slot[i].format < 0) + if (s->format < 0) + continue; + a = &afi[s->format]; + if (!s->receiver_node) continue; - rn = slot[i].receiver_node; - if (rn && rn->loaded && !slot[i].wng) { + if (!a->num_filters) { + if (s->receiver_node->loaded && !s->wng) + open_writers(i); + continue; + } + if (s->receiver_node->loaded && !s->fc) { open_filters(i); - open_writers(i); + continue; } + if (s->fc && *s->fc->out_loaded && !s->wng) + open_writers(i); } } @@ -917,6 +951,7 @@ static void audiod_post_select(struct sched *s, __a_unused struct task *t) { /* only save away the current time for other users */ now = &s->now; + t->ret = 1; } static void init_audiod_task(struct task *t) @@ -1485,6 +1520,7 @@ void signal_setup_default(struct signal_task *st) static void command_pre_select(struct sched *s, struct task *t) { struct command_task *ct = t->private_data; + t->ret = 1; para_fd_set(ct->fd, &s->rfds, &s->max_fileno); } @@ -1494,9 +1530,9 @@ static void command_post_select(struct sched *s, struct task *t) int ret; struct command_task *ct = t->private_data; + t->ret = 1; /* always successful */ if (audiod_status != AUDIOD_OFF) audiod_status_dump(); - t->ret = 1; /* always successful */ if (!FD_ISSET(ct->fd, &s->rfds)) return; ret = handle_connect(ct->fd);