diff options
Diffstat (limited to '')
-rw-r--r-- | Makefile.am | 3 | ||||
-rw-r--r-- | src/filter/chain_filter_plugin.c | 97 | ||||
-rw-r--r-- | src/filter/chain_filter_plugin.h | 12 | ||||
-rw-r--r-- | src/filter_config.c | 126 | ||||
-rw-r--r-- | src/filter_config.h | 46 | ||||
-rw-r--r-- | src/output_init.c | 1 |
6 files changed, 176 insertions, 109 deletions
diff --git a/Makefile.am b/Makefile.am index a55a5e1a4..96eb31265 100644 --- a/Makefile.am +++ b/Makefile.am @@ -47,6 +47,7 @@ mpd_headers = \ src/output_print.h \ src/output_command.h \ src/filter_internal.h \ + src/filter_config.h \ src/filter_plugin.h \ src/filter_registry.h \ src/filter/chain_filter_plugin.h \ @@ -230,6 +231,7 @@ src_mpd_SOURCES = \ src/exclude.c \ src/fd_util.c \ src/fifo_buffer.c \ + src/filter_config.c \ src/filter_plugin.c \ src/filter_registry.c \ src/update.c \ @@ -921,6 +923,7 @@ test_run_output_SOURCES = test/run_output.c \ src/mixer_type.c \ $(MIXER_SRC) \ src/filter_plugin.c src/filter/chain_filter_plugin.c \ + src/filter_config.c \ src/filter/convert_filter_plugin.c \ src/filter/volume_filter_plugin.c \ src/pcm_volume.c \ diff --git a/src/filter/chain_filter_plugin.c b/src/filter/chain_filter_plugin.c index 5f9544b50..48100bc4b 100644 --- a/src/filter/chain_filter_plugin.c +++ b/src/filter/chain_filter_plugin.c @@ -25,7 +25,6 @@ #include "filter_registry.h" #include <assert.h> -#include <string.h> struct filter_chain { /** the base class */ @@ -179,99 +178,3 @@ filter_chain_append(struct filter *_chain, struct filter *filter) chain->children = g_slist_append(chain->children, filter); } -/** - * Find the "filter" configuration block for the specified name. - * - * @param filter_template_name the name of the filter template - * @return the configuration block, or NULL if none was configured - */ -static const struct config_param * -filter_plugin_config(const char *filter_template_name) -{ - const struct config_param *param = NULL; - - while ((param = config_get_next_param(CONF_AUDIO_FILTER, param)) != NULL) { - const char *name = - config_get_block_string(param, "name", NULL); - if (name == NULL) - g_error("filter configuration without 'name' name in line %d", - param->line); - - if (strcmp(name, filter_template_name) == 0) - return param; - } - - return NULL; -} - -/** - * Builds a filter chain from a configuration string on the form - * "name1, name2, name3, ..." by looking up each name among the - * configured filter sections. - * @param chain the chain to append filters on - * @param spec the filter chain specification - * @return the number of filters which were successfully added - */ -unsigned int -filter_chain_parse(struct filter *chain, const char *spec) { - - // Split on comma - gchar** tokens = g_strsplit_set(spec, ",", 255); - - int added_filters = 0; - - // Add each name to the filter chain by instantiating an actual filter - char **template_names = tokens; - while (*template_names != NULL) { - const char *plugin_name; - const struct filter_plugin *fp; - struct filter *f; - const struct config_param *cfg; - - // Squeeze whitespace - g_strstrip(*template_names); - - cfg = filter_plugin_config(*template_names); - if (cfg == NULL) { - g_error("Unable to locate filter template %s", - *template_names); - ++template_names; - continue; - } - - // Figure out what kind of a plugin that is - plugin_name = config_get_block_string(cfg, "plugin", NULL); - if (plugin_name == NULL) { - g_error("filter configuration without 'plugin' at line %d", - cfg->line); - ++template_names; - continue; - } - - // Instantiate one of those filter plugins with the template name as a hint - fp = filter_plugin_by_name(plugin_name); - if (fp == NULL) { - g_error("filter plugin not found: %s", - plugin_name); - ++template_names; - continue; - } - - f = filter_new(fp, cfg, NULL); - if (f == NULL) { - g_error("filter plugin initialization failed: %s", - plugin_name); - ++template_names; - continue; - } - - filter_chain_append(chain, f); - ++added_filters; - - ++template_names; - } - - g_strfreev(tokens); - - return added_filters; -} diff --git a/src/filter/chain_filter_plugin.h b/src/filter/chain_filter_plugin.h index 54e07081d..f8462b22d 100644 --- a/src/filter/chain_filter_plugin.h +++ b/src/filter/chain_filter_plugin.h @@ -45,16 +45,4 @@ filter_chain_new(void); void filter_chain_append(struct filter *chain, struct filter *filter); -/** - * Builds a filter chain from a configuration string on the form - * "name1, name2, name3, ..." by looking up each name among the - * configured filter sections. If no filters are specified, a - * null filter is automatically appended. - * @param chain the chain to append filters on - * @param spec the filter chain specification - * @return the number of filters which were successfully added - */ -unsigned int -filter_chain_parse(struct filter *chain, const char *spec); - #endif diff --git a/src/filter_config.c b/src/filter_config.c new file mode 100644 index 000000000..feca10951 --- /dev/null +++ b/src/filter_config.c @@ -0,0 +1,126 @@ +/* + * Copyright (C) 2003-2009 The Music Player Daemon Project + * http://www.musicpd.org + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include "filter_config.h" +#include "config.h" +#include "conf.h" +#include "filter/chain_filter_plugin.h" +#include "filter_plugin.h" +#include "filter_internal.h" +#include "filter_registry.h" + +#include <string.h> + +/** + * Find the "filter" configuration block for the specified name. + * + * @param filter_template_name the name of the filter template + * @return the configuration block, or NULL if none was configured + */ +static const struct config_param * +filter_plugin_config(const char *filter_template_name) +{ + const struct config_param *param = NULL; + + while ((param = config_get_next_param(CONF_AUDIO_FILTER, param)) != NULL) { + const char *name = + config_get_block_string(param, "name", NULL); + if (name == NULL) + g_error("filter configuration without 'name' name in line %d", + param->line); + + if (strcmp(name, filter_template_name) == 0) + return param; + } + + return NULL; +} + +/** + * Builds a filter chain from a configuration string on the form + * "name1, name2, name3, ..." by looking up each name among the + * configured filter sections. + * @param chain the chain to append filters on + * @param spec the filter chain specification + * @return the number of filters which were successfully added + */ +unsigned int +filter_chain_parse(struct filter *chain, const char *spec) +{ + + // Split on comma + gchar** tokens = g_strsplit_set(spec, ",", 255); + + int added_filters = 0; + + // Add each name to the filter chain by instantiating an actual filter + char **template_names = tokens; + while (*template_names != NULL) { + const char *plugin_name; + const struct filter_plugin *fp; + struct filter *f; + const struct config_param *cfg; + + // Squeeze whitespace + g_strstrip(*template_names); + + cfg = filter_plugin_config(*template_names); + if (cfg == NULL) { + g_error("Unable to locate filter template %s", + *template_names); + ++template_names; + continue; + } + + // Figure out what kind of a plugin that is + plugin_name = config_get_block_string(cfg, "plugin", NULL); + if (plugin_name == NULL) { + g_error("filter configuration without 'plugin' at line %d", + cfg->line); + ++template_names; + continue; + } + + // Instantiate one of those filter plugins with the template name as a hint + fp = filter_plugin_by_name(plugin_name); + if (fp == NULL) { + g_error("filter plugin not found: %s", + plugin_name); + ++template_names; + continue; + } + + f = filter_new(fp, cfg, NULL); + if (f == NULL) { + g_error("filter plugin initialization failed: %s", + plugin_name); + ++template_names; + continue; + } + + filter_chain_append(chain, f); + ++added_filters; + + ++template_names; + } + + g_strfreev(tokens); + + return added_filters; +} diff --git a/src/filter_config.h b/src/filter_config.h new file mode 100644 index 000000000..eadaf24ac --- /dev/null +++ b/src/filter_config.h @@ -0,0 +1,46 @@ +/* + * Copyright (C) 2003-2009 The Music Player Daemon Project + * http://www.musicpd.org + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +/** \file + * + * Utility functions for filter configuration + */ + +#ifndef MPD_FILTER_CONFIG_H +#define MPD_FILTER_CONFIG_H + +#include "conf.h" +#include "filter/chain_filter_plugin.h" +#include "filter_plugin.h" +#include "filter_internal.h" +#include "filter_registry.h" + + +/** + * Builds a filter chain from a configuration string on the form + * "name1, name2, name3, ..." by looking up each name among the + * configured filter sections. + * @param chain the chain to append filters on + * @param spec the filter chain specification + * @return the number of filters which were successfully added + */ +unsigned int +filter_chain_parse(struct filter *chain, const char *spec); + +#endif diff --git a/src/output_init.c b/src/output_init.c index 6ca190fd0..f4025fbfe 100644 --- a/src/output_init.c +++ b/src/output_init.c @@ -29,6 +29,7 @@ #include "mixer/software_mixer_plugin.h" #include "filter_plugin.h" #include "filter_registry.h" +#include "filter_config.h" #include "filter/chain_filter_plugin.h" #include <glib.h> |