decoder/sndfile: use decoder_read_full()

Replaces the loop in sndfile_vio_read(), eliminating duplicate and
fragile code.
This commit is contained in:
Max Kellermann 2014-07-11 21:17:43 +02:00
parent 0ef843f138
commit ecb67a1ed1

View File

@ -36,7 +36,11 @@ struct SndfileInputStream {
InputStream &is; InputStream &is;
size_t Read(void *buffer, size_t size) { size_t Read(void *buffer, size_t size) {
return decoder_read(decoder, is, buffer, size); /* libsndfile chokes on partial reads; therefore
always force full reads */
return decoder_read_full(decoder, is, buffer, size)
? size
: 0;
} }
}; };
@ -69,21 +73,7 @@ sndfile_vio_read(void *ptr, sf_count_t count, void *user_data)
{ {
SndfileInputStream &sis = *(SndfileInputStream *)user_data; SndfileInputStream &sis = *(SndfileInputStream *)user_data;
sf_count_t total_bytes = 0; return sis.Read(ptr, count);
/* this loop is necessary because libsndfile chokes on partial
reads */
do {
size_t nbytes = sis.Read((char *)ptr + total_bytes,
count - total_bytes);
if (nbytes == 0)
return -1;
total_bytes += nbytes;
} while (total_bytes < count);
return total_bytes;
} }
static sf_count_t static sf_count_t