1 /* Copyright (C) 2005 Andre Noll <maan@tuebingen.mpg.de>, see file COPYING. */
3 /** \file filter_common.c Common helper functions for filter input/output. */
9 #include "filter_cmd.lsg.h"
14 #include "buffer_tree.h"
19 /** Iterate over all filters. */
20 #define FOR_EACH_FILTER(j) for (j = 1; FILTER_CMD(j); j++)
23 * Obtain a reference to a filter structure.
25 * \param filter_num Between zero and NUM_SUPPORTED_FILTERS, inclusively.
27 * \return Pointer to the filter identified by the given filter number, or
28 * NULL if the filter number is out of range.
32 const struct filter *filter_get(int filter_num)
34 if (filter_num < 1 || filter_num > LSG_NUM_FILTER_CMD_SUBCOMMANDS)
36 return lls_user_data(FILTER_CMD(filter_num));
39 static inline bool filter_supported(int filter_num)
41 return lls_user_data(FILTER_CMD(filter_num));
45 * Return the name of a filter, given its number.
47 * \param filter_num See \ref filter_get().
49 * \return A pointer to a string literal, or NULL if filter_num is out of
50 * range. The caller must not attempt to call free(3) on the returned pointer.
52 const char *filter_name(int filter_num)
54 if (filter_num < 1 || filter_num > LSG_NUM_FILTER_CMD_SUBCOMMANDS)
56 return lls_command_name(FILTER_CMD(filter_num));
60 * Parse a filter command line and call the corresponding ->setup method.
62 * \param fa The filter argument.
63 * \param conf Points to filter-specific setup upon successful return.
64 * \param lprp Parsed command line options are returned here.
66 * Check if the given filter argument starts with the name of a supported
67 * filter, optionally followed by options for this filter. If yes, call the
68 * command line parser of that filter and its ->setup method.
70 * \return On success, the number of the filter is returned and conf is
71 * initialized to point to the filter configuration as returned by the filter's
72 * ->setup() method, if any. Moreover, *lprp is initialized to contain the
73 * parsed command line options. On errors a negative paraslash error code is
76 int filter_setup(const char *fa, void **conf, struct lls_parse_result **lprp)
78 int ret, filter_num, argc;
79 char *errctx = NULL, **argv;
80 const struct lls_command *cmd;
81 const struct filter *f;
84 ret = create_argv(fa, " \t\n", &argv);
88 ret = lls(lls_lookup_subcmd(argv[0], filter_cmd_suite, &errctx));
92 cmd = FILTER_CMD(filter_num);
93 if (!filter_supported(filter_num)) {
94 ret = -E_UNSUPPORTED_FILTER;
95 errctx = make_message("bad filter name: %s",
96 lls_command_name(cmd));
99 ret = lls(lls_parse(argc, argv, cmd, lprp, &errctx));
102 f = filter_get(filter_num);
103 *conf = f->setup? f->setup(*lprp) : NULL;
110 PARA_ERROR_LOG("%s\n", errctx);
116 * Print help text of each filter to stdout.
118 * \param detailed Whether to print short or long help.
120 void print_filter_helps(bool detailed)
124 printf("\nAvailable filters: ");
126 if (!filter_supported(i))
132 num += printf("%s%s", i? " " : "", filter_name(i));
137 const struct lls_command *cmd = FILTER_CMD(i);
140 if (!filter_supported(i))
142 help = detailed? lls_long_help(cmd) : lls_short_help(cmd);
145 printf("%s\n", help);
151 * Print a short summary of all available filters to stdout.
153 * For each supported filter, the filter name and the purpose text is printed
154 * in a single line. Since no options are shown, the filter list is more
155 * concise than the text obtained from print_filter_helps().
157 void print_filter_list(void)
161 printf("Available filters:\n");
163 const struct lls_command *cmd = FILTER_CMD(i);
164 if (!filter_supported(i))
166 printf("%-9s %s\n", filter_name(i), lls_purpose(cmd));
171 * Request a minimal timeout if not idle.
173 * \param s The scheduler instance.
174 * \param context Pointer to the filter node.
176 * If the buffer tree node of the given filter node has data available (or is
177 * in error state) a minimal I/O timeout is requested from the scheduler.
178 * Otherwise the function does nothing.
180 void generic_filter_pre_monitor(struct sched *s, void *context)
182 struct filter_node *fn = context;
184 if (btr_node_status(fn->btrn, fn->min_iqs, BTR_NT_INTERNAL) != 0)
188 #ifdef WORDS_BIGENDIAN
189 #define DECODER_SAMPLE_FORMAT SF_S16_BE
191 #define DECODER_SAMPLE_FORMAT SF_S16_LE
195 * Execute a btr command for a decoder.
197 * The buffer tree nodes of the writers ask the parent nodes about sample_rate,
198 * channels count and sample format. This function is called by all decoders to
199 * answer these queries.
201 * \param cmd The command to be executed by the child node.
202 * \param sample_rate Known to the decoder.
203 * \param channels Known to the decoder.
204 * \param result Ascii representation on the answer is stored here.
208 int decoder_execute(const char *cmd, unsigned sample_rate, unsigned channels,
211 if (!strcmp(cmd, "sample_rate")) {
212 if (sample_rate == 0)
213 return -E_BTR_NAVAIL;
214 *result = make_message("%u", sample_rate);
217 if (!strcmp(cmd, "channels")) {
219 return -E_BTR_NAVAIL;
220 *result = make_message("%u", channels);
223 if (!strcmp(cmd, "sample_format")) {
224 *result = make_message("%d", DECODER_SAMPLE_FORMAT);
227 return -ERRNO_TO_PARA_ERROR(ENOTSUP);