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.
This commit is contained in:
Max Kellermann 2013-11-07 18:17:54 +01:00
parent a846a4c643
commit f33acf8758
3 changed files with 51 additions and 2 deletions

1
NEWS
View File

@ -2,6 +2,7 @@ ver 0.18.2 (2013/??/??)
* protocol: * protocol:
- "close" flushes the output buffer - "close" flushes the output buffer
* input: * input:
- cdio_paranoia: add setting "default_byte_order"
- curl: fix bug with redirected streams - curl: fix bug with redirected streams
* playlist: * playlist:
- pls: fix reversed song order - pls: fix reversed song order

View File

@ -814,6 +814,30 @@ systemctl start mpd.socket</programlisting>
simplest form <filename>cdda://</filename> plays the whole simplest form <filename>cdda://</filename> plays the whole
disc in the default drive. disc in the default drive.
</para> </para>
<informaltable>
<tgroup cols="2">
<thead>
<row>
<entry>Setting</entry>
<entry>Description</entry>
</row>
</thead>
<tbody>
<row>
<entry>
<varname>default_bute_order</varname>
<parameter>little_endian|big_endian</parameter>
</entry>
<entry>
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.
</entry>
</row>
</tbody>
</tgroup>
</informaltable>
</section> </section>
<section> <section>

View File

@ -30,6 +30,8 @@
#include "system/ByteOrder.hxx" #include "system/ByteOrder.hxx"
#include "fs/AllocatedPath.hxx" #include "fs/AllocatedPath.hxx"
#include "Log.hxx" #include "Log.hxx"
#include "ConfigData.hxx"
#include "ConfigError.hxx"
#include <stdio.h> #include <stdio.h>
#include <stdint.h> #include <stdint.h>
@ -77,6 +79,28 @@ struct CdioParanoiaInputStream {
static constexpr Domain cdio_domain("cdio"); 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 static void
input_cdio_close(InputStream *is) input_cdio_close(InputStream *is)
{ {
@ -196,7 +220,7 @@ input_cdio_open(const char *uri,
switch (data_bigendianp(i->drv)) { switch (data_bigendianp(i->drv)) {
case -1: case -1:
LogDebug(cdio_domain, "drive returns unknown audio data"); LogDebug(cdio_domain, "drive returns unknown audio data");
reverse_endian = false; reverse_endian = default_reverse_endian;
break; break;
case 0: case 0:
@ -363,7 +387,7 @@ input_cdio_eof(InputStream *is)
const InputPlugin input_plugin_cdio_paranoia = { const InputPlugin input_plugin_cdio_paranoia = {
"cdio_paranoia", "cdio_paranoia",
nullptr, input_cdio_init,
nullptr, nullptr,
input_cdio_open, input_cdio_open,
input_cdio_close, input_cdio_close,