aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--NEWS1
-rw-r--r--src/playlist_edit.c2
-rw-r--r--src/queue.c4
-rw-r--r--src/queue.h4
-rw-r--r--src/queue_save.c21
-rw-r--r--test/test_queue_priority.c2
6 files changed, 27 insertions, 7 deletions
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 <stdlib.h>
+#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));