aboutsummaryrefslogtreecommitdiffstats
path: root/src/decoder/wavpack_plugin.c
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2008-11-05 07:24:57 +0100
committerMax Kellermann <max@duempel.org>2008-11-05 07:24:57 +0100
commiteedbd28ec9fd07c25c19352f3ad854b153c02720 (patch)
treebe5443594ebf809ff40fa9560dbf2d8a17a0d2a2 /src/decoder/wavpack_plugin.c
parent010a27cd95bb48b737ca12a72ef63e9c8e4501d5 (diff)
downloadmpd-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.c17
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)