From 0aa0ffb67b225c583dd25a31869dc5b3222cd5fb Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Fri, 4 Sep 2020 13:27:27 +0200 Subject: [PATCH] decoder/sndfile: allow partial reads at end of file While libsndfile doesn't like partial reads in the middle of a file (see commit 95ac6071b9), it allows partial reads at the end of a file. It doesn't pay attention to the file size when issuing a read. Commit ecb67a1ed16e9 (MPD 0.18.12) was a regression: previously, partial reads at the end of a file were possible, but switching to decoder_read_full() made this an error condition. This way, a portion at the end of each file was lost, leading to corruption with gapless playback (https://github.com/MusicPlayerDaemon/MPD/issues/936). This fix switches to the newly introduced function decoder_read_much(), which does the same as the code before commit ecb67a1ed16e93. Closes https://github.com/MusicPlayerDaemon/MPD/issues/936 --- NEWS | 2 ++ src/decoder/plugins/SndfileDecoderPlugin.cxx | 4 +--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/NEWS b/NEWS index e23b1d0e5..6ec3b242d 100644 --- a/NEWS +++ b/NEWS @@ -2,6 +2,8 @@ ver 0.21.26 (not yet released) * output - osx: fix crash bug - sles: support floating point samples +* decoder + - sndfile: fix lost samples at end of file ver 0.21.25 (2020/07/06) * protocol: diff --git a/src/decoder/plugins/SndfileDecoderPlugin.cxx b/src/decoder/plugins/SndfileDecoderPlugin.cxx index efcf49914..804d676b4 100644 --- a/src/decoder/plugins/SndfileDecoderPlugin.cxx +++ b/src/decoder/plugins/SndfileDecoderPlugin.cxx @@ -46,9 +46,7 @@ struct SndfileInputStream { size_t Read(void *buffer, size_t size) { /* libsndfile chokes on partial reads; therefore always force full reads */ - return decoder_read_full(client, is, buffer, size) - ? size - : 0; + return decoder_read_much(client, is, buffer, size); } };