diff options
-rw-r--r-- | src/DecoderAPI.cxx | 16 | ||||
-rw-r--r-- | src/DecoderAPI.hxx | 8 | ||||
-rw-r--r-- | src/decoder/MadDecoderPlugin.cxx | 15 | ||||
-rw-r--r-- | test/FakeDecoderAPI.cxx | 16 | ||||
-rw-r--r-- | test/run_decoder.cxx | 16 |
5 files changed, 57 insertions, 14 deletions
diff --git a/src/DecoderAPI.cxx b/src/DecoderAPI.cxx index 4fea02bef..52b30cfb5 100644 --- a/src/DecoderAPI.cxx +++ b/src/DecoderAPI.cxx @@ -292,6 +292,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 2ee42483c..50cd3e74a 100644 --- a/src/DecoderAPI.hxx +++ b/src/DecoderAPI.hxx @@ -113,6 +113,14 @@ decoder_read(Decoder &decoder, InputStream &is, } /** + * 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 * use this function if it thinks that adding to the time stamp based diff --git a/src/decoder/MadDecoderPlugin.cxx b/src/decoder/MadDecoderPlugin.cxx index 9dd86c55f..7afc8ef8f 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 } diff --git a/test/FakeDecoderAPI.cxx b/test/FakeDecoderAPI.cxx index e2040b40d..469e37feb 100644 --- a/test/FakeDecoderAPI.cxx +++ b/test/FakeDecoderAPI.cxx @@ -65,6 +65,22 @@ decoder_read(gcc_unused Decoder *decoder, return is.LockRead(buffer, length, IgnoreError()); } +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(gcc_unused Decoder &decoder, gcc_unused double t) diff --git a/test/run_decoder.cxx b/test/run_decoder.cxx index 2f7330a1d..cab68c64e 100644 --- a/test/run_decoder.cxx +++ b/test/run_decoder.cxx @@ -101,6 +101,22 @@ decoder_read(gcc_unused Decoder *decoder, return is.LockRead(buffer, length, IgnoreError()); } +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(gcc_unused Decoder &decoder, gcc_unused double t) |