Playlist: refresh new tags after database update
Fixes regression from commit e96779d
.
This commit is contained in:
parent
10bc1a9acc
commit
d110131ad6
@ -178,6 +178,7 @@ src_mpd_SOURCES = \
|
|||||||
src/PlaylistVector.cxx src/PlaylistVector.hxx \
|
src/PlaylistVector.cxx src/PlaylistVector.hxx \
|
||||||
src/PlaylistInfo.hxx \
|
src/PlaylistInfo.hxx \
|
||||||
src/PlaylistDatabase.cxx src/PlaylistDatabase.hxx \
|
src/PlaylistDatabase.cxx src/PlaylistDatabase.hxx \
|
||||||
|
src/PlaylistUpdate.cxx \
|
||||||
src/IdTable.hxx \
|
src/IdTable.hxx \
|
||||||
src/Queue.cxx src/Queue.hxx \
|
src/Queue.cxx src/Queue.hxx \
|
||||||
src/QueuePrint.cxx src/QueuePrint.hxx \
|
src/QueuePrint.cxx src/QueuePrint.hxx \
|
||||||
|
@ -24,7 +24,7 @@
|
|||||||
void
|
void
|
||||||
Partition::DatabaseModified()
|
Partition::DatabaseModified()
|
||||||
{
|
{
|
||||||
playlist.FullIncrementVersions();
|
playlist.DatabaseModified();
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -28,13 +28,6 @@
|
|||||||
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
|
||||||
void
|
|
||||||
playlist::FullIncrementVersions()
|
|
||||||
{
|
|
||||||
queue.ModifyAll();
|
|
||||||
idle_add(IDLE_PLAYLIST);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
playlist::TagModified(Song &&song)
|
playlist::TagModified(Song &&song)
|
||||||
{
|
{
|
||||||
|
@ -135,7 +135,10 @@ public:
|
|||||||
*/
|
*/
|
||||||
void TagModified(Song &&song);
|
void TagModified(Song &&song);
|
||||||
|
|
||||||
void FullIncrementVersions();
|
/**
|
||||||
|
* The database has been modified. Pull all updates.
|
||||||
|
*/
|
||||||
|
void DatabaseModified();
|
||||||
|
|
||||||
PlaylistResult AppendSong(player_control &pc,
|
PlaylistResult AppendSong(player_control &pc,
|
||||||
Song *song,
|
Song *song,
|
||||||
|
80
src/PlaylistUpdate.cxx
Normal file
80
src/PlaylistUpdate.cxx
Normal file
@ -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);
|
||||||
|
}
|
||||||
|
}
|
@ -85,15 +85,6 @@ queue::ModifyAtOrder(unsigned _order)
|
|||||||
ModifyAtPosition(position);
|
ModifyAtPosition(position);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
queue::ModifyAll()
|
|
||||||
{
|
|
||||||
for (unsigned i = 0; i < length; i++)
|
|
||||||
items[i].version = version;
|
|
||||||
|
|
||||||
IncrementVersion();
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned
|
unsigned
|
||||||
queue::Append(Song *song, uint8_t priority)
|
queue::Append(Song *song, uint8_t priority)
|
||||||
{
|
{
|
||||||
|
@ -258,11 +258,6 @@ struct queue {
|
|||||||
*/
|
*/
|
||||||
void ModifyAtOrder(unsigned order);
|
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
|
* Appends a song to the queue and returns its position. Prior to
|
||||||
* that, the caller must check if the queue is already full.
|
* that, the caller must check if the queue is already full.
|
||||||
|
Loading…
Reference in New Issue
Block a user