X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=audiod.c;h=60e7903fa11b22dcc82a9d84368d642ab932851a;hp=c93a05fe275186ec2b1275c770ec95f239041350;hb=e89405390dc82917fcde6c00393bd2dfd82ddbfa;hpb=86733a1bedc2e9358c9ac06ff8368217de3243e3 diff --git a/audiod.c b/audiod.c index c93a05fe..60e7903f 100644 --- a/audiod.c +++ b/audiod.c @@ -494,26 +494,16 @@ static void close_receiver(int slot_num) s->receiver_node = NULL; set_restart_barrier(s->format, NULL); } -static void close_writer(int slot_num) -{ - struct slot_info *s = &slot[slot_num]; - if (s->wng) { - PARA_INFO_LOG("slot %d: closing writer node group\n", - slot_num); - wng_close(s->wng); - s->wng = NULL; - } - if (s->fc) - *s->fc->output_eof = 1; /* FIXME */ -} - static void kill_all_decoders(void) { int i; - FOR_EACH_SLOT(i) - close_writer(i); + FOR_EACH_SLOT(i) { + struct slot_info *s = &slot[i]; + if (s->receiver_node) + s->receiver_node->eof = 1; + } } static void check_sigchld(void) @@ -626,6 +616,7 @@ static void open_filters(int slot_num) s->fc = NULL; if (!nf) return; + PARA_INFO_LOG("opening %s filters\n", audio_formats[s->format]); s->fc = para_calloc(sizeof(struct filter_chain)); INIT_LIST_HEAD(&s->fc->filters); s->fc->inbuf = s->receiver_node->buf; @@ -698,14 +689,12 @@ static void wng_event_handler(struct task *t) } } -static void start_stream_writer(int slot_num, struct timeval *now) +static void open_writer(int slot_num, struct timeval *now) { int ret, i; struct slot_info *s = &slot[slot_num]; struct audio_format_info *a = &afi[s->format]; - PARA_INFO_LOG("opening %s filters\n", audio_formats[s->format]); - open_filters(slot_num); PARA_INFO_LOG("opening %s writers\n", audio_formats[s->format]); if (!a->num_writers) s->wng = setup_default_wng(); @@ -777,16 +766,14 @@ static void open_receiver(int format) register_task(&rn->task); } -static int is_frozen(int format) +static int is_frozen(int format, struct timeval *now) { - struct timeval now; struct audio_format_info *a = &afi[format]; - gettimeofday(&now, NULL); - return (tv_diff(&now, &a->restart_barrier, NULL) > 0)? 0 : 1; + return (tv_diff(now, &a->restart_barrier, NULL) > 0)? 0 : 1; } -static void start_current_receiver(void) +static void start_current_receiver(struct timeval *now) { int i; @@ -795,7 +782,7 @@ static void start_current_receiver(void) i = get_audio_format_num(af_status); if (i < 0) return; - if ((decoder_running(i) & 1) || is_frozen(i)) + if ((decoder_running(i) & 1) || is_frozen(i, now)) return; open_receiver(i); } @@ -940,14 +927,14 @@ static void close_decoder_if_idle(int slot_num) clear_slot(slot_num); } -static void audiod_pre_select(__a_unused struct sched *s, __a_unused struct task *t) +static void audiod_pre_select(struct sched *s, __a_unused struct task *t) { int i; if (audiod_status != AUDIOD_ON) kill_all_decoders(); else if (playing) - start_current_receiver(); + start_current_receiver(&s->now); check_timeouts(); FOR_EACH_SLOT(i) { struct receiver_node *rn; @@ -957,8 +944,8 @@ static void audiod_pre_select(__a_unused struct sched *s, __a_unused struct task continue; rn = slot[i].receiver_node; if (rn && rn->loaded && !slot[i].wng) { - PARA_INFO_LOG("no writer in slot %d\n", i); - start_stream_writer(i, &s->now); + open_filters(i); + open_writer(i, &s->now); } } }