From d37b788ea81e4b282e3f24aa5cad31d85229cc30 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Sat, 14 Dec 2013 12:43:06 +0100 Subject: DecoderAPI: add function decoder_read_full() Move code from the "mad" plugin. --- src/DecoderAPI.cxx | 18 ++++++++++++++++++ src/DecoderAPI.hxx | 11 +++++++++++ src/decoder/MadDecoderPlugin.cxx | 14 ++------------ 3 files changed, 31 insertions(+), 12 deletions(-) (limited to 'src') diff --git a/src/DecoderAPI.cxx b/src/DecoderAPI.cxx index b31066e17..a3f2fc3e0 100644 --- a/src/DecoderAPI.cxx +++ b/src/DecoderAPI.cxx @@ -306,6 +306,24 @@ decoder_read(Decoder *decoder, return nbytes; } +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) { diff --git a/src/DecoderAPI.hxx b/src/DecoderAPI.hxx index f88503fed..bb693dbc4 100644 --- a/src/DecoderAPI.hxx +++ b/src/DecoderAPI.hxx @@ -116,6 +116,17 @@ decoder_read(Decoder &decoder, InputStream &is, return decoder_read(&decoder, is, buffer, length); } +/** + * 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. * diff --git a/src/decoder/MadDecoderPlugin.cxx b/src/decoder/MadDecoderPlugin.cxx index c98d65f87..1bf193993 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; -- cgit v1.2.3