void playlist_append_entries(struct playlist *pl, struct playlist *source_pl) { while (source_pl->first) { struct playlist_entry *e = source_pl->first; playlist_unlink(source_pl, e); playlist_add(pl, e); } }
// Moves entry such that entry->prev = at (even if at is NULL) void playlist_move(struct playlist *pl, struct playlist_entry *entry, struct playlist_entry *at) { struct playlist_entry *save_current = pl->current; bool save_replaced = pl->current_was_replaced; playlist_unlink(pl, entry); playlist_insert(pl, at ? at->prev : pl->last, entry); pl->current = save_current; pl->current_was_replaced = save_replaced; }
// Move all entries from source_pl to pl, appending them after the current entry // of pl. source_pl will be empty, and all entries have changed ownership to pl. void playlist_transfer_entries(struct playlist *pl, struct playlist *source_pl) { struct playlist_entry *add_after = pl->current; if (pl->current && pl->current_was_replaced) add_after = pl->current->next; if (!add_after) add_after = pl->last; while (source_pl->first) { struct playlist_entry *e = source_pl->first; playlist_unlink(source_pl, e); playlist_insert(pl, add_after, e); } }
void playlist_shuffle(struct playlist *pl) { struct playlist_entry *save_current = pl->current; bool save_replaced = pl->current_was_replaced; int count = playlist_count(pl); struct playlist_entry **arr = talloc_array(NULL, struct playlist_entry *, count); for (int n = 0; n < count; n++) { arr[n] = pl->first; playlist_unlink(pl, pl->first); } for (int n = 0; n < count; n++) { int other = (int)((double)(count) * rand() / (RAND_MAX + 1.0)); struct playlist_entry *tmp = arr[n]; arr[n] = arr[other]; arr[other] = tmp; } for (int n = 0; n < count; n++) playlist_add(pl, arr[n]); talloc_free(arr); pl->current = save_current; pl->current_was_replaced = save_replaced; }
void playlist_remove(struct playlist *pl, struct playlist_entry *entry) { playlist_unlink(pl, entry); entry->removed = true; playlist_entry_unref(entry); }
void playlist_remove(struct playlist *pl, struct playlist_entry *entry) { playlist_unlink(pl, entry); talloc_free(entry); }