diff options
author | Max Kellermann <max@duempel.org> | 2008-11-05 07:24:57 +0100 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2008-11-05 07:24:57 +0100 |
commit | eedbd28ec9fd07c25c19352f3ad854b153c02720 (patch) | |
tree | be5443594ebf809ff40fa9560dbf2d8a17a0d2a2 /src/decoder/wavpack_plugin.c | |
parent | 010a27cd95bb48b737ca12a72ef63e9c8e4501d5 (diff) | |
download | mpd-eedbd28ec9fd07c25c19352f3ad854b153c02720.tar.gz mpd-eedbd28ec9fd07c25c19352f3ad854b153c02720.tar.xz mpd-eedbd28ec9fd07c25c19352f3ad854b153c02720.zip |
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.
Diffstat (limited to 'src/decoder/wavpack_plugin.c')
-rw-r--r-- | src/decoder/wavpack_plugin.c | 17 |
1 files changed, 16 insertions, 1 deletions
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) |