X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=filter.h;h=0bb51f5ae1e45bcd3396a91bfbba367cbafdec9c;hp=2e1b01c38a7dc4cfec3336e6037f89398ea4f5e4;hb=ca659e6bf0d7f783849244105a077e79fcf741ad;hpb=a00372c21738c8782c68bc699ddc3b7cdaee4ad8 diff --git a/filter.h b/filter.h index 2e1b01c3..0bb51f5a 100644 --- a/filter.h +++ b/filter.h @@ -1,13 +1,43 @@ /* - * Copyright (C) 2005-2007 Andre Noll + * Copyright (C) 2005-2009 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ -/** \file filter.h Filter-related structures and exported symbols from filter_chain.c. */ +/** \file filter.h Filter-related structures and exported symbols from filter_common.c. */ + +/** The list of supported filters. */ +enum filter_enum {FILTER_ENUM}; + +/** + * 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 { + /** The length of the filter chain. */ + unsigned int num_filters; /** * The number of channels of the current stream. * @@ -21,7 +51,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. * @@ -29,19 +59,17 @@ struct filter_chain { * buffer used to read from stdin for para_filter; the output buffer of the * current receiver for para_audiod). */ - char *inbuf; + char **inbufp; /** * The output buffer of the filter chain. * * Points to the output buffer of the last filter in the filter chain. */ - char *outbuf; + char **outbufp; /** Contains the number of bytes loaded in the input buffer. */ size_t *in_loaded; /** Contains the number of bytes loaded in the output buffer. */ size_t *out_loaded; - /** Non-zero if this filter wont' produce any more output. */ - int error; /** Pointer to the error variable of the receiving application. */ int *input_error; /** Pointer to the error variable of the writing application. */ @@ -50,37 +78,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. @@ -132,11 +132,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. * @@ -148,7 +143,7 @@ void filter_pre_select(__a_unused struct sched *s, struct task *t); * 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 + * \sa mp3dec_filter.c, oggdec_filter.c, wav_filter.c, compress_filter.c, filter_node */ struct filter { /** The name of the filter. */ @@ -188,26 +183,29 @@ struct filter { * 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 program 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. + * If this optional function pointer is not NULL, any filter options + * are passed from the main program 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. Success must be indicated by a non-negative return value. In + * this case the function should return a pointer to the + * filter-specific configuration data determined by \a argc and \a + * argv. On failure, a negative paraslash error code must be returned. */ - void *(*parse_config)(int argc, char **argv); + int (*parse_config)(int argc, char **argv, void **config); + + /** The help texts for this filter. */ + struct ggo_help help; }; +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 print_filter_helps(int detailed); static inline void write_int16_host_endian(char *buf, int val) { @@ -220,55 +218,9 @@ static inline void write_int16_host_endian(char *buf, int val) #endif } +DECLARE_FILTER_INITS -/** \cond */ -extern struct filter filters[]; -#define DECLARE_EXTERN_FILTER_INIT(name) \ - extern void name ## _init(struct filter *f) - -#define FILTER_INIT(filter) { \ - .name = #filter, \ - .init = filter ## _init, \ - .parse_config = NULL, \ - .print_help = NULL \ -}, - -/* 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); - -/* next the optional filters */ -#ifdef HAVE_MAD -DECLARE_EXTERN_FILTER_INIT(mp3dec); -#define MP3DEC_FILTER FILTER_INIT(mp3dec) -#else -#define MP3DEC_FILTER -#endif - -#ifdef HAVE_FAAD -DECLARE_EXTERN_FILTER_INIT(aacdec); -#define AACDEC_FILTER FILTER_INIT(aacdec) -#else -#define AACDEC_FILTER -#endif - -#ifdef HAVE_OGGVORBIS -DECLARE_EXTERN_FILTER_INIT(oggdec); -#define OGGDEC_FILTER FILTER_INIT(oggdec) -#else -#define OGGDEC_FILTER -#endif -/** \endcond */ - -/** define an array of all available filters */ -#define DEFINE_FILTER_ARRAY(filters) struct filter filters[] = { \ - FILTER_INIT(wav) \ - FILTER_INIT(compress) \ - MP3DEC_FILTER \ - AACDEC_FILTER \ - OGGDEC_FILTER \ - { .name = NULL } }; - +#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];