commit aaccc123cdde1db6b2a237e2bf409a6e4b57a864 from: Omar Polo date: Wed Feb 16 22:17:31 2022 UTC introduce some helpers to simplify playlist management commit - 8891f624779ed4fa401c84d7a82ac804a04faa96 commit + aaccc123cdde1db6b2a237e2bf409a6e4b57a864 blob - 788ef4361dcf20851dd5a2a13d271468d57a9fe9 blob + ecebe462e172d3998394f107fc495bf4dd088ae6 --- amused.c +++ amused.c @@ -138,7 +138,6 @@ main_dispatch_player(int sig, short event, void *d) struct imsg imsg; ssize_t n; int shut = 0; - const char *song; if (event & EV_READ) { if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) @@ -160,13 +159,10 @@ main_dispatch_player(int sig, short event, void *d) break; switch (imsg.hdr.type) { - case IMSG_EOF: case IMSG_ERR: - song = playlist_advance(); - if (song == NULL) - break; - /* XXX: watch out for failures! */ - main_play_song(song); + /* TODO: remove current track from the playlist */ + case IMSG_EOF: + main_playlist_advance(); break; default: log_debug("%s: error handling imsg %d", __func__, @@ -378,20 +374,50 @@ main_play_song(const char *song) strlcpy(path, song, sizeof(path)); if ((fd = open(path, O_RDONLY)) == -1) { -#if todo log_warn("open %s", path); return -1; -#else - fatal("open %s", path); -#endif } + play_state = STATE_PLAYING; imsg_compose_event(iev_player, IMSG_PLAY, 0, 0, fd, path, sizeof(path)); return 0; +} + +void +main_playlist_advance(void) +{ + const char *song; + + for (;;) { + song = playlist_advance(); + if (song == NULL) + return; + + if (main_play_song(song)) + break; + + /* TODO: remove the song from the playlist */ + } } void +main_restart_track(void) +{ + const char *song; + + song = playlist_current(); + if (song == NULL) + return; + + if (main_play_song(song)) + return; + + /* TODO: remove the song from the playlist */ + main_playlist_advance(); +} + +void main_enqueue(struct imsgev *iev, struct imsg *imsg) { size_t datalen; blob - f6be8f6fce8a4df8e049ac58e182443f25ae99c3 blob + 77712b46d1856aa8ac18ce799cc122014d80b52b --- amused.h +++ amused.h @@ -86,7 +86,8 @@ void imsg_event_add(struct imsgev *iev); int imsg_compose_event(struct imsgev *, uint16_t, uint32_t, pid_t, int, const void *, uint16_t); int main_send_player(uint16_t, int, const void *, uint16_t); -int main_play_song(const char *); +void main_playlist_advance(void); +void main_restart_track(void); void main_enqueue(struct imsgev *, struct imsg *); /* ctl.c */ blob - ad46624765e58f1927d9152815042267e9a3f676 blob + fe847f1b67c4856351914c7ac73f301d173219ac --- control.c +++ control.c @@ -222,7 +222,6 @@ control_dispatch_imsg(int fd, short event, void *bula) struct ctl_conn *c; struct imsg imsg; ssize_t n; - const char *song; if ((c = control_connbyfd(fd)) == NULL) { log_warnx("%s: fd %d: not found", __func__, fd); @@ -255,12 +254,7 @@ control_dispatch_imsg(int fd, short event, void *bula) case IMSG_CTL_PLAY: switch (play_state) { case STATE_STOPPED: - song = playlist_advance(); - if (song == NULL) - break; - /* XXX: watch out for failures! */ - play_state = STATE_PLAYING; - main_play_song(song); + main_playlist_advance(); break; case STATE_PLAYING: /* do nothing */ @@ -274,11 +268,7 @@ control_dispatch_imsg(int fd, short event, void *bula) case IMSG_CTL_TOGGLE_PLAY: switch (play_state) { case STATE_STOPPED: - song = playlist_advance(); - if (song == NULL) - break; - /* XXX: watch out for failures! */ - main_play_song(song); + main_playlist_advance(); break; case STATE_PLAYING: main_send_player(IMSG_PAUSE, -1, NULL, 0); @@ -301,11 +291,7 @@ control_dispatch_imsg(int fd, short event, void *bula) break; case IMSG_CTL_RESTART: main_send_player(IMSG_STOP, -1, NULL, 0); - song = playlist_current(); - if (song == NULL) - break; - /* XXX: watch out for failures */ - main_play_song(song); + main_restart_track(); break; case IMSG_CTL_ADD: main_enqueue(&c->iev, &imsg);