summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMax Kellermann <max@musicpd.org>2017-02-01 22:05:33 +0100
committerMax Kellermann <max@musicpd.org>2017-02-01 22:05:33 +0100
commitdf4af2b5501f332db248aedd792c2b55789823c5 (patch)
treee53a63614964da8dd8ddb699e68854ccd95a91f3
parent97132e3d385ae84f7aaeb6c94f24d2cf41d39b9c (diff)
parent0a033fb10aeca8bf6e6bfc9a2f9d9e793ee61ac9 (diff)
Merge tag 'v0.20.4'
release v0.20.4
-rw-r--r--NEWS8
-rw-r--r--python/build/libs.py4
-rw-r--r--src/db/Count.cxx8
-rw-r--r--src/db/DatabasePlaylist.cxx3
-rw-r--r--src/db/DatabasePrint.cxx31
-rw-r--r--src/db/DatabaseQueue.cxx3
-rw-r--r--src/db/Helpers.cxx4
-rw-r--r--src/lib/nfs/Connection.cxx20
-rw-r--r--src/output/plugins/SndioOutputPlugin.cxx8
-rw-r--r--src/pcm/SampleFormat.hxx10
-rw-r--r--src/util/VarSize.hxx1
11 files changed, 58 insertions, 42 deletions
diff --git a/NEWS b/NEWS
index 583c8853d..50826df83 100644
--- a/NEWS
+++ b/NEWS
@@ -1,5 +1,13 @@
ver 0.21 (not yet released)
+ver 0.20.4 (2017/02/01)
+* input
+ - nfs: fix freeze after reconnect
+* output
+ - sndio: work around a libroar C++ incompatibility
+* workaround for GCC 4.9 "constexpr" bug
+* fix FreeBSD build failure
+
ver 0.20.3 (2017/01/25)
* protocol
- "playlistadd" creates new playlist if it does not exist, as documented
diff --git a/python/build/libs.py b/python/build/libs.py
index 68beb78c6..54f292578 100644
--- a/python/build/libs.py
+++ b/python/build/libs.py
@@ -19,8 +19,8 @@ libvorbis = AutotoolsProject(
)
opus = AutotoolsProject(
- 'http://downloads.xiph.org/releases/opus/opus-1.1.3.tar.gz',
- '32bbb6b557fe1b6066adc0ae1f08b629',
+ 'http://downloads.xiph.org/releases/opus/opus-1.1.4.tar.gz',
+ '9122b6b380081dd2665189f97bfd777f04f92dc3ab6698eea1dbb27ad59d8692',
'lib/libopus.a',
['--disable-shared', '--enable-static'],
)
diff --git a/src/db/Count.cxx b/src/db/Count.cxx
index ddd9e2930..9c3945677 100644
--- a/src/db/Count.cxx
+++ b/src/db/Count.cxx
@@ -62,7 +62,7 @@ Print(Response &r, TagType group, const TagCountMap &m)
}
}
-static bool
+static void
stats_visitor_song(SearchStats &stats, const LightSong &song)
{
stats.n_songs++;
@@ -70,8 +70,6 @@ stats_visitor_song(SearchStats &stats, const LightSong &song)
const auto duration = song.GetDuration();
if (!duration.IsNegative())
stats.total_duration += duration;
-
- return true;
}
static bool
@@ -94,7 +92,7 @@ CollectGroupCounts(TagCountMap &map, TagType group, const Tag &tag)
return found;
}
-static bool
+static void
GroupCountVisitor(TagCountMap &map, TagType group, const LightSong &song)
{
assert(song.tag != nullptr);
@@ -103,8 +101,6 @@ GroupCountVisitor(TagCountMap &map, TagType group, const LightSong &song)
if (!CollectGroupCounts(map, group, tag) && group == TAG_ALBUM_ARTIST)
/* fall back to "Artist" if no "AlbumArtist" was found */
CollectGroupCounts(map, TAG_ARTIST, tag);
-
- return true;
}
void
diff --git a/src/db/DatabasePlaylist.cxx b/src/db/DatabasePlaylist.cxx
index b19895b96..78bbdd5cd 100644
--- a/src/db/DatabasePlaylist.cxx
+++ b/src/db/DatabasePlaylist.cxx
@@ -27,13 +27,12 @@
#include <functional>
-static bool
+static void
AddSong(const Storage &storage, const char *playlist_path_utf8,
const LightSong &song)
{
spl_append_song(playlist_path_utf8,
DatabaseDetachSong(storage, song));
- return true;
}
void
diff --git a/src/db/DatabasePrint.cxx b/src/db/DatabasePrint.cxx
index 8435748fa..87d441d20 100644
--- a/src/db/DatabasePrint.cxx
+++ b/src/db/DatabasePrint.cxx
@@ -49,16 +49,14 @@ PrintDirectoryURI(Response &r, bool base, const LightDirectory &directory)
ApplyBaseFlag(directory.GetPath(), base));
}
-static bool
+static void
PrintDirectoryBrief(Response &r, bool base, const LightDirectory &directory)
{
if (!directory.IsRoot())
PrintDirectoryURI(r, base, directory);
-
- return true;
}
-static bool
+static void
PrintDirectoryFull(Response &r, bool base, const LightDirectory &directory)
{
if (!directory.IsRoot()) {
@@ -67,8 +65,6 @@ PrintDirectoryFull(Response &r, bool base, const LightDirectory &directory)
if (directory.mtime > 0)
time_print(r, "Last-Modified", directory.mtime);
}
-
- return true;
}
static void
@@ -96,7 +92,7 @@ print_playlist_in_directory(Response &r, bool base,
directory->GetPath(), name_utf8);
}
-static bool
+static void
PrintSongBrief(Response &r, Partition &partition,
bool base, const LightSong &song)
{
@@ -106,11 +102,9 @@ PrintSongBrief(Response &r, Partition &partition,
/* this song file has an embedded CUE sheet */
print_playlist_in_directory(r, base,
song.directory, song.uri);
-
- return true;
}
-static bool
+static void
PrintSongFull(Response &r, Partition &partition,
bool base, const LightSong &song)
{
@@ -120,21 +114,18 @@ PrintSongFull(Response &r, Partition &partition,
/* this song file has an embedded CUE sheet */
print_playlist_in_directory(r, base,
song.directory, song.uri);
-
- return true;
}
-static bool
+static void
PrintPlaylistBrief(Response &r, bool base,
const PlaylistInfo &playlist,
const LightDirectory &directory)
{
print_playlist_in_directory(r, base,
&directory, playlist.name.c_str());
- return true;
}
-static bool
+static void
PrintPlaylistFull(Response &r, bool base,
const PlaylistInfo &playlist,
const LightDirectory &directory)
@@ -144,8 +135,6 @@ PrintPlaylistFull(Response &r, bool base,
if (playlist.mtime > 0)
time_print(r, "Last-Modified", playlist.mtime);
-
- return true;
}
void
@@ -191,15 +180,13 @@ db_selection_print(Response &r, Partition &partition,
0, std::numeric_limits<int>::max());
}
-static bool
+static void
PrintSongURIVisitor(Response &r, Partition &partition, const LightSong &song)
{
song_print_uri(r, partition, song);
-
- return true;
}
-static bool
+static void
PrintUniqueTag(Response &r, TagType tag_type,
const Tag &tag)
{
@@ -211,8 +198,6 @@ PrintUniqueTag(Response &r, TagType tag_type,
if (item.type != tag_type)
r.Format("%s: %s\n",
tag_item_names[item.type], item.value);
-
- return true;
}
void
diff --git a/src/db/DatabaseQueue.cxx b/src/db/DatabaseQueue.cxx
index 2c4fffa4d..1b9adcfdc 100644
--- a/src/db/DatabaseQueue.cxx
+++ b/src/db/DatabaseQueue.cxx
@@ -27,14 +27,13 @@
#include <functional>
-static bool
+static void
AddToQueue(Partition &partition, const LightSong &song)
{
const Storage &storage = *partition.instance.storage;
partition.playlist.AppendSong(partition.pc,
DatabaseDetachSong(storage,
song));
- return true;
}
void
diff --git a/src/db/Helpers.cxx b/src/db/Helpers.cxx
index 5ed6d43d3..bff14a3bb 100644
--- a/src/db/Helpers.cxx
+++ b/src/db/Helpers.cxx
@@ -67,15 +67,13 @@ StatsVisitTag(DatabaseStats &stats, StringSet &artists, StringSet &albums,
}
}
-static bool
+static void
StatsVisitSong(DatabaseStats &stats, StringSet &artists, StringSet &albums,
const LightSong &song)
{
++stats.song_count;
StatsVisitTag(stats, artists, albums, *song.tag);
-
- return true;
}
DatabaseStats
diff --git a/src/lib/nfs/Connection.cxx b/src/lib/nfs/Connection.cxx
index 16f6c001d..b417f2fab 100644
--- a/src/lib/nfs/Connection.cxx
+++ b/src/lib/nfs/Connection.cxx
@@ -396,6 +396,17 @@ NfsConnection::ScheduleSocket()
assert(GetEventLoop().IsInside());
assert(context != nullptr);
+ const int which_events = nfs_which_events(context);
+
+ if (which_events == POLLOUT && SocketMonitor::IsDefined())
+ /* kludge: if libnfs asks only for POLLOUT, it means
+ that it is currently waiting for the connect() to
+ finish - rpc_reconnect_requeue() may have been
+ called from inside nfs_service(); we must now
+ unregister the old socket and register the new one
+ instead */
+ SocketMonitor::Steal();
+
if (!SocketMonitor::IsDefined()) {
int _fd = nfs_get_fd(context);
if (_fd < 0)
@@ -405,7 +416,8 @@ NfsConnection::ScheduleSocket()
SocketMonitor::Open(_fd);
}
- SocketMonitor::Schedule(libnfs_to_events(nfs_which_events(context)));
+ SocketMonitor::Schedule(libnfs_to_events(which_events)
+ | SocketMonitor::HANGUP);
}
inline int
@@ -442,10 +454,14 @@ NfsConnection::OnSocketReady(unsigned flags)
bool closed = false;
const bool was_mounted = mount_finished;
- if (!mount_finished)
+ if (!mount_finished || (flags & SocketMonitor::HANGUP) != 0)
/* until the mount is finished, the NFS client may use
various sockets, therefore we unregister and
re-register it each time */
+ /* also re-register the socket if we got a HANGUP,
+ which is a sure sign that libnfs will close the
+ socket, which can lead to a race condition if
+ epoll_ctl() is called later */
SocketMonitor::Steal();
const int result = Service(flags);
diff --git a/src/output/plugins/SndioOutputPlugin.cxx b/src/output/plugins/SndioOutputPlugin.cxx
index 8c4a7327e..f8c154c1a 100644
--- a/src/output/plugins/SndioOutputPlugin.cxx
+++ b/src/output/plugins/SndioOutputPlugin.cxx
@@ -24,8 +24,16 @@
#include "util/Domain.hxx"
#include "Log.hxx"
+/* work around a C++ incompatibility if the sndio API is emulated by
+ libroar: libroar's "struct roar_service_stream" has a member named
+ "new", which is an illegal identifier in C++ */
+#define new new_
+
#include <sndio.h>
+/* undo the libroar workaround */
+#undef new
+
#include <stdexcept>
#ifndef SIO_DEVANY
diff --git a/src/pcm/SampleFormat.hxx b/src/pcm/SampleFormat.hxx
index 25e6352b6..9ac2c8dab 100644
--- a/src/pcm/SampleFormat.hxx
+++ b/src/pcm/SampleFormat.hxx
@@ -64,7 +64,10 @@ enum class SampleFormat : uint8_t {
/**
* Checks whether the sample format is valid.
*/
-static constexpr inline bool
+#if !GCC_OLDER_THAN(5,0)
+constexpr
+#endif
+static inline bool
audio_valid_sample_format(SampleFormat format)
{
switch (format) {
@@ -83,7 +86,10 @@ audio_valid_sample_format(SampleFormat format)
return false;
}
-static constexpr inline unsigned
+#if !GCC_OLDER_THAN(5,0)
+constexpr
+#endif
+static inline unsigned
sample_format_size(SampleFormat format)
{
switch (format) {
diff --git a/src/util/VarSize.hxx b/src/util/VarSize.hxx
index a386e5dc4..5f383bc4b 100644
--- a/src/util/VarSize.hxx
+++ b/src/util/VarSize.hxx
@@ -36,6 +36,7 @@
#include <type_traits>
#include <utility>
#include <new>
+#include <cstdlib>
/**
* Allocate and construct a variable-size object. That is useful for