aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/DecoderAPI.cxx18
-rw-r--r--src/DecoderAPI.hxx11
-rw-r--r--src/decoder/MadDecoderPlugin.cxx14
-rw-r--r--test/FakeDecoderAPI.cxx18
-rw-r--r--test/run_decoder.cxx18
5 files changed, 67 insertions, 12 deletions
diff --git a/src/DecoderAPI.cxx b/src/DecoderAPI.cxx
index 52b30cfb5..e4122d60e 100644
--- a/src/DecoderAPI.cxx
+++ b/src/DecoderAPI.cxx
@@ -293,6 +293,24 @@ decoder_read(Decoder *decoder,
}
bool
+decoder_read_full(Decoder *decoder, InputStream &is,
+ void *_buffer, size_t size)
+{
+ uint8_t *buffer = (uint8_t *)_buffer;
+
+ while (size > 0) {
+ size_t nbytes = decoder_read(decoder, is, buffer, size);
+ if (nbytes == 0)
+ return false;
+
+ buffer += nbytes;
+ size -= nbytes;
+ }
+
+ return true;
+}
+
+bool
decoder_skip(Decoder *decoder, InputStream &is, size_t size)
{
while (size > 0) {
diff --git a/src/DecoderAPI.hxx b/src/DecoderAPI.hxx
index 50cd3e74a..a9da76305 100644
--- a/src/DecoderAPI.hxx
+++ b/src/DecoderAPI.hxx
@@ -113,6 +113,17 @@ decoder_read(Decoder &decoder, InputStream &is,
}
/**
+ * Blocking read from the input stream. Attempts to fill the buffer
+ * completely; there is no partial result.
+ *
+ * @return true on success, false on error or command or not enough
+ * data
+ */
+bool
+decoder_read_full(Decoder *decoder, InputStream &is,
+ void *buffer, size_t size);
+
+/**
* Skip data on the #InputStream.
*
* @return true on success, false on error or command
diff --git a/src/decoder/MadDecoderPlugin.cxx b/src/decoder/MadDecoderPlugin.cxx
index 7afc8ef8f..6f619b34b 100644
--- a/src/decoder/MadDecoderPlugin.cxx
+++ b/src/decoder/MadDecoderPlugin.cxx
@@ -353,18 +353,8 @@ MadDecoder::ParseId3(size_t tagsize, Tag **mpd_tag)
memcpy(allocated, stream.this_frame, count);
mad_stream_skip(&(stream), count);
- while (count < tagsize) {
- size_t len;
-
- len = decoder_read(decoder, input_stream,
- allocated + count, tagsize - count);
- if (len == 0)
- break;
- else
- count += len;
- }
-
- if (count != tagsize) {
+ if (!decoder_read_full(decoder, input_stream,
+ allocated + count, tagsize - count)) {
LogDebug(mad_domain, "error parsing ID3 tag");
g_free(allocated);
return;
diff --git a/test/FakeDecoderAPI.cxx b/test/FakeDecoderAPI.cxx
index 469e37feb..ca09ca982 100644
--- a/test/FakeDecoderAPI.cxx
+++ b/test/FakeDecoderAPI.cxx
@@ -66,6 +66,24 @@ decoder_read(gcc_unused Decoder *decoder,
}
bool
+decoder_read_full(Decoder *decoder, InputStream &is,
+ void *_buffer, size_t size)
+{
+ uint8_t *buffer = (uint8_t *)_buffer;
+
+ while (size > 0) {
+ size_t nbytes = decoder_read(decoder, is, buffer, size);
+ if (nbytes == 0)
+ return false;
+
+ buffer += nbytes;
+ size -= nbytes;
+ }
+
+ return true;
+}
+
+bool
decoder_skip(Decoder *decoder, InputStream &is, size_t size)
{
while (size > 0) {
diff --git a/test/run_decoder.cxx b/test/run_decoder.cxx
index cab68c64e..7db8dde22 100644
--- a/test/run_decoder.cxx
+++ b/test/run_decoder.cxx
@@ -102,6 +102,24 @@ decoder_read(gcc_unused Decoder *decoder,
}
bool
+decoder_read_full(Decoder *decoder, InputStream &is,
+ void *_buffer, size_t size)
+{
+ uint8_t *buffer = (uint8_t *)_buffer;
+
+ while (size > 0) {
+ size_t nbytes = decoder_read(decoder, is, buffer, size);
+ if (nbytes == 0)
+ return false;
+
+ buffer += nbytes;
+ size -= nbytes;
+ }
+
+ return true;
+}
+
+bool
decoder_skip(Decoder *decoder, InputStream &is, size_t size)
{
while (size > 0) {