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
* playlist: fix use-after-free bug
* playlist: fix memory leak
* state_file: save song priorities
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);
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

View File

@ -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;

View File

@ -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.

View File

@ -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);
}

View File

@ -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));