diff options
author | Max Kellermann <max@duempel.org> | 2015-01-21 20:42:41 +0100 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2015-01-22 11:04:28 +0100 |
commit | 0d3b26b3aaee6646ce5e825feca43299365797ec (patch) | |
tree | aaeff0df244e18a1c5d8083928ba69ed1bcd2429 /src/pcm/ConfiguredResampler.cxx | |
parent | 52acea7b1f8fa38ed884acfafe593d1494ade4c2 (diff) | |
download | mpd-0d3b26b3aaee6646ce5e825feca43299365797ec.tar.gz mpd-0d3b26b3aaee6646ce5e825feca43299365797ec.tar.xz mpd-0d3b26b3aaee6646ce5e825feca43299365797ec.zip |
Config: add section "resampler"
Diffstat (limited to '')
-rw-r--r-- | src/pcm/ConfiguredResampler.cxx | 123 |
1 files changed, 105 insertions, 18 deletions
diff --git a/src/pcm/ConfiguredResampler.cxx b/src/pcm/ConfiguredResampler.cxx index bf6ea58ee..30cb801c7 100644 --- a/src/pcm/ConfiguredResampler.cxx +++ b/src/pcm/ConfiguredResampler.cxx @@ -23,6 +23,8 @@ #include "config/ConfigGlobal.hxx" #include "config/ConfigOption.hxx" #include "config/ConfigError.hxx" +#include "config/Block.hxx" +#include "config/Param.hxx" #include "util/Error.hxx" #ifdef ENABLE_LIBSAMPLERATE @@ -49,34 +51,119 @@ enum class SelectedResampler { static SelectedResampler selected_resampler = SelectedResampler::FALLBACK; +static const ConfigBlock * +MakeResamplerDefaultConfig(ConfigBlock &block) +{ + assert(block.IsEmpty()); + +#ifdef ENABLE_LIBSAMPLERATE + block.AddBlockParam("plugin", "libsamplerate"); +#elif defined(ENABLE_SOXR) + block.AddBlockParam("plugin", "soxr"); +#else + block.AddBlockParam("plugin", "internal"); +#endif + return █ +} + +/** + * Convert the old "samplerate_converter" setting to a new-style + * "resampler" block. + */ +static const ConfigBlock * +MigrateResamplerConfig(const config_param ¶m, ConfigBlock &block) +{ + assert(block.IsEmpty()); + + block.line = param.line; + + const char *converter = param.value.c_str(); + if (*converter == 0 || strcmp(converter, "internal") == 0) { + block.AddBlockParam("plugin", "internal"); + return █ + } + +#ifdef ENABLE_SOXR + if (strcmp(converter, "soxr") == 0) { + block.AddBlockParam("plugin", "soxr"); + return █ + } + + if (memcmp(converter, "soxr ", 5) == 0) { + block.AddBlockParam("plugin", "soxr"); + block.AddBlockParam("quality", converter + 5); + return █ + } +#endif + + block.AddBlockParam("plugin", "libsamplerate"); + block.AddBlockParam("type", converter); + return █ +} + +static const ConfigBlock * +MigrateResamplerConfig(const config_param *param, ConfigBlock &buffer) +{ + assert(buffer.IsEmpty()); + + return param == nullptr + ? MakeResamplerDefaultConfig(buffer) + : MigrateResamplerConfig(*param, buffer); +} + +static const ConfigBlock * +GetResamplerConfig(ConfigBlock &buffer, Error &error) +{ + const auto *old_param = + config_get_param(ConfigOption::SAMPLERATE_CONVERTER); + const auto *block = config_get_block(ConfigBlockOption::RESAMPLER); + if (block == nullptr) + return MigrateResamplerConfig(old_param, buffer); + + if (old_param != nullptr) { + error.Format(config_domain, + "Cannot use both 'resampler' (line %d) and 'samplerate_converter' (line %d)", + block->line, old_param->line); + return nullptr; + } + + return block; +} + bool pcm_resampler_global_init(Error &error) { - const char *converter = - config_get_string(ConfigOption::SAMPLERATE_CONVERTER, ""); + ConfigBlock buffer; + const auto *block = GetResamplerConfig(buffer, error); + if (block == nullptr) + return false; + + const char *plugin_name = block->GetBlockValue("plugin"); + if (plugin_name == nullptr) { + error.Format(config_domain, + "'plugin' missing in line %d", block->line); + return false; + } - if (strcmp(converter, "internal") == 0) + if (strcmp(plugin_name, "internal") == 0) { + selected_resampler = SelectedResampler::FALLBACK; return true; - #ifdef ENABLE_SOXR - if (memcmp(converter, "soxr", 4) == 0) { + } else if (strcmp(plugin_name, "soxr") == 0) { selected_resampler = SelectedResampler::SOXR; - return pcm_resample_soxr_global_init(converter, error); - } + return pcm_resample_soxr_global_init(*block, error); #endif - #ifdef ENABLE_LIBSAMPLERATE - selected_resampler = SelectedResampler::LIBSAMPLERATE; - return pcm_resample_lsr_global_init(converter, error); + } else if (strcmp(plugin_name, "libsamplerate") == 0) { + selected_resampler = SelectedResampler::LIBSAMPLERATE; + return pcm_resample_lsr_global_init(*block, error); #endif - - if (*converter == 0) - return true; - - error.Format(config_domain, - "The samplerate_converter '%s' is not available", - converter); - return false; + } else { + error.Format(config_domain, + "No such resampler plugin: %s", + plugin_name); + return false; + } } PcmResampler * |