From f33acf8758a406ff744bee5014a5605c10801665 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Thu, 7 Nov 2013 18:17:54 +0100 Subject: [PATCH] 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. --- NEWS | 1 + doc/user.xml | 24 +++++++++++++++++++++++ src/input/CdioParanoiaInputPlugin.cxx | 28 +++++++++++++++++++++++++-- 3 files changed, 51 insertions(+), 2 deletions(-) diff --git a/NEWS b/NEWS index 8a2d62609..48512f172 100644 --- a/NEWS +++ b/NEWS @@ -2,6 +2,7 @@ ver 0.18.2 (2013/??/??) * protocol: - "close" flushes the output buffer * input: + - cdio_paranoia: add setting "default_byte_order" - curl: fix bug with redirected streams * playlist: - pls: fix reversed song order diff --git a/doc/user.xml b/doc/user.xml index cebc4cadf..9bf4112f7 100644 --- a/doc/user.xml +++ b/doc/user.xml @@ -814,6 +814,30 @@ systemctl start mpd.socket simplest form cdda:// plays the whole disc in the default drive. + + + + + + Setting + Description + + + + + + default_bute_order + little_endian|big_endian + + + If the CD drive does not specify a byte order, MPD + assumes it is the CPU's native byte order. This + setting allows overriding this. + + + + +
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,