From f33acf8758a406ff744bee5014a5605c10801665 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Thu, 7 Nov 2013 18:17:54 +0100 Subject: input/cdio_paranoia: add setting "default_byte_order" Allows big-endian users to configure the fallback byte order to little-endian. Without this setting, MPD assumes native byte order if the CD drive can't decide. --- src/input/CdioParanoiaInputPlugin.cxx | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) (limited to 'src/input/CdioParanoiaInputPlugin.cxx') diff --git a/src/input/CdioParanoiaInputPlugin.cxx b/src/input/CdioParanoiaInputPlugin.cxx index c67f8492b..cc366bff5 100644 --- a/src/input/CdioParanoiaInputPlugin.cxx +++ b/src/input/CdioParanoiaInputPlugin.cxx @@ -30,6 +30,8 @@ #include "system/ByteOrder.hxx" #include "fs/AllocatedPath.hxx" #include "Log.hxx" +#include "ConfigData.hxx" +#include "ConfigError.hxx" #include #include @@ -77,6 +79,28 @@ struct CdioParanoiaInputStream { static constexpr Domain cdio_domain("cdio"); +static bool default_reverse_endian; + +static bool +input_cdio_init(const config_param ¶m, Error &error) +{ + const char *value = param.GetBlockValue("default_byte_order"); + if (value != nullptr) { + if (strcmp(value, "little_endian") == 0) + default_reverse_endian = IsBigEndian(); + else if (strcmp(value, "big_endian") == 0) + default_reverse_endian = IsLittleEndian(); + else { + error.Format(config_domain, 0, + "Unrecognized 'default_byte_order' setting: %s", + value); + return false; + } + } + + return true; +} + static void input_cdio_close(InputStream *is) { @@ -196,7 +220,7 @@ input_cdio_open(const char *uri, switch (data_bigendianp(i->drv)) { case -1: LogDebug(cdio_domain, "drive returns unknown audio data"); - reverse_endian = false; + reverse_endian = default_reverse_endian; break; case 0: @@ -363,7 +387,7 @@ input_cdio_eof(InputStream *is) const InputPlugin input_plugin_cdio_paranoia = { "cdio_paranoia", - nullptr, + input_cdio_init, nullptr, input_cdio_open, input_cdio_close, -- cgit v1.2.3