summaryrefslogtreecommitdiffstats
path: root/src/data.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/data.c')
-rw-r--r--src/data.c36
1 files changed, 25 insertions, 11 deletions
diff --git a/src/data.c b/src/data.c
index 1fbc3e8..5ef1abe 100644
--- a/src/data.c
+++ b/src/data.c
@@ -233,11 +233,33 @@ tracks_update(struct tag *tag)
list_sort(&tracks, track_fid_compare);
+ playlist_update();
+
closedir(dir);
return true;
}
void
+playlist_update(void)
+{
+ struct link *link, *link2;
+ struct track *track;
+ struct ref *ref;
+ struct tag *tag;
+
+ refs_free(&player.playlist);
+ for (LIST_ITER(&tags_sel, link)) {
+ tag = UPCAST(link, struct ref)->data;
+ for (LIST_ITER(&tag->tracks, link2)) {
+ track = UPCAST(link2, struct ref)->data;
+ ref = ref_alloc(track);
+ ASSERT(ref != NULL);
+ list_push_back(&player.playlist, LINK(ref));
+ }
+ }
+}
+
+void
tracks_load(struct tag *tag)
{
char linebuf[1024];
@@ -325,23 +347,13 @@ track_rm(struct track *track)
struct link *link;
struct ref *ref;
struct tag *tag;
- bool found;
if (!rm_file(track->fpath)) {
CMD_SET_STATUS("Failed to remove track");
return false;
}
- found = false;
- for (LIST_ITER(&tracks, link)) {
- ref = UPCAST(link, struct ref);
- if (ref->data == track) {
- link_pop(link);
- ref_free(ref);
- found = true;
- break;
- }
- }
+ refs_rm(&tracks, track);
for (LIST_ITER(&track->tags, link)) {
ref = UPCAST(link, struct ref);
@@ -349,6 +361,8 @@ track_rm(struct track *track)
refs_rm(&tag->tracks, track);
}
+ refs_rm(&player.playlist, track);
+
if (player.track == track)
player.track = NULL;