diff options
author | Max Kellermann <max@duempel.org> | 2009-01-20 22:49:19 +0100 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2009-01-20 22:49:19 +0100 |
commit | 06bd9ad88f452348a01575810fc372244285734b (patch) | |
tree | 78dc0ca01802b8894d5997143c087ac35dcb0436 | |
parent | d10910cc903160231912e5a762af9b54aa2846e0 (diff) | |
download | mpd-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.h | 3 | ||||
-rw-r--r-- | src/player_thread.c | 2 | ||||
-rw-r--r-- | src/playlist.c | 46 | ||||
-rw-r--r-- | src/playlist.h | 5 |
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; |