Commit Diff


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