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 ecb67a1ed1 (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
ecb67a1ed1.

Closes https://github.com/MusicPlayerDaemon/MPD/issues/936
This commit is contained in:
Max Kellermann 2020-09-04 13:27:27 +02:00
parent 33f70931dd
commit 0aa0ffb67b
2 changed files with 3 additions and 3 deletions

2
NEWS
View File

@ -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:

View File

@ -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);
}
};