Commit 3fb8f3ec authored by Max Kellermann's avatar Max Kellermann

Merge tag 'v0.19.15'

release v0.19.15
parents fc3e0dfc 04ed50fb
...@@ -2261,7 +2261,9 @@ developer_DATA = $(wildcard doc/developer/*.html) ...@@ -2261,7 +2261,9 @@ developer_DATA = $(wildcard doc/developer/*.html)
DOCBOOK_HTML = $(patsubst %.xml,%/index.html,$(DOCBOOK_FILES)) DOCBOOK_HTML = $(patsubst %.xml,%/index.html,$(DOCBOOK_FILES))
$(DOCBOOK_HTML): %/index.html: %.xml DOCBOOK_INCLUDES = $(wildcard $(srcdir)/doc/include/*.xml)
$(DOCBOOK_HTML): %/index.html: %.xml $(DOCBOOK_INCLUDES)
$(XMLTO) -o $(@D) --stringparam chunker.output.encoding=utf-8 html --stringparam use.id.as.filename=1 $< $(XMLTO) -o $(@D) --stringparam chunker.output.encoding=utf-8 html --stringparam use.id.as.filename=1 $<
doc/api/html/index.html: doc/doxygen.conf doc/api/html/index.html: doc/doxygen.conf
......
...@@ -52,11 +52,14 @@ ver 0.20 (not yet released) ...@@ -52,11 +52,14 @@ ver 0.20 (not yet released)
* update * update
- apply .mpdignore matches to subdirectories - apply .mpdignore matches to subdirectories
ver 0.19.15 (not yet released) ver 0.19.15 (2016/04/30)
* decoder * decoder
- ffmpeg: support FFmpeg 3.0 - ffmpeg: support FFmpeg 3.0
- ffmpeg: use as fallback instead of "mad" if no plugin matches - ffmpeg: use as fallback instead of "mad" if no plugin matches
- opus: support bigger OpusTags packets
* fix more build failures on non-glibc builds due to constexpr Mutex * fix more build failures on non-glibc builds due to constexpr Mutex
* fix build failure due to missing include
* fix unit test on Alpha
ver 0.19.14 (2016/03/18) ver 0.19.14 (2016/03/18)
* decoder * decoder
......
<?xml version='1.0' encoding="utf-8"?> <?xml version='1.0' encoding="utf-8"?>
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" <!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
"docbook/dtd/xml/4.2/docbookx.dtd"> "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
<book> <book>
<title>The Music Player Daemon - Developer's Manual</title> <title>The Music Player Daemon - Developer's Manual</title>
......
<?xml version='1.0' encoding="utf-8"?>
<!DOCTYPE itemizedlist PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
<itemizedlist>
<listitem>
<para>
<varname>artist</varname>: the artist name. Its meaning is not
well-defined; see <varname>composer</varname> and
<varname>performer</varname> for more specific tags.
</para>
</listitem>
<listitem>
<para>
<varname>artistsort</varname>: same as
<varname>artist</varname>, but for sorting. This usually omits
prefixes such as "The".
</para>
</listitem>
<listitem>
<para>
<varname>album</varname>: the album name.
</para>
</listitem>
<listitem>
<para>
<varname>albumsort</varname>: same as <varname>album</varname>,
but for sorting.
</para>
</listitem>
<listitem>
<para>
<varname>albumartist</varname>: on multi-artist albums, this is
the artist name which shall be used for the whole album. The
exact meaning of this tag is not well-defined.
</para>
</listitem>
<listitem>
<para>
<varname>albumartistsort</varname>: same as
<varname>albumartist</varname>, but for sorting.
</para>
</listitem>
<listitem>
<para>
<varname>title</varname>: the song title.
</para>
</listitem>
<listitem>
<para>
<varname>track</varname>: the track number within the album.
</para>
</listitem>
<listitem>
<para>
<varname>name</varname>: a name for this song. This is not the
song title. The exact meaning of this tag is not well-defined.
It is often used by badly configured internet radio stations
with broken tags to squeeze both the artist name and the song
title in one tag.
</para>
</listitem>
<listitem>
<para>
<varname>genre</varname>: the music genre.
</para>
</listitem>
<listitem>
<para>
<varname>date</varname>: the song's release date. This is
usually a 4-digit year.
</para>
</listitem>
<listitem>
<para>
<varname>composer</varname>: the artist who composed the song.
</para>
</listitem>
<listitem>
<para>
<varname>performer</varname>: the artist who performed the song.
</para>
</listitem>
<listitem>
<para>
<varname>comment</varname>: a human-readable comment about this
song. The exact meaning of this tag is not well-defined.
</para>
</listitem>
<listitem>
<para>
<varname>disc</varname>: the disc number in a multi-disc album.
</para>
</listitem>
<listitem>
<para>
<varname>musicbrainz_artistid</varname>: the artist id in the
<ulink
url="http://musicbrainz.org/doc/MusicBrainzTag">MusicBrainz</ulink>
database.
</para>
</listitem>
<listitem>
<para>
<varname>musicbrainz_albumid</varname>: the album id in the
<ulink
url="http://musicbrainz.org/doc/MusicBrainzTag">MusicBrainz</ulink>
database.
</para>
</listitem>
<listitem>
<para>
<varname>musicbrainz_albumartistid</varname>: the album artist
id in the <ulink
url="http://musicbrainz.org/doc/MusicBrainzTag">MusicBrainz</ulink>
database.
</para>
</listitem>
<listitem>
<para>
<varname>musicbrainz_trackid</varname>: the track id in the
<ulink
url="http://musicbrainz.org/doc/MusicBrainzTag">MusicBrainz</ulink>
database.
</para>
</listitem>
<listitem>
<para>
<varname>musicbrainz_releasetrackid</varname>: the release track
id in the <ulink
url="http://musicbrainz.org/doc/MusicBrainzTag">MusicBrainz</ulink>
database.
</para>
</listitem>
</itemizedlist>
...@@ -168,18 +168,6 @@ MP3 playback. ...@@ -168,18 +168,6 @@ MP3 playback.
This specifies whether relative or absolute paths for song filenames are used This specifies whether relative or absolute paths for song filenames are used
when saving playlists. The default is "no". when saving playlists. The default is "no".
.TP .TP
.B metadata_to_use <tags>
This specifies the tag types that will be scanned for and made available to
clients. Note that you must recreate (not update) your database for changes to
this parameter to take effect. Possible values are artist, album, title,
track, name, genre, date, composer, performer, comment, disc,
musicbrainz_artistid, musicbrainz_albumid, musicbrainz_albumartistid,
musicbrainz_releasetrackid, musicbrainz_trackid. Multiple tags may be specified
as a comma separated list.
An example value is "artist,album,title,track". The special value "none" may
be used alone to disable all metadata. The default is to use all known tag
types except for comments and those starting with "musicbrainz".
.TP
.B auto_update <yes or no> .B auto_update <yes or no>
This specifies the whether to support automatic update of music database when This specifies the whether to support automatic update of music database when
files are changed in music_directory. The default is to disable autoupdate files are changed in music_directory. The default is to disable autoupdate
......
...@@ -116,7 +116,7 @@ ...@@ -116,7 +116,7 @@
# #
# This setting defines a list of tag types that will be extracted during the # This setting defines a list of tag types that will be extracted during the
# audio file discovery process. The complete list of possible values can be # audio file discovery process. The complete list of possible values can be
# found in the mpd.conf man page. # found in the user manual.
#metadata_to_use "artist,album,title,track,name,genre,date,composer,performer,disc" #metadata_to_use "artist,album,title,track,name,genre,date,composer,performer,disc"
# #
# This setting enables automatic update of MPD's database when files in # This setting enables automatic update of MPD's database when files in
......
<?xml version='1.0' encoding="utf-8"?> <?xml version='1.0' encoding="utf-8"?>
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" <!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
"docbook/dtd/xml/4.2/docbookx.dtd"> "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
<book> <book>
<title>The Music Player Daemon protocol</title> <title>The Music Player Daemon protocol</title>
...@@ -201,6 +202,25 @@ ...@@ -201,6 +202,25 @@
omitted, then the maximum possible value is assumed. omitted, then the maximum possible value is assumed.
</para> </para>
</section> </section>
<section id="tags">
<title>Tags</title>
<para>
The following tags are supported by
<application>MPD</application>:
</para>
<xi:include href="include/tags.xml"
xmlns:xi="http://www.w3.org/2001/XInclude"/>
<para>
There can be multiple values for some of these tags. For
example, <application>MPD</application> may return multiple
lines with a <varname>performer</varname> tag. A tag value is
a UTF-8 string.
</para>
</section>
</chapter> </chapter>
<chapter id="recipes"> <chapter id="recipes">
......
<?xml version='1.0' encoding="utf-8"?> <?xml version='1.0' encoding="utf-8"?>
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" <!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
"docbook/dtd/xml/4.2/docbookx.dtd"> "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
<book> <book>
<title>The Music Player Daemon - User's Manual</title> <title>The Music Player Daemon - User's Manual</title>
...@@ -779,6 +780,33 @@ systemctl start mpd.socket</programlisting> ...@@ -779,6 +780,33 @@ systemctl start mpd.socket</programlisting>
<section id="config_other"> <section id="config_other">
<title>Other Settings</title> <title>Other Settings</title>
<informaltable>
<tgroup cols="2">
<thead>
<row>
<entry>Setting</entry>
<entry>Description</entry>
</row>
</thead>
<tbody>
<row>
<entry>
<varname>metadata_to_use</varname>
<parameter>TAG1,TAG2,...</parameter>
</entry>
<entry>
Use only the specified tags, and ignore the others.
This setting can reduce the database size and
<application>MPD</application>'s memory usage by
omitting unused tags. By default, all tags but
<varname>comment</varname> are enabled. The special
value "none" disables all tags.
</entry>
</row>
</tbody>
</tgroup>
</informaltable>
<section> <section>
<title>The State File</title> <title>The State File</title>
...@@ -1134,6 +1162,19 @@ database { ...@@ -1134,6 +1162,19 @@ database {
</para> </para>
</section> </section>
<section id="tags">
<title>Metadata</title>
<para>
When scanning or playing a song,
<application>MPD</application> parses its metadata. The
following tags are supported:
</para>
<xi:include href="include/tags.xml"
xmlns:xi="http://www.w3.org/2001/XInclude"/>
</section>
<section id="queue"> <section id="queue">
<title>The queue</title> <title>The queue</title>
......
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
#include "util/ConstBuffer.hxx" #include "util/ConstBuffer.hxx"
#include <stddef.h> #include <stddef.h>
#include <stdint.h>
struct Decoder; struct Decoder;
class InputStream; class InputStream;
......
...@@ -440,13 +440,15 @@ mpd_opus_scan_stream(InputStream &is, ...@@ -440,13 +440,15 @@ mpd_opus_scan_stream(InputStream &is,
if (!oy.ExpectFirstPage(os)) if (!oy.ExpectFirstPage(os))
return false; return false;
/* read at most two more pages */ /* read at most 64 more pages */
unsigned remaining_pages = 2; unsigned remaining_pages = 64;
unsigned remaining_packets = 4;
bool result = false; bool result = false;
ogg_packet packet; ogg_packet packet;
while (true) { while (remaining_packets > 0) {
int r = ogg_stream_packetout(&os, &packet); int r = ogg_stream_packetout(&os, &packet);
if (r < 0) { if (r < 0) {
result = false; result = false;
...@@ -465,6 +467,8 @@ mpd_opus_scan_stream(InputStream &is, ...@@ -465,6 +467,8 @@ mpd_opus_scan_stream(InputStream &is,
continue; continue;
} }
--remaining_packets;
if (packet.b_o_s) { if (packet.b_o_s) {
if (!IsOpusHead(packet)) if (!IsOpusHead(packet))
break; break;
......
...@@ -27,6 +27,8 @@ ...@@ -27,6 +27,8 @@
#include <assert.h> #include <assert.h>
#include <string.h> #include <string.h>
static constexpr uint16_t WAVE_FORMAT_PCM = 1;
struct WaveEncoder { struct WaveEncoder {
Encoder encoder; Encoder encoder;
unsigned bits; unsigned bits;
...@@ -65,7 +67,7 @@ fill_wave_header(struct wave_header *header, int channels, int bits, ...@@ -65,7 +67,7 @@ fill_wave_header(struct wave_header *header, int channels, int bits,
header->id_data = ToLE32(0x61746164); header->id_data = ToLE32(0x61746164);
/* wave format */ /* wave format */
header->format = ToLE16(1); // PCM_FORMAT header->format = ToLE16(WAVE_FORMAT_PCM);
header->channels = ToLE16(channels); header->channels = ToLE16(channels);
header->bits = ToLE16(bits); header->bits = ToLE16(bits);
header->freq = ToLE32(freq); header->freq = ToLE32(freq);
......
...@@ -49,9 +49,9 @@ CPPUNIT_TEST_SUITE_REGISTRATION(ByteReverseTest); ...@@ -49,9 +49,9 @@ CPPUNIT_TEST_SUITE_REGISTRATION(ByteReverseTest);
void void
ByteReverseTest::TestByteReverse2() ByteReverseTest::TestByteReverse2()
{ {
static const char src[] = "123456"; static const char src[] gcc_alignas(uint16_t, 2) = "123456";
static const char result[] = "214365"; static const char result[] = "214365";
static uint8_t dest[ARRAY_SIZE(src)]; static uint8_t dest[ARRAY_SIZE(src)] gcc_alignas(uint16_t, 2);
reverse_bytes(dest, (const uint8_t *)src, reverse_bytes(dest, (const uint8_t *)src,
(const uint8_t *)(src + ARRAY_SIZE(src) - 1), 2); (const uint8_t *)(src + ARRAY_SIZE(src) - 1), 2);
...@@ -73,9 +73,9 @@ ByteReverseTest::TestByteReverse3() ...@@ -73,9 +73,9 @@ ByteReverseTest::TestByteReverse3()
void void
ByteReverseTest::TestByteReverse4() ByteReverseTest::TestByteReverse4()
{ {
static const char src[] = "12345678"; static const char src[] gcc_alignas(uint32_t, 4) = "12345678";
static const char result[] = "43218765"; static const char result[] = "43218765";
static uint8_t dest[ARRAY_SIZE(src)]; static uint8_t dest[ARRAY_SIZE(src)] gcc_alignas(uint32_t, 4);
reverse_bytes(dest, (const uint8_t *)src, reverse_bytes(dest, (const uint8_t *)src,
(const uint8_t *)(src + ARRAY_SIZE(src) - 1), 4); (const uint8_t *)(src + ARRAY_SIZE(src) - 1), 4);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment