From cb336ff666a8fb2958cfb35c36ffcf613b02cd70 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Sat, 14 Dec 2013 12:21:23 +0100 Subject: DecoderAPI: add function decoder_skip() Move code from the "mad" plugin. --- src/DecoderAPI.cxx | 16 ++++++++++++++++ src/DecoderAPI.hxx | 8 ++++++++ src/decoder/MadDecoderPlugin.cxx | 15 +-------------- 3 files changed, 25 insertions(+), 14 deletions(-) (limited to 'src') diff --git a/src/DecoderAPI.cxx b/src/DecoderAPI.cxx index 4c6a6f918..b31066e17 100644 --- a/src/DecoderAPI.cxx +++ b/src/DecoderAPI.cxx @@ -306,6 +306,22 @@ decoder_read(Decoder *decoder, return nbytes; } +bool +decoder_skip(Decoder *decoder, InputStream &is, size_t size) +{ + while (size > 0) { + char buffer[1024]; + size_t nbytes = decoder_read(decoder, is, buffer, + std::min(sizeof(buffer), size)); + if (nbytes == 0) + return false; + + size -= nbytes; + } + + return true; +} + void decoder_timestamp(Decoder &decoder, double t) { diff --git a/src/DecoderAPI.hxx b/src/DecoderAPI.hxx index df1b5c40d..f88503fed 100644 --- a/src/DecoderAPI.hxx +++ b/src/DecoderAPI.hxx @@ -116,6 +116,14 @@ decoder_read(Decoder &decoder, InputStream &is, return decoder_read(&decoder, is, buffer, length); } +/** + * Skip data on the #InputStream. + * + * @return true on success, false on error or command + */ +bool +decoder_skip(Decoder *decoder, InputStream &is, size_t size); + /** * Sets the time stamp for the next data chunk [seconds]. The MPD * core automatically counts it up, and a decoder plugin only needs to diff --git a/src/decoder/MadDecoderPlugin.cxx b/src/decoder/MadDecoderPlugin.cxx index 0359840fc..c98d65f87 100644 --- a/src/decoder/MadDecoderPlugin.cxx +++ b/src/decoder/MadDecoderPlugin.cxx @@ -413,20 +413,7 @@ MadDecoder::ParseId3(size_t tagsize, Tag **mpd_tag) mad_stream_skip(&stream, tagsize); } else { mad_stream_skip(&stream, count); - - while (count < tagsize) { - size_t len = tagsize - count; - char ignored[1024]; - if (len > sizeof(ignored)) - len = sizeof(ignored); - - len = decoder_read(decoder, input_stream, - ignored, len); - if (len == 0) - break; - else - count += len; - } + decoder_skip(decoder, input_stream, tagsize - count); } #endif } -- cgit v1.2.3