commit - 5e52fc420c6894ef71b681ed0b4047298e9c4355
commit + 17ef54d6ac6c34b0b1370c1c57836322702783e1
blob - 1ef3fdea14435e796b7acd3ca89c2250582878d2
blob + 62e1d02ba3a388d9eb1249ec41f666d8270c6466
--- amused.c
+++ amused.c
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;
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
IMSG_PAUSE,
IMSG_STOP,
IMSG_EOF,
- IMSG_ERR,
+ IMSG_ERR, /* error string */
IMSG_CTL_PLAY, /* with optional filename */
IMSG_CTL_TOGGLE_PLAY,
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
}
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);
}
}
int
-player_playnext(void)
+player_playnext(const char **errstr)
{
static char buf[512];
ssize_t r;
/* 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;
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
}
int
-play_mp3(int fd)
+play_mp3(int fd, const char **errstr)
{
static char buf[4096];
size_t len;
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
}
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;
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
#endif
int
-play_oggvorbis(int fd)
+play_oggvorbis(int fd, const char **errstr)
{
static uint8_t pcmout[4096];
FILE *f;
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
#endif
int
-play_opus(int fd)
+play_opus(int fd, const char **errstr)
{
static uint16_t pcm[BUFSIZ];
static uint8_t out[BUFSIZ * 2];
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;
}