Commit Diff
Commit:
74c987d53230b125b919cd1ab99426e6d81a8bbc
Date:
Sat Feb 19 10:16:25 2022
UTC
Message:
keep current song in a dedicated variable
playlist.songs[play_off] is not a good representation for the current
playing song after all. After a `load' command, or a flush request, the
play_off changes but we're still playing the "old" song.
This saves the current song in a dedicated variable that's updated upon
playlist_advance and playlist_previous, thus givin a more accurate view.
--- amused.c
+++ amused.c
@@ -103,7 +103,7 @@ main_status(void)
break;
}
- if ((cur = playlist_current()) != NULL)
+ if ((cur = current_song) != NULL)
log_info("playing %s", cur);
else
log_info("not playing anything");
@@ -437,7 +437,7 @@ main_playlist_resume(void)
{
const char *song;
- if ((song = playlist_current()) == NULL)
+ if ((song = current_song) == NULL)
song = playlist_advance();
for (; song != NULL; song = playlist_advance()) {
@@ -487,7 +487,7 @@ main_restart_track(void)
{
const char *song;
- song = playlist_current();
+ song = current_song;
if (song == NULL)
return;
@@ -556,13 +556,11 @@ main_send_status(struct imsgev *iev)
main_send_status(struct imsgev *iev)
{
struct player_status s;
- const char *song;
memset(&s, 0, sizeof(s));
- song = playlist_current();
- if (song != NULL)
- strlcpy(s.path, song, sizeof(s.path));
+ if (current_song != NULL)
+ strlcpy(s.path, current_song, sizeof(s.path));
s.status = play_state;
imsg_compose_event(iev, IMSG_CTL_STATUS, 0, 0, -1, &s, sizeof(s));
--- playlist.c
+++ playlist.c
@@ -27,12 +27,23 @@ struct playlist playlist;
#define MAX(a, b) ((a) > (b) ? (a) : (b))
-struct playlist playlist;
-enum play_state play_state;
-int repeat_one;
-int repeat_all = 1;
-ssize_t play_off = -1;
+struct playlist playlist;
+enum play_state play_state;
+int repeat_one;
+int repeat_all = 1;
+ssize_t play_off = -1;
+const char *current_song;
+static void
+setsong(ssize_t i)
+{
+ free((char *)current_song);
+ if (i == -1)
+ current_song = NULL;
+ else
+ current_song = xstrdup(playlist.songs[i]);
+}
+
void
playlist_swap(struct playlist *p)
{
@@ -92,17 +103,6 @@ playlist_current(void)
}
const char *
-playlist_current(void)
-{
- if (playlist.len == 0 || play_off == -1) {
- play_state = STATE_STOPPED;
- return NULL;
- }
-
- return playlist.songs[play_off];
-}
-
-const char *
playlist_advance(void)
{
if (playlist.len == 0) {
@@ -117,10 +117,12 @@ playlist_advance(void)
else {
play_state = STATE_STOPPED;
play_off = -1;
+ setsong(play_off);
return NULL;
}
}
+ setsong(play_off);
play_state = STATE_PLAYING;
return playlist.songs[play_off];
}
@@ -140,10 +142,12 @@ playlist_previous(void)
else {
play_state = STATE_STOPPED;
play_off = -1;
+ setsong(play_off);
return NULL;
}
}
+ setsong(play_off);
play_state = STATE_PLAYING;
return playlist.songs[play_off];
}
@@ -212,5 +216,6 @@ playlist_jump(const char *arg)
play_state = STATE_PLAYING;
play_off = i;
+ setsong(play_off);
return playlist.songs[i];
}
--- playlist.h
+++ playlist.h
@@ -35,11 +35,11 @@ extern ssize_t play_off;
extern int repeat_one;
extern int repeat_all;
extern ssize_t play_off;
+extern const char *current_song;
void playlist_swap(struct playlist *);
void playlist_push(struct playlist *, const char *);
void playlist_enqueue(const char *);
-const char *playlist_current(void);
const char *playlist_advance(void);
const char *playlist_previous(void);
void playlist_reset(void);
Omar Polo