filter: Make ->open() optional.
[paraslash.git] / filter.h
index e7dc1ca632684b928236aa9d6a7e86317c626cdf..0bd546903927d412fccef946cf8f43783ed8bc70 100644 (file)
--- a/filter.h
+++ b/filter.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2005-2009 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 2005 Andre Noll <maan@tuebingen.mpg.de>
  *
  * Licensed under the GPL v2. For licencing details see COPYING.
  */
@@ -15,25 +15,20 @@ enum filter_enum {FILTER_ENUM};
 struct filter_node {
        /** The number in the array of available filters. */
        unsigned filter_num;
-       /** The filter chain this filter node belongs to. */
-       struct filter_chain *fc;
        /**
         * Each filter may store any filter-specific information about the particular
         * instance of the filter here.
         */
        void *private_data;
-       /** The output buffer. */
-       char *buf;
-       /** The size of the output buffer. */
-       size_t bufsize;
-       /** The number of bytes currently loaded in \a buf. */
-       size_t loaded;
        /** The list of registered callbacks. */
        struct list_head callbacks;
        /** A pointer to the configuration of this instance. */
        void *conf;
+       /** The buffer tree node. */
        struct btr_node *btrn;
-       struct task task;
+       /** The task corresponding to this filter node. */
+       struct task *task;
+       /** The minimal input queue size, see \ref btr_node_status(). */
        size_t min_iqs;
 };
 
@@ -63,16 +58,18 @@ struct filter {
        /**
         * Open one instance of this filter.
         *
-        * This should allocate the output buffer of the given filter node and do any
-        * other filter-specific preparations like initializing the private_data member
-        * of \a fn suitably. The open function is assumed to succeed.
+        * This should allocate the output buffer of the given filter node and
+        * do any other filter-specific preparations like initializing the
+        * private_data member of \a fn suitably. The open function is
+        * optional, If it is provided, it is assumed to succeed.
         */
        void (*open)(struct filter_node *fn);
        /**
         * Close one instance of this filter.
         *
-        * Free all resources of associated with \a fn that were previously allocated
-        * by the open() function.
+        * Free all resources associated with \a fn that were previously
+        * allocated by the open() function. It's OK to set this to NULL if the
+        * filter does not need to perform any cleanup operation.
         */
        void (*close)(struct filter_node *fn);
        /**
@@ -88,26 +85,48 @@ struct filter {
         * argv. On failure, a negative paraslash error code must be returned.
         */
        int (*parse_config)(int argc, char **argv, void **config);
+       /**
+        * Deallocate the memory for the configuration.
+        *
+        * This is called to free whatever ->parse_config() has allocated.
+        */
        void (*free_config)(void *conf);
 
        /** The help texts for this filter. */
        struct ggo_help help;
-       void (*pre_select)(struct sched *s, struct task *t);
+       /**
+        * Set scheduler timeout and add file descriptors to fd sets.
+        *
+        * This function controls the timeout value for the next call to
+        * select(2). It may decrease the current timeout but shall never
+        * increase it. The second purpose of this function is to add file
+        * descriptors to the two fd sets of the sched structure. The
+        * descriptors in these sets will be watched by the subsequent
+        * select(2) call.
+        */
+       void (*pre_select)(struct sched *s, void *context);
        /**
         * Convert (filter) the given data.
         *
-        * Pointer to the converting function of the filter. It should convert as
-        * input data as possible. On errors, the post_select function is supposed
-        * to set t->error to a (negative) error code.
+        * Pointer to the converting function of the filter. On errors, the
+        * post_select function is supposed to return a negative error code.
+        */
+       int (*post_select)(struct sched *s, void *context);
+       /**
+        * Answer a buffer tree query.
+        *
+        * This optional function pointer is used for inter node communications
+        * of the buffer tree nodes. See \ref btr_command_handler for details.
         */
-       void (*post_select)(struct sched *s, struct task *t);
        btr_command_handler execute;
 };
 
 void filter_init(void);
-int check_filter_arg(char *filter_arg, void **conf);
-void print_filter_helps(int detailed);
-void generic_filter_pre_select(struct sched *s, struct task *t);
+int check_filter_arg(const char *fa, void **conf);
+void print_filter_helps(unsigned flags);
+void generic_filter_pre_select(struct sched *s, void *context);
+int decoder_execute(const char *cmd, unsigned sample_rate, unsigned channels,
+               char **result);
 
 static inline void write_int16_host_endian(char *buf, int val)
 {
@@ -122,7 +141,4 @@ static inline void write_int16_host_endian(char *buf, int val)
 
 DECLARE_FILTER_INITS
 
-#define FOR_EACH_SUPPORTED_FILTER(j)  for (j = 0; j < NUM_SUPPORTED_FILTERS; j++)
-
-/** The filter array, one structure for each supported filter. */
-extern struct filter filters[NUM_SUPPORTED_FILTERS];
+const struct filter *filter_get(int filter_num);