From eedbd28ec9fd07c25c19352f3ad854b153c02720 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Wed, 5 Nov 2008 07:24:57 +0100 Subject: wavpack: read_bytes() should not return after partial reads libwavpack expects the read_bytes() stream method to fill the whole buffer, and fails badly when we return a partial read (i.e. not enough data available yet). This caused wavpack streams to break. Re-implement the buffer filling loop. --- src/decoder/wavpack_plugin.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/decoder/wavpack_plugin.c b/src/decoder/wavpack_plugin.c index 132cd4f0b..aa5df7b1d 100644 --- a/src/decoder/wavpack_plugin.c +++ b/src/decoder/wavpack_plugin.c @@ -348,7 +348,22 @@ static int32_t read_bytes(void *id, void *data, int32_t bcount) --bcount; ++i; } - return i + decoder_read(isp->decoder, isp->is, buf, bcount); + + /* wavpack fails if we return a partial read, so we just wait + until the buffer is full */ + while (bcount > 0) { + size_t nbytes = decoder_read(isp->decoder, isp->is, + buf, bcount); + if (nbytes == 0) + /* EOF, error or a decoder command */ + break; + + i += nbytes; + bcount -= nbytes; + buf += nbytes; + } + + return i; } static uint32_t get_pos(void *id) -- cgit v1.2.3