playlist: track song metadata changes
When the tag of the current song changes (e.g. a new tag was sent in the stream), update the playlist, so clients pick up the new tag.
This commit is contained in:
		| @@ -830,13 +830,8 @@ enum playlist_result playPlaylistById(int id, int stopOnError) | ||||
|  | ||||
| static void syncCurrentPlayerDecodeMetadata(void) | ||||
| { | ||||
| 	struct song *songPlayer = playerCurrentDecodeSong(); | ||||
| 	struct song *song; | ||||
| 	int songNum; | ||||
| 	char path_max_tmp[MPD_PATH_MAX]; | ||||
|  | ||||
| 	if (!songPlayer) | ||||
| 		return; | ||||
|  | ||||
| 	if (playlist_state != PLAYLIST_STATE_PLAY) | ||||
| 		return; | ||||
| @@ -844,16 +839,18 @@ static void syncCurrentPlayerDecodeMetadata(void) | ||||
| 	songNum = playlist.order[playlist.current]; | ||||
| 	song = playlist.songs[songNum]; | ||||
|  | ||||
| 	if (!song_is_file(song) && | ||||
| 	    0 == strcmp(song_get_url(song, path_max_tmp), songPlayer->url) && | ||||
| 	    !tag_equal(song->tag, songPlayer->tag)) { | ||||
| 		assert(!song_in_database(song)); | ||||
| 	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 */ | ||||
|  | ||||
| 		if (song->tag) | ||||
| 			tag_free(song->tag); | ||||
| 		song->tag = tag_dup(songPlayer->tag); | ||||
| 		playlist.songMod[songNum] = playlist.version; | ||||
| 		incrPlaylistVersion(); | ||||
|  | ||||
| 		playlist.prev_tag = song->tag; | ||||
| 	} | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -54,6 +54,11 @@ 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; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Max Kellermann
					Max Kellermann