I heard playback stop and saw this in the logs:
21:07:26 Created decoder for /var/cache/nup/5815136073809920.mp3 (3m31.409s, 44.1kHz stereo, 18646272 samples)
21:07:45 Switching to /var/cache/nup/5815136073809920.mp3
...
21:09:31 Reporting play of 5815136073809920 at ...
21:09:32 Reported play successfully
...
21:10:59 Set next to /var/cache/nup/6292925507960832.mp3
21:10:59 Created decoder for /var/cache/nup/6292925507960832.mp3 (2m30.914s, 44.1kHz stereo, 13310594 samples)
21:11:17 Failed decoding /var/cache/nup/5815136073809920.mp3: mp3dec_ex_read returned E_DECODE
21:11:17 Failed decoding /var/cache/nup/5815136073809920.mp3: mp3dec_ex_read returned E_DECODE
21:11:17 Failed decoding /var/cache/nup/5815136073809920.mp3: mp3dec_ex_read returned E_DECODE
...
21:12:00 Failed decoding /var/cache/nup/5815136073809920.mp3: mp3dec_ex_read returned E_DECODE
21:12:00 Failed decoding /var/cache/nup/5815136073809920.mp3: mp3dec_ex_read returned E_DECODE
When I manually switched to the next track, 6292925507960832.mp3 played without any problems.
I wrote a tiny program that used minimp3.Decoder to decode the same file to a bytes.Buffer using io.Copy, and it was able to do so without any problems. I was able to repro it by reading from the decoder 4 bytes at a time, though:
2026年03月28日 21:32:17 Created decoder for ... (3m31.409s, 44.1kHz stereo, 18646272 samples)
2026年03月28日 21:32:19 Read failed at 9323136: mp3dec_ex_read returned E_DECODE
So it happened at the end of the decoded audio. I suspect that this wasn't anything to do with this particular audio file, and that I just got unlucky with where the reads happened to line up. I should figure out why mp3dec_ex_read set last_error to E_DECODE instead of leaving it at 0 and returning 0 (for the number of decoded samples), which is how I usually detect EOF.
I also need to fix audio.Feeder so it skips to the next track on decode failure instead of just logging the same error indefinitely.