Commit Diff


commit - 5e52fc420c6894ef71b681ed0b4047298e9c4355
commit + 17ef54d6ac6c34b0b1370c1c57836322702783e1
blob - 1ef3fdea14435e796b7acd3ca89c2250582878d2
blob + 62e1d02ba3a388d9eb1249ec41f666d8270c6466
--- amused.c
+++ amused.c
@@ -102,9 +102,11 @@ main_sig_handler(int sig, short event, void *arg)
 static void
 main_dispatch_player(int sig, short event, void *d)
 {
+	char		*errstr;
 	struct imsgev	*iev = d;
 	struct imsgbuf	*ibuf = &iev->ibuf;
 	struct imsg	 imsg;
+	size_t		 datalen;
 	ssize_t		 n;
 	int		 shut = 0;
 
@@ -127,9 +129,16 @@ main_dispatch_player(int sig, short event, void *d)
 		if (n == 0)	/* No more messages. */
 			break;
 
+		datalen = IMSG_DATA_SIZE(imsg);
 		switch (imsg.hdr.type) {
 		case IMSG_ERR:
-			log_warnx("failed to play, skipping %s", current_song);
+			if (datalen == 0)
+				errstr = "unknown error";
+			else {
+				errstr = imsg.data;
+				errstr[datalen-1] = '\0';
+			}
+			log_warnx("%s; skipping %s", errstr, current_song);
 			playlist_dropcurrent();
 			/* fallthrough */
 		case IMSG_EOF:
blob - 81634a091f11596ad1fb2cad0f4c6b4298ea0600
blob + a367a2191db86563bc283b6308007026c0c1b6c6
--- amused.h
+++ amused.h
@@ -31,7 +31,7 @@ enum imsg_type {
 	IMSG_PAUSE,
 	IMSG_STOP,
 	IMSG_EOF,
-	IMSG_ERR,
+	IMSG_ERR,		/* error string */
 
 	IMSG_CTL_PLAY,		/* with optional filename */
 	IMSG_CTL_TOGGLE_PLAY,
@@ -141,9 +141,9 @@ int	player_setup(int, int, int);
 int	play(const void *, size_t);
 int	player(int, int);
 
-int	play_oggvorbis(int fd);
-int	play_mp3(int fd);
-int	play_flac(int fd);
-int	play_opus(int fd);
+int	play_oggvorbis(int, const char **);
+int	play_mp3(int, const char **);
+int	play_flac(int, const char **);
+int	play_opus(int, const char **);
 
 #endif
blob - a1a9f1a0edf23a6ff4657c04dc5d1e0993898c96
blob + defeffcce38cf120112997bc240612b02ed0f6b0
--- player.c
+++ player.c
@@ -164,9 +164,14 @@ again:
 }
 
 void
-player_senderr(void)
+player_senderr(const char *errstr)
 {
-	imsg_compose(ibuf, IMSG_ERR, 0, 0, -1, NULL, 0);
+	size_t len = 0;
+
+	if (errstr != NULL)
+		len = strlen(errstr) + 1;
+
+	imsg_compose(ibuf, IMSG_ERR, 0, 0, -1, errstr, len);
 	imsg_flush(ibuf);
 }
 
@@ -178,7 +183,7 @@ player_sendeof(void)
 }
 
 int
-player_playnext(void)
+player_playnext(const char **errstr)
 {
 	static char buf[512];
 	ssize_t r;
@@ -191,26 +196,26 @@ player_playnext(void)
 
 	/* 8 byte is the larger magic number */
 	if (r < 8) {
-		log_warn("read failed");
+		*errstr = "read failed";
 		goto err;
 	}
 
 	if (lseek(fd, 0, SEEK_SET) == -1) {
-		log_warn("lseek failed");
+		*errstr = "lseek failed";
 		goto err;
 	}
 
 	if (memcmp(buf, "fLaC", 4) == 0)
-		return play_flac(fd);
+		return play_flac(fd, errstr);
 	if (memcmp(buf, "ID3", 3) == 0 ||
 	    memcmp(buf, "\xFF\xFB", 2) == 0)
-		return play_mp3(fd);
+		return play_mp3(fd, errstr);
 	if (memmem(buf, r, "OpusHead", 8) != NULL)
-		return play_opus(fd);
+		return play_opus(fd, errstr);
 	if (memmem(buf, r, "OggS", 4) != NULL)
-		return play_oggvorbis(fd);
+		return play_oggvorbis(fd, errstr);
 
-	log_warnx("unknown file type");
+	*errstr = "unknown file type";
 err:
 	close(fd);
 	return -1;
@@ -317,12 +322,14 @@ player(int debug, int verbose)
 		fatal("pledge");
 
 	while (!halted) {
+		const char *errstr = NULL;
+
 		while (nextfd == -1)
 			player_dispatch();
 
-		r = player_playnext();
+		r = player_playnext(&errstr);
 		if (r == -1)
-			player_senderr();
+			player_senderr(errstr);
 		if (r == 0)
 			player_sendeof();
 	}
blob - 6ce3ebdb4967d36ec2770f4db748972413160f69
blob + 472bbfe1eb473d4adaaaf1db2e12e9055f47ceed
--- player_123.c
+++ player_123.c
@@ -49,7 +49,7 @@ setup(mpg123_handle *mh)
 }
 
 int
-play_mp3(int fd)
+play_mp3(int fd, const char **errstr)
 {
 	static char	 buf[4096];
 	size_t		 len;
@@ -60,7 +60,7 @@ play_mp3(int fd)
 		fatal("mpg123_new");
 
 	if (mpg123_open_fd(mh, fd) != MPG123_OK) {
-		log_warnx("mpg123_open_fd failed");
+		*errstr = "mpg123_open_fd failed";
 		close(fd);
 		return -1;
 	}
blob - ca7cae5c3ee76e927cfc9a6083a2f9ed528f1c44
blob + 88846e8f416041db4d6c326b5a2e7ef14ffd2e91
--- player_flac.c
+++ player_flac.c
@@ -107,11 +107,10 @@ errcb(const FLAC__StreamDecoder *decoder,
 }
 
 int
-play_flac(int fd)
+play_flac(int fd, const char **errstr)
 {
 	FILE *f;
 	int s, ok = 1;
-	const char *state;
 	FLAC__StreamDecoder *decoder = NULL;
 	FLAC__StreamDecoderInitStatus init_status;
 
@@ -139,8 +138,7 @@ play_flac(int fd)
 	if (s == FLAC__STREAM_DECODER_ABORTED)
 		return 1;
 	else if (!ok) {
-		state = FLAC__StreamDecoderStateString[s];
-		log_warnx("decoding failed; state: %s", state);
+		*errstr = "flac decoding error";
 		return -1;
 	} else
 		return 0;
blob - cfbed26ce6a55df4c4363f82cb24f61c7bf20c4e
blob + 1c9ebd7895c4eb54f0153630e9d31880ec5d49b8
--- player_oggvorbis.c
+++ player_oggvorbis.c
@@ -40,7 +40,7 @@
 #endif
 
 int
-play_oggvorbis(int fd)
+play_oggvorbis(int fd, const char **errstr)
 {
 	static uint8_t pcmout[4096];
 	FILE *f;
@@ -52,7 +52,7 @@ play_oggvorbis(int fd)
 		err(1, "fdopen");
 
 	if (ov_open_callbacks(f, &vf, NULL, 0, OV_CALLBACKS_NOCLOSE) < 0) {
-		log_warnx("input is not an Ogg bitstream");
+		*errstr = "input is not an Ogg bitstream";
 		ret = -1;
 		goto end;
 	}
blob - c2968bdfac8d03a696715e8b7ea56d60cb74fb17
blob + 168cde58de46948e84dfc38bec48333ad817214e
--- player_opus.c
+++ player_opus.c
@@ -39,7 +39,7 @@
 #endif
 
 int
-play_opus(int fd)
+play_opus(int fd, const char **errstr)
 {
 	static uint16_t pcm[BUFSIZ];
 	static uint8_t out[BUFSIZ * 2];
@@ -64,7 +64,7 @@ play_opus(int fd)
 		if (r == OP_HOLE) /* corrupt file segment? */
 			continue;
 		if (r < 0) {
-			log_warnx("error %d decoding file", ret);
+			*errstr = "opus decoding error";
 			ret = -1;
 			break;
 		}