- size_t *out_loaded;
- /** non-zero if this filter wont' produce any more output */
- int eof;
- /** pointer to the eof flag of the receiving application */
- int *input_eof;
- /** pointer to the eof flag of the writing application */
- int *output_eof;
- /** the task associated with the filter chain */
- struct task task;
-};
-
-/**
- * describes one running instance of a filter
-*/
-struct filter_node {
-/**
- *
- *
- * a pointer to the corresponding filter struct
- */
- struct filter *filter;
-/**
- *
- *
- * the filter chain this filter node belongs to
- */
- struct filter_chain *fc;
-/**
- *
- *
- * the position of the filter in the corresponding filter chain
- *
- * all filters that make up the filter chains are organized in a doubly
- * linked list.
- */
- struct list_head node;
-/**
- *
- *
- * 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;
-};
-
-/**
- * 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;
-/**
- *
- *
- * private data
- *
- * May be initialized by the application before registering the callback. This
- * pointer is not used by the filter subsystem. It is provided for use within
- * the input/ouput/close callback functions.
- */
- void *data;
-/**
- *
- *
- * the input callback
- *
- * In 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/ouput callback returned an error, or if
- * the filter chain is going to be destroyed, e.g. because the end of the
- * stream was encounterd. It is assumed to succeed.
- */
- void (*close)(struct filter_callback *fc);
-};
-
-
-void close_filters(struct filter_chain *fc);
-int filter_io(struct filter_chain *fc);
-void filter_init(struct filter *all_filters);
-int check_filter_arg(char *filter_arg, void **conf);
-int del_filter_callback(struct filter_callback *fcb);
-void filter_pre_select(struct sched *s, struct task *t);
-
-/**
- * the structure associated with a paraslash filter
- *
- * Paraslash filters are "modules" which are used to transform an audio stream.
- * struct filter contains pointers to functions that must be supplied by the
- * filter code in order to be used by the driving application (currently
- * para_audiod and para_filter).
- *
- * Note: As several instances of the same filter may be running at the same
- * time, all these filter functions must be reentrant; no static non-constant
- * variables may be used.
- * \sa mp3dec.c, oggdec.c, wav.c, compress.c, filter_node
- */
-struct filter {
-/**
- *
- *
- * the name of the filter
- */
-const char *name;
-/**
- *
- *
- * pointer to the filter init routine
- *
- * This function is only called once at startup. It must initialize the
- * other non-optional function pointers of \a f.
- */
-void (*init)(struct filter *f);
-/**
- *
- *
- * 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.
- */
-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 previoulsy
- * 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
- *
- * Free all resources of associated with \a fn that were previously allocated
- * by the open() function.
- */
-void (*close)(struct filter_node *fn);
-/**
- *
- *
- * print the help text for this filter and exit
- *
- * This is optional and it is not necessary to initialize this pointer if
- * the filter does not have a help text.
- */
-void (*print_help)(void);
-/**
- *
- *
- * a pointer to the filter's command line parser
- *
- * If this optional function pointer is not NULL, any filter options are passed
- * from the main propgram to this command line parser once at application
- * startup. The command line parser should check its command line options given
- * by \a argc and \a argv and abort on errors. On success, it should return a
- * pointer to the filter-specific configuration data determined by \a argc and
- * \a argv.
- */
-void *(*parse_config)(int argc, char **argv);