commit 17ef54d6ac6c34b0b1370c1c57836322702783e1 from: Omar Polo date: Wed Jun 22 20:15:33 2022 UTC improving error reporting makes the player process optionally send back a string describing the failure to provide a better and more coincise error message. This turns the syslog message(s): amused: unknown file type amused: failed to play, skipping /home/op/pics/phos.jpg into: amused: unknown file type; skipping /home/op/pics/phos.jpg 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; }