X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=filter.h;h=94657a738a4ae1b620148d28400c20ed4c27a710;hp=bf99a677b7c0b6e5cab95111834ad031c19c7619;hb=bda95f9508b456dcea89d300f6d4104e30ab9f3e;hpb=fdd1f83d38148ecb76aac90ec02b12a985de8821 diff --git a/filter.h b/filter.h index bf99a677..94657a73 100644 --- a/filter.h +++ b/filter.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2009 Andre Noll + * Copyright (C) 2005-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ @@ -15,75 +15,23 @@ 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; + /** The task corresponding to this filter node. */ struct task task; + /** The minimal input queue size, see \ref btr_node_status(). */ size_t min_iqs; }; -/** 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. - * - * Set by the decoding filter. - */ - unsigned int channels; - /** - * Current sample rate in Hz. - * - * Set by the decoding filter. - */ - unsigned int samplerate; - /** The list containing all filter nodes in this filter chain. */ - struct filter_node *filter_nodes; - /** - * The input buffer of the filter chain. - * - * This is set to point to the output buffer of the receiving application (the - * buffer used to read from stdin for para_filter; the output buffer of the - * current receiver for para_audiod). - */ - char **inbufp; - /** - * The output buffer of the filter chain. - * - * Points to the output buffer of the last filter in the filter chain. - */ - 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; - /** Pointer to the error variable of the receiving application. */ - int *input_error; - /** Pointer to the error variable of the writing application. */ - int *output_error; - /** The task associated with the filter chain. */ - struct task task; -}; - -#define FOR_EACH_FILTER_NODE(fn, fc, i) for (i = 0; i < (fc)->num_filters \ - && (fn = (fc)->filter_nodes + i); i++) - /** * The structure associated with a paraslash filter. * @@ -119,7 +67,8 @@ struct filter { * Close one instance of this filter. * * Free all resources of associated with \a fn that were previously allocated - * by the open() function. + * by the open() function. It's OK to leave this alone if the filter does not + * need any cleanups. */ void (*close)(struct filter_node *fn); /** @@ -135,19 +84,38 @@ 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; + /** + * Set scheduler timeout and add file descriptors to fd sets. + * + * This function is used to control the timeout value for select. It + * only allowed to decrease the current value. The second purpose of + * this function is to set file descriptors to be watched by the + * subsequent select call to the two fd sets. + */ 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. + * Pointer to the converting function of the filter. 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); + /** + * 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. + */ btr_command_handler execute; }; @@ -155,6 +123,8 @@ 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 decoder_execute(const char *cmd, unsigned sample_rate, unsigned channels, + char **result); static inline void write_int16_host_endian(char *buf, int val) { @@ -169,6 +139,7 @@ static inline void write_int16_host_endian(char *buf, int val) DECLARE_FILTER_INITS +/** Iterate over the array of supported filters. */ #define FOR_EACH_SUPPORTED_FILTER(j) for (j = 0; j < NUM_SUPPORTED_FILTERS; j++) /** The filter array, one structure for each supported filter. */