Open the filters from within audiod_pre_select()
[paraslash.git] / audiod.c
index c93a05fe275186ec2b1275c770ec95f239041350..60e7903fa11b22dcc82a9d84368d642ab932851a 100644 (file)
--- 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);
                }
        }
 }