aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2009-01-20 22:49:19 +0100
committerMax Kellermann <max@duempel.org>2009-01-20 22:49:19 +0100
commit06bd9ad88f452348a01575810fc372244285734b (patch)
tree78dc0ca01802b8894d5997143c087ac35dcb0436
parentd10910cc903160231912e5a762af9b54aa2846e0 (diff)
downloadmpd-06bd9ad88f452348a01575810fc372244285734b.tar.gz
mpd-06bd9ad88f452348a01575810fc372244285734b.tar.xz
mpd-06bd9ad88f452348a01575810fc372244285734b.zip
event_pipe: added "TAG" event
The "TAG" event is emitted by the player thread when the current song's tag has changed. Split this event from "PLAYLIST" and make it a separate callback, which is more efficient.
Diffstat (limited to '')
-rw-r--r--src/event_pipe.h3
-rw-r--r--src/player_thread.c2
-rw-r--r--src/playlist.c46
-rw-r--r--src/playlist.h5
4 files changed, 22 insertions, 34 deletions
diff --git a/src/event_pipe.h b/src/event_pipe.h
index 707da4611..5966d0674 100644
--- a/src/event_pipe.h
+++ b/src/event_pipe.h
@@ -36,6 +36,9 @@ enum pipe_event {
/** must call syncPlayerAndPlaylist() */
PIPE_EVENT_PLAYLIST,
+ /** the current song's tag has changed */
+ PIPE_EVENT_TAG,
+
/** SIGHUP received: reload configuration, roll log file */
PIPE_EVENT_RELOAD,
diff --git a/src/player_thread.c b/src/player_thread.c
index 5c187ccd7..3da6e1e54 100644
--- a/src/player_thread.c
+++ b/src/player_thread.c
@@ -249,7 +249,7 @@ play_chunk(struct song *song, struct music_chunk *chunk,
/* the main thread will update the playlist
version when he receives this event */
- event_pipe_emit(PIPE_EVENT_PLAYLIST);
+ event_pipe_emit(PIPE_EVENT_TAG);
/* notify all clients that the tag of the
current song has changed */
diff --git a/src/playlist.c b/src/playlist.c
index e4f9e3538..72973610c 100644
--- a/src/playlist.c
+++ b/src/playlist.c
@@ -32,6 +32,7 @@
#include "stored_playlist.h"
#include "ack.h"
#include "idle.h"
+#include "event_pipe.h"
#include <glib.h>
@@ -117,6 +118,21 @@ static void incrPlaylistCurrent(void)
playlist.current++;
}
+static void
+playlist_tag_event(void)
+{
+ unsigned song;
+
+ if (playlist_state != PLAYLIST_STATE_PLAY)
+ return;
+
+ assert(playlist.current >= 0);
+
+ song = playlist.order[playlist.current];
+ playlist.songMod[song] = playlist.version;
+ incrPlaylistVersion();
+}
+
void initPlaylist(void)
{
char *test;
@@ -162,6 +178,8 @@ void initPlaylist(void)
i++) {
playlist.idToPosition[i] = -1;
}
+
+ event_pipe_register(PIPE_EVENT_TAG, playlist_tag_event);
}
static unsigned getNextId(void)
@@ -857,32 +875,6 @@ enum playlist_result playPlaylistById(int id, int stopOnError)
return playPlaylist(song, stopOnError);
}
-static void syncCurrentPlayerDecodeMetadata(void)
-{
- struct song *song;
- int songNum;
-
- if (playlist_state != PLAYLIST_STATE_PLAY)
- return;
-
- songNum = playlist.order[playlist.current];
- song = playlist.songs[songNum];
-
- if (song != playlist.prev_song) {
- /* song change: initialize playlist.prev_{song,tag} */
-
- playlist.prev_song = song;
- playlist.prev_tag = song->tag;
- } else if (song->tag != playlist.prev_tag) {
- /* tag change: update playlist */
-
- playlist.songMod[songNum] = playlist.version;
- incrPlaylistVersion();
-
- playlist.prev_tag = song->tag;
- }
-}
-
void syncPlayerAndPlaylist(void)
{
if (playlist_state != PLAYLIST_STATE_PLAY)
@@ -895,8 +887,6 @@ void syncPlayerAndPlaylist(void)
if (pc.next_song == NULL)
queueNextSongInPlaylist();
}
-
- syncCurrentPlayerDecodeMetadata();
}
static void currentSongInPlaylist(void)
diff --git a/src/playlist.h b/src/playlist.h
index 19dc747e9..251297c4f 100644
--- a/src/playlist.h
+++ b/src/playlist.h
@@ -55,11 +55,6 @@ typedef struct _Playlist {
bool repeat;
bool random;
uint32_t version;
-
- /** used by syncCurrentPlayerDecodeMetadata() to detect tag changes */
- const struct song *prev_song;
- /** used by syncCurrentPlayerDecodeMetadata() to detect tag changes */
- const struct tag *prev_tag;
} Playlist;
extern bool playlist_saveAbsolutePaths;