[filter]: Do filter conversion during post_select.
authorAndre Noll <maan@systemlinux.org>
Sun, 2 Aug 2009 13:29:47 +0000 (15:29 +0200)
committerAndre Noll <maan@systemlinux.org>
Sun, 2 Aug 2009 13:29:47 +0000 (15:29 +0200)
This is more natural and allows to get rid of the hack that
forced a minimal timout in case something was converted.

audiod.c
filter.c
filter.h
filter_common.c

index eb3b200..d39f0f5 100644 (file)
--- a/audiod.c
+++ b/audiod.c
@@ -385,8 +385,8 @@ static void open_filters(int slot_num)
        s->fc->inbufp = &s->receiver_node->buf;
        s->fc->in_loaded = &s->receiver_node->loaded;
        s->fc->input_error = &s->receiver_node->task.error;
-       s->fc->task.pre_select = filter_pre_select;
-       s->fc->task.post_select = NULL;
+       s->fc->task.pre_select = NULL;
+       s->fc->task.post_select = filter_post_select;
        s->fc->task.error = 0;
        s->fc->num_filters = nf;
 
index 8814191..88e2336 100644 (file)
--- a/filter.c
+++ b/filter.c
@@ -84,7 +84,7 @@ static int init_filter_chain(void)
        fc->input_error = &sit->task.error;
        fc->task.error = 0;
        fc->output_error = &sot->task.error;
-       fc->task.pre_select = filter_pre_select;
+       fc->task.post_select = filter_post_select;
        sprintf(fc->task.status, "filter chain");
 
        FOR_EACH_FILTER_NODE(fn, fc, i) {
index 0bb51f5..b877b64 100644 (file)
--- a/filter.h
+++ b/filter.h
@@ -204,7 +204,7 @@ struct filter {
 void close_filters(struct filter_chain *fc);
 void filter_init(void);
 int check_filter_arg(char *filter_arg, void **conf);
-void filter_pre_select(__a_unused struct sched *s, struct task *t);
+void filter_post_select(__a_unused struct sched *s, struct task *t);
 void print_filter_helps(int detailed);
 
 static inline void write_int16_host_endian(char *buf, int val)
index 1b02e1c..2fa774c 100644 (file)
@@ -105,7 +105,7 @@ static void call_callbacks(struct filter_node *fn, char *inbuf, size_t inlen,
  *
  * \sa filter_node, filter#convert, filter_callback.
  */
-void filter_pre_select(__a_unused struct sched *s, struct task *t)
+void filter_post_select(__a_unused struct sched *s, struct task *t)
 {
        struct filter_chain *fc = container_of(t, struct filter_chain, task);
        struct filter_node *fn;
@@ -142,19 +142,6 @@ again:
        conv_total += conv;
        if (conv)
                goto again;
-       if (conv_total) {
-               /*
-                * Other pre_select functions might have already been called by
-                * now and decided to do nothing, e.g. because their output
-                * buffer was full or the input buffer was empty. We just
-                * converted something which caused these buffers to change but
-                * we can't make the other tasks reconsider their decision at
-                * this point.  So force a minimal timeout for the next select
-                * call to avoid unnecessary delays.
-                */
-               s->timeout.tv_sec = 0;
-               s->timeout.tv_usec = 1;
-       }
        if (*fc->input_error >= 0)
                return;
        if (*fc->out_loaded)