diff --git a/NEWS b/NEWS index 41a69d8e5..7bdfa353c 100644 --- a/NEWS +++ b/NEWS @@ -13,6 +13,7 @@ ver 0.17.2 (2012/??/??) * mapper: fix potential crash in file permission check * playlist: fix use-after-free bug * playlist: fix memory leak +* state_file: save song priorities ver 0.17.1 (2012/07/31) diff --git a/src/playlist_edit.c b/src/playlist_edit.c index 7adbccd7c..d10f49451 100644 --- a/src/playlist_edit.c +++ b/src/playlist_edit.c @@ -83,7 +83,7 @@ playlist_append_song(struct playlist *playlist, struct player_control *pc, queued = playlist_get_queued_song(playlist); - id = queue_append(&playlist->queue, song); + id = queue_append(&playlist->queue, song, 0); if (playlist->queue.random) { /* shuffle the new song into the list of remaining diff --git a/src/queue.c b/src/queue.c index cd932875e..4fe564a35 100644 --- a/src/queue.c +++ b/src/queue.c @@ -96,7 +96,7 @@ queue_modify_all(struct queue *queue) } unsigned -queue_append(struct queue *queue, struct song *song) +queue_append(struct queue *queue, struct song *song, uint8_t priority) { unsigned id = queue_generate_id(queue); @@ -106,7 +106,7 @@ queue_append(struct queue *queue, struct song *song) .song = song, .id = id, .version = queue->version, - .priority = 0, + .priority = priority, }; queue->order[queue->length] = queue->length; diff --git a/src/queue.h b/src/queue.h index 5cb5c196b..e4bfcdffa 100644 --- a/src/queue.h +++ b/src/queue.h @@ -280,9 +280,11 @@ queue_modify_all(struct queue *queue); * * If a song is not in the database (determined by * song_in_database()), it is freed when removed from the queue. + * + * @param priority the priority of this new queue item */ unsigned -queue_append(struct queue *queue, struct song *song); +queue_append(struct queue *queue, struct song *song, uint8_t priority); /** * Swaps two songs, addressed by their position. diff --git a/src/queue_save.c b/src/queue_save.c index a7c511c0e..16852d3c1 100644 --- a/src/queue_save.c +++ b/src/queue_save.c @@ -24,9 +24,12 @@ #include "uri.h" #include "database.h" #include "song_save.h" +#include "text_file.h" #include +#define PRIO_LABEL "Prio: " + static void queue_save_database_song(FILE *fp, int idx, const struct song *song) { @@ -54,8 +57,13 @@ queue_save_song(FILE *fp, int idx, const struct song *song) void queue_save(FILE *fp, const struct queue *queue) { - for (unsigned i = 0; i < queue_length(queue); i++) + for (unsigned i = 0; i < queue_length(queue); i++) { + uint8_t prio = queue_get_priority_at_position(queue, i); + if (prio != 0) + fprintf(fp, PRIO_LABEL "%u\n", prio); + queue_save_song(fp, i, queue_get(queue, i)); + } } static struct song * @@ -75,6 +83,15 @@ queue_load_song(FILE *fp, GString *buffer, const char *line, if (queue_is_full(queue)) return; + uint8_t priority = 0; + if (g_str_has_prefix(line, PRIO_LABEL)) { + priority = strtoul(line + sizeof(PRIO_LABEL) - 1, NULL, 10); + + line = read_text_line(fp, buffer); + if (line == NULL) + return; + } + if (g_str_has_prefix(line, SONG_BEGIN)) { const char *uri = line + sizeof(SONG_BEGIN) - 1; if (!uri_has_scheme(uri) && !g_path_is_absolute(uri)) @@ -102,5 +119,5 @@ queue_load_song(FILE *fp, GString *buffer, const char *line, return; } - queue_append(queue, song); + queue_append(queue, song, priority); } diff --git a/test/test_queue_priority.c b/test/test_queue_priority.c index a7106a8e9..5543edbba 100644 --- a/test/test_queue_priority.c +++ b/test/test_queue_priority.c @@ -41,7 +41,7 @@ main(G_GNUC_UNUSED int argc, G_GNUC_UNUSED char **argv) queue_init(&queue, 32); for (unsigned i = 0; i < G_N_ELEMENTS(songs); ++i) - queue_append(&queue, &songs[i]); + queue_append(&queue, &songs[i], 0); assert(queue_length(&queue) == G_N_ELEMENTS(songs));