X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=filter.h;h=bf99a677b7c0b6e5cab95111834ad031c19c7619;hp=15bfaf8cdb0c2533c463fe8272d21e5528b80dbd;hb=fdd1f83d38148ecb76aac90ec02b12a985de8821;hpb=43e0a7f669d782e73513119b7140dc4e56bcc3d7 diff --git a/filter.h b/filter.h index 15bfaf8c..bf99a677 100644 --- a/filter.h +++ b/filter.h @@ -32,6 +32,9 @@ struct filter_node { struct list_head callbacks; /** A pointer to the configuration of this instance. */ void *conf; + struct btr_node *btrn; + struct task task; + size_t min_iqs; }; /** Describes one running instance of a chain of filters */ @@ -81,49 +84,6 @@ struct filter_chain { #define FOR_EACH_FILTER_NODE(fn, fc, i) for (i = 0; i < (fc)->num_filters \ && (fn = (fc)->filter_nodes + i); i++) - -/** - * Used to manage grab clients. - * - * An application using paraslash's filter subsystem may register any number of - * callbacks for each filter_node. It is possible to attach a filter callback - * while the filter is running. This is used for stream grabbing in - * para_audiod: Whenever a client sends the 'grab' command, para_audiod adds a - * filter callback to the list of callbacks for the filter node specified in - * the grab command. - */ -struct filter_callback { - /** All callbacks are organized in a doubly linked list. */ - struct list_head node; - /** - * The input callback. - * - * If not \p NULL, the filter subsystem calls this function whenever the filter - * consumed some or all of its input buffer. A pointer to the buffer of consumed - * data, its length and a pointer to the own \a filter_callback structure are passed - * to \a input_cb. The input callback is expected to return a negative value on errors. - */ - int (*input_cb)(char *buf, size_t len, struct filter_callback *fc); - /** - * The output callback. - * - * If not NULL, this is called whenever the filter produces output. A pointer - * to the output data, its length and a pointer to the own \a filter_callback - * structure are passed to \a output_cb. Like the input callback, the output - * callback is expected to return a negative value on errors. - */ - int (*output_cb)(char *buf, size_t len, struct filter_callback *fc); - /** - * The callback close function. - * - * This gets called whenever the input/output callback returned an error, or if - * the filter chain is going to be destroyed, e.g. because the end of the - * stream was encountered. It is assumed to succeed. - */ - void (*close)(struct filter_callback *fc); -}; - - /** * The structure associated with a paraslash filter. * @@ -155,19 +115,6 @@ struct filter { * of \a fn suitably. The open function is assumed to succeed. */ void (*open)(struct filter_node *fn); - /** - * Convert (filter) the given data. - * - * Pointer to the converting function of the filter. It should convert the - * given input buffer \a inbuf which is of length \a len to the previously - * reserved output buffer of \a fn. On success, it must return the number of - * bytes it consumed from \a inbuf. On errors, a negative number indicating the - * kind of the error must be returned. - * - * A zero return value just means that nothing was converted (probably because - * the input buffer was too small). This is not interpreted as an error. - */ - ssize_t (*convert)(char *inbuf, size_t len, struct filter_node *fn); /** * Close one instance of this filter. * @@ -188,16 +135,26 @@ struct filter { * argv. On failure, a negative paraslash error code must be returned. */ int (*parse_config)(int argc, char **argv, void **config); + void (*free_config)(void *conf); /** The help texts for this filter. */ struct ggo_help help; + void (*pre_select)(struct sched *s, struct task *t); + /** + * 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. + */ + void (*post_select)(struct sched *s, struct task *t); + btr_command_handler execute; }; -void close_filters(struct filter_chain *fc); void filter_init(void); int check_filter_arg(char *filter_arg, void **conf); -void filter_post_select(__a_unused struct sched *s, struct task *t); void print_filter_helps(int detailed); +void generic_filter_pre_select(struct sched *s, struct task *t); static inline void write_int16_host_endian(char *buf, int val) {