Commit 0759421d authored by Max Kellermann's avatar Max Kellermann

DecoderAPI: add function decoder_read_full()

Move code from the "mad" plugin.
parent bf741798
...@@ -293,6 +293,24 @@ decoder_read(Decoder *decoder, ...@@ -293,6 +293,24 @@ decoder_read(Decoder *decoder,
} }
bool 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) decoder_skip(Decoder *decoder, InputStream &is, size_t size)
{ {
while (size > 0) { while (size > 0) {
......
...@@ -113,6 +113,17 @@ decoder_read(Decoder &decoder, InputStream &is, ...@@ -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. * Skip data on the #InputStream.
* *
* @return true on success, false on error or command * @return true on success, false on error or command
......
...@@ -353,18 +353,8 @@ MadDecoder::ParseId3(size_t tagsize, Tag **mpd_tag) ...@@ -353,18 +353,8 @@ MadDecoder::ParseId3(size_t tagsize, Tag **mpd_tag)
memcpy(allocated, stream.this_frame, count); memcpy(allocated, stream.this_frame, count);
mad_stream_skip(&(stream), count); mad_stream_skip(&(stream), count);
while (count < tagsize) { if (!decoder_read_full(decoder, input_stream,
size_t len; allocated + count, tagsize - count)) {
len = decoder_read(decoder, input_stream,
allocated + count, tagsize - count);
if (len == 0)
break;
else
count += len;
}
if (count != tagsize) {
LogDebug(mad_domain, "error parsing ID3 tag"); LogDebug(mad_domain, "error parsing ID3 tag");
g_free(allocated); g_free(allocated);
return; return;
......
...@@ -66,6 +66,24 @@ decoder_read(gcc_unused Decoder *decoder, ...@@ -66,6 +66,24 @@ decoder_read(gcc_unused Decoder *decoder,
} }
bool 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) decoder_skip(Decoder *decoder, InputStream &is, size_t size)
{ {
while (size > 0) { while (size > 0) {
......
...@@ -102,6 +102,24 @@ decoder_read(gcc_unused Decoder *decoder, ...@@ -102,6 +102,24 @@ decoder_read(gcc_unused Decoder *decoder,
} }
bool 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) decoder_skip(Decoder *decoder, InputStream &is, size_t size)
{ {
while (size > 0) { while (size > 0) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment