aboutsummaryrefslogtreecommitdiffstats
path: root/src/input
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2013-11-07 18:17:54 +0100
committerMax Kellermann <max@duempel.org>2013-11-07 18:17:54 +0100
commitf33acf8758a406ff744bee5014a5605c10801665 (patch)
tree36200cd524508ea57247366015ddff21489c8d77 /src/input
parenta846a4c6434afe77fd3378465e7c3db7ae846dd5 (diff)
downloadmpd-f33acf8758a406ff744bee5014a5605c10801665.tar.gz
mpd-f33acf8758a406ff744bee5014a5605c10801665.tar.xz
mpd-f33acf8758a406ff744bee5014a5605c10801665.zip
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.
Diffstat (limited to 'src/input')
-rw-r--r--src/input/CdioParanoiaInputPlugin.cxx28
1 files changed, 26 insertions, 2 deletions
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 <stdio.h>
#include <stdint.h>
@@ -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 &param, 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,