Commit adbe8c40 authored by Max Kellermann's avatar Max Kellermann

output/{recorder,shout}: call encoder_read() in a loop

This is necessary for Ogg packets that span more than one page.
parent 58e600f4
...@@ -2,6 +2,7 @@ ver 0.17.3 (2012/??/??) ...@@ -2,6 +2,7 @@ ver 0.17.3 (2012/??/??)
* output: * output:
- recorder: fix I/O error check - recorder: fix I/O error check
- shout: fix memory leak in error handler - shout: fix memory leak in error handler
- recorder, shout: support Ogg packets that span more than one page
ver 0.17.2 (2012/09/30) ver 0.17.2 (2012/09/30)
* protocol: * protocol:
......
...@@ -295,6 +295,8 @@ encoder_write(struct encoder *encoder, const void *data, size_t length, ...@@ -295,6 +295,8 @@ encoder_write(struct encoder *encoder, const void *data, size_t length,
/** /**
* Reads encoded data from the encoder. * Reads encoded data from the encoder.
* *
* Call this repeatedly until no more data is returned.
*
* @param encoder the encoder * @param encoder the encoder
* @param dest the destination buffer to copy to * @param dest the destination buffer to copy to
* @param length the maximum length of the destination buffer * @param length the maximum length of the destination buffer
......
...@@ -160,17 +160,20 @@ recorder_output_encoder_to_file(struct recorder_output *recorder, ...@@ -160,17 +160,20 @@ recorder_output_encoder_to_file(struct recorder_output *recorder,
{ {
assert(recorder->fd >= 0); assert(recorder->fd >= 0);
/* read from the encoder */ while (true) {
/* read from the encoder */
size_t size = encoder_read(recorder->encoder, recorder->buffer, size_t size = encoder_read(recorder->encoder, recorder->buffer,
sizeof(recorder->buffer)); sizeof(recorder->buffer));
if (size == 0) if (size == 0)
return true; return true;
/* write everything into the file */ /* write everything into the file */
return recorder_write_to_file(recorder, recorder->buffer, size, if (!recorder_write_to_file(recorder, recorder->buffer, size,
error_r); error_r))
return false;
}
} }
static bool static bool
......
...@@ -342,14 +342,16 @@ write_page(struct shout_data *sd, GError **error) ...@@ -342,14 +342,16 @@ write_page(struct shout_data *sd, GError **error)
{ {
assert(sd->encoder != NULL); assert(sd->encoder != NULL);
size_t nbytes = encoder_read(sd->encoder, while (true) {
sd->buffer, sizeof(sd->buffer)); size_t nbytes = encoder_read(sd->encoder,
if (nbytes == 0) sd->buffer, sizeof(sd->buffer));
return true; if (nbytes == 0)
return true;
int err = shout_send(sd->shout_conn, sd->buffer, nbytes);
if (!handle_shout_error(sd, err, error)) int err = shout_send(sd->shout_conn, sd->buffer, nbytes);
return false; if (!handle_shout_error(sd, err, error))
return false;
}
return true; return true;
} }
......
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