From eedbd28ec9fd07c25c19352f3ad854b153c02720 Mon Sep 17 00:00:00 2001
From: Max Kellermann <max@duempel.org>
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(-)

(limited to 'src/decoder')

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