X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=filter.h;h=500a85379bd42b0dabdea4383d875a4f2180b640;hp=5cb7aaf83622629ec8184f17b44174b011aed4dd;hb=2b8ac364a9ad11f67bfc1cdd01c113bde30baaf7;hpb=335730538150250f32c0df0b184fb494e2bb0df3 diff --git a/filter.h b/filter.h index 5cb7aaf8..500a8537 100644 --- a/filter.h +++ b/filter.h @@ -6,8 +6,35 @@ /** \file filter.h Filter-related structures and exported symbols from filter_chain.c. */ + +/** + * Describes one running instance of a filter. +*/ +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; +}; + /** Describes one running instance of a chain of filters */ struct filter_chain { + unsigned int num_filters; /** * The number of channels of the current stream. * @@ -21,7 +48,7 @@ struct filter_chain { */ unsigned int samplerate; /** The list containing all filter nodes in this filter chain. */ - struct list_head filters; + struct filter_node *filter_nodes; /** * The input buffer of the filter chain. * @@ -48,37 +75,9 @@ struct 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; -}; +#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. @@ -130,11 +129,6 @@ struct filter_callback { }; -void close_filters(struct filter_chain *fc); -void filter_init(struct filter *all_filters); -int check_filter_arg(char *filter_arg, void **conf); -void filter_pre_select(__a_unused struct sched *s, struct task *t); - /** * The structure associated with a paraslash filter. * @@ -206,6 +200,11 @@ struct filter { void *(*parse_config)(int argc, char **argv); }; +void close_filters(struct filter_chain *fc); +void filter_init(struct filter *all_filters); +int check_filter_arg(char *filter_arg, void **conf); +void filter_pre_select(__a_unused struct sched *s, struct task *t); + static inline void write_int16_host_endian(char *buf, int val) { @@ -233,9 +232,8 @@ extern struct filter filters[]; /* filters that are always present */ DECLARE_EXTERN_FILTER_INIT(wav); -/* wav is always the first filter */ -#define WAV_FILTER_NUM 0 DECLARE_EXTERN_FILTER_INIT(compress); +DECLARE_EXTERN_FILTER_INIT(amp); /* next the optional filters */ #ifdef HAVE_MAD @@ -264,6 +262,7 @@ DECLARE_EXTERN_FILTER_INIT(oggdec); #define DEFINE_FILTER_ARRAY(filters) struct filter filters[] = { \ FILTER_INIT(wav) \ FILTER_INIT(compress) \ + FILTER_INIT(amp) \ MP3DEC_FILTER \ AACDEC_FILTER \ OGGDEC_FILTER \