diff options
Diffstat (limited to 'src/FilterConfig.cxx')
-rw-r--r-- | src/FilterConfig.cxx | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/src/FilterConfig.cxx b/src/FilterConfig.cxx new file mode 100644 index 000000000..b9f6fe20f --- /dev/null +++ b/src/FilterConfig.cxx @@ -0,0 +1,117 @@ +/* + * Copyright (C) 2003-2013 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 "config.h" +#include "FilterConfig.hxx" +#include "filter/ChainFilterPlugin.hxx" +#include "FilterPlugin.hxx" +#include "FilterInternal.hxx" +#include "FilterRegistry.hxx" +#include "ConfigData.hxx" +#include "ConfigOption.hxx" +#include "ConfigGlobal.hxx" +#include "ConfigError.hxx" +#include "util/Error.hxx" + +#include <glib.h> + +#include <string.h> + +/** + * Find the "filter" configuration block for the specified name. + * + * @param filter_template_name the name of the filter template + * @param error space to return an error description + * @return the configuration block, or NULL if none was configured + */ +static const struct config_param * +filter_plugin_config(const char *filter_template_name, Error &error) +{ + const struct config_param *param = NULL; + + while ((param = config_get_next_param(CONF_AUDIO_FILTER, param)) != NULL) { + const char *name = param->GetBlockValue("name"); + if (name == NULL) { + error.Format(config_domain, + "filter configuration without 'name' name in line %d", + param->line); + return NULL; + } + + if (strcmp(name, filter_template_name) == 0) + return param; + } + + error.Format(config_domain, + "filter template not found: %s", + filter_template_name); + 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 + * @param error space to return an error description + * @return the number of filters which were successfully added + */ +unsigned int +filter_chain_parse(Filter &chain, const char *spec, Error &error) +{ + + // Split on comma + gchar** tokens = g_strsplit_set(spec, ",", 255); + + unsigned added_filters = 0; + + // Add each name to the filter chain by instantiating an actual filter + char **template_names = tokens; + while (*template_names != NULL) { + // Squeeze whitespace + g_strstrip(*template_names); + + const struct config_param *cfg = + filter_plugin_config(*template_names, error); + if (cfg == NULL) { + // The error has already been set, just stop. + break; + } + + // Instantiate one of those filter plugins with the template name as a hint + Filter *f = filter_configured_new(*cfg, error); + if (f == NULL) { + // The error has already been set, just stop. + break; + } + + const char *plugin_name = cfg->GetBlockValue("plugin", + "unknown"); + + filter_chain_append(chain, plugin_name, f); + ++added_filters; + + ++template_names; + } + + g_strfreev(tokens); + + return added_filters; +} |