queue_save: save song priorities

This commit is contained in:
Max Kellermann 2012-08-21 19:17:14 +02:00
parent ef5125f8f4
commit 5ad21d7e98
6 changed files with 27 additions and 7 deletions

1
NEWS
View File

@ -13,6 +13,7 @@ ver 0.17.2 (2012/??/??)
* mapper: fix potential crash in file permission check * mapper: fix potential crash in file permission check
* playlist: fix use-after-free bug * playlist: fix use-after-free bug
* playlist: fix memory leak * playlist: fix memory leak
* state_file: save song priorities
ver 0.17.1 (2012/07/31) ver 0.17.1 (2012/07/31)

View File

@ -83,7 +83,7 @@ playlist_append_song(struct playlist *playlist, struct player_control *pc,
queued = playlist_get_queued_song(playlist); queued = playlist_get_queued_song(playlist);
id = queue_append(&playlist->queue, song); id = queue_append(&playlist->queue, song, 0);
if (playlist->queue.random) { if (playlist->queue.random) {
/* shuffle the new song into the list of remaining /* shuffle the new song into the list of remaining

View File

@ -96,7 +96,7 @@ queue_modify_all(struct queue *queue)
} }
unsigned 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); unsigned id = queue_generate_id(queue);
@ -106,7 +106,7 @@ queue_append(struct queue *queue, struct song *song)
.song = song, .song = song,
.id = id, .id = id,
.version = queue->version, .version = queue->version,
.priority = 0, .priority = priority,
}; };
queue->order[queue->length] = queue->length; queue->order[queue->length] = queue->length;

View File

@ -280,9 +280,11 @@ queue_modify_all(struct queue *queue);
* *
* If a song is not in the database (determined by * If a song is not in the database (determined by
* song_in_database()), it is freed when removed from the queue. * song_in_database()), it is freed when removed from the queue.
*
* @param priority the priority of this new queue item
*/ */
unsigned 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. * Swaps two songs, addressed by their position.

View File

@ -24,9 +24,12 @@
#include "uri.h" #include "uri.h"
#include "database.h" #include "database.h"
#include "song_save.h" #include "song_save.h"
#include "text_file.h"
#include <stdlib.h> #include <stdlib.h>
#define PRIO_LABEL "Prio: "
static void static void
queue_save_database_song(FILE *fp, int idx, const struct song *song) queue_save_database_song(FILE *fp, int idx, const struct song *song)
{ {
@ -54,9 +57,14 @@ queue_save_song(FILE *fp, int idx, const struct song *song)
void void
queue_save(FILE *fp, const struct queue *queue) 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)); queue_save_song(fp, i, queue_get(queue, i));
} }
}
static struct song * static struct song *
get_song(const char *uri) get_song(const char *uri)
@ -75,6 +83,15 @@ queue_load_song(FILE *fp, GString *buffer, const char *line,
if (queue_is_full(queue)) if (queue_is_full(queue))
return; 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)) { if (g_str_has_prefix(line, SONG_BEGIN)) {
const char *uri = line + sizeof(SONG_BEGIN) - 1; const char *uri = line + sizeof(SONG_BEGIN) - 1;
if (!uri_has_scheme(uri) && !g_path_is_absolute(uri)) 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; return;
} }
queue_append(queue, song); queue_append(queue, song, priority);
} }

View File

@ -41,7 +41,7 @@ main(G_GNUC_UNUSED int argc, G_GNUC_UNUSED char **argv)
queue_init(&queue, 32); queue_init(&queue, 32);
for (unsigned i = 0; i < G_N_ELEMENTS(songs); ++i) 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)); assert(queue_length(&queue) == G_N_ELEMENTS(songs));