From d110131ad68fc834f972ab81b1c2292a8c0dacd9 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Tue, 22 Oct 2013 00:36:48 +0200 Subject: Playlist: refresh new tags after database update Fixes regression from commit e96779d. --- Makefile.am | 1 + src/Partition.cxx | 2 +- src/Playlist.cxx | 7 ----- src/Playlist.hxx | 5 +++- src/PlaylistUpdate.cxx | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/Queue.cxx | 9 ------ src/Queue.hxx | 5 ---- 7 files changed, 86 insertions(+), 23 deletions(-) create mode 100644 src/PlaylistUpdate.cxx 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 @@ -28,13 +28,6 @@ #include -void -playlist::FullIncrementVersions() -{ - queue.ModifyAll(); - idle_add(IDLE_PLAYLIST); -} - void playlist::TagModified(Song &&song) { 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 @@ -258,11 +258,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. -- cgit v1.2.3