diff options
author | Max Kellermann <max@duempel.org> | 2013-10-22 00:36:48 +0200 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2013-10-22 01:05:29 +0200 |
commit | d110131ad68fc834f972ab81b1c2292a8c0dacd9 (patch) | |
tree | baa2af808980f19aa6cae829c65dc594231cc689 | |
parent | 10bc1a9acc582636b391e5f60f989d2fefb23d05 (diff) |
Playlist: refresh new tags after database update
Fixes regression from commit e96779d.
-rw-r--r-- | Makefile.am | 1 | ||||
-rw-r--r-- | src/Partition.cxx | 2 | ||||
-rw-r--r-- | src/Playlist.cxx | 7 | ||||
-rw-r--r-- | src/Playlist.hxx | 5 | ||||
-rw-r--r-- | src/PlaylistUpdate.cxx | 80 | ||||
-rw-r--r-- | src/Queue.cxx | 9 | ||||
-rw-r--r-- | src/Queue.hxx | 5 |
7 files changed, 86 insertions, 23 deletions
diff --git a/Makefile.am b/Makefile.am index ecc86d904..b3f62b6f7 100644 --- a/Makefile.am +++ b/Makefile.am @@ -178,6 +178,7 @@ src_mpd_SOURCES = \ src/PlaylistVector.cxx src/PlaylistVector.hxx \ src/PlaylistInfo.hxx \ src/PlaylistDatabase.cxx src/PlaylistDatabase.hxx \ + src/PlaylistUpdate.cxx \ src/IdTable.hxx \ src/Queue.cxx src/Queue.hxx \ src/QueuePrint.cxx src/QueuePrint.hxx \ diff --git a/src/Partition.cxx b/src/Partition.cxx index 0ad1692a6..55750cfad 100644 --- a/src/Partition.cxx +++ b/src/Partition.cxx @@ -24,7 +24,7 @@ void Partition::DatabaseModified() { - playlist.FullIncrementVersions(); + playlist.DatabaseModified(); } void diff --git a/src/Playlist.cxx b/src/Playlist.cxx index 2f01d6be9..134abf7ff 100644 --- a/src/Playlist.cxx +++ b/src/Playlist.cxx @@ -29,13 +29,6 @@ #include <assert.h> void -playlist::FullIncrementVersions() -{ - queue.ModifyAll(); - idle_add(IDLE_PLAYLIST); -} - -void playlist::TagModified(Song &&song) { if (!playing || song.tag == nullptr) diff --git a/src/Playlist.hxx b/src/Playlist.hxx index 88ea099c5..ed397eadc 100644 --- a/src/Playlist.hxx +++ b/src/Playlist.hxx @@ -135,7 +135,10 @@ public: */ void TagModified(Song &&song); - void FullIncrementVersions(); + /** + * The database has been modified. Pull all updates. + */ + void DatabaseModified(); PlaylistResult AppendSong(player_control &pc, Song *song, diff --git a/src/PlaylistUpdate.cxx b/src/PlaylistUpdate.cxx new file mode 100644 index 000000000..0e72ef671 --- /dev/null +++ b/src/PlaylistUpdate.cxx @@ -0,0 +1,80 @@ +/* + * Copyright (C) 2003-2013 The Music Player Daemon Project + * http://www.musicpd.org + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include "config.h" +#include "Playlist.hxx" +#include "DatabaseGlue.hxx" +#include "DatabasePlugin.hxx" +#include "Song.hxx" +#include "tag/Tag.hxx" +#include "Idle.hxx" +#include "util/Error.hxx" + +static bool +UpdatePlaylistSong(const Database &db, Song &song) +{ + if (!song.IsInDatabase() || !song.IsDetached()) + /* only update Songs instances that are "detached" + from the Database */ + return false; + + Song *original = db.GetSong(song.uri, IgnoreError()); + if (original == nullptr) + /* not found - shouldn't happen, because the update + thread should ensure that all stale Song instances + have been purged */ + return false; + + if (original->mtime == song.mtime) { + /* not modified */ + db.ReturnSong(original); + return false; + } + + song.mtime = original->mtime; + + if (original->tag != nullptr) + song.ReplaceTag(Tag(*original->tag)); + + db.ReturnSong(original); + return true; +} + +void +playlist::DatabaseModified() +{ + const Database *db = GetDatabase(); + if (db == nullptr) + /* how can this ever happen? */ + return; + + bool modified = false; + + for (unsigned i = 0, n = queue.GetLength(); i != n; ++i) { + if (UpdatePlaylistSong(*db, queue.Get(i))) { + queue.ModifyAtPosition(i); + modified = true; + } + } + + if (modified) { + queue.IncrementVersion(); + idle_add(IDLE_PLAYLIST); + } +} diff --git a/src/Queue.cxx b/src/Queue.cxx index 017dfefc3..451609438 100644 --- a/src/Queue.cxx +++ b/src/Queue.cxx @@ -85,15 +85,6 @@ queue::ModifyAtOrder(unsigned _order) ModifyAtPosition(position); } -void -queue::ModifyAll() -{ - for (unsigned i = 0; i < length; i++) - items[i].version = version; - - IncrementVersion(); -} - unsigned queue::Append(Song *song, uint8_t priority) { diff --git a/src/Queue.hxx b/src/Queue.hxx index d5b9218a5..da90d4a3d 100644 --- a/src/Queue.hxx +++ b/src/Queue.hxx @@ -259,11 +259,6 @@ struct queue { void ModifyAtOrder(unsigned order); /** - * Marks all songs as "modified" and increments the version number. - */ - void ModifyAll(); - - /** * Appends a song to the queue and returns its position. Prior to * that, the caller must check if the queue is already full. * |