diff options
-rw-r--r-- | src/output/recorder_output_plugin.c | 50 |
1 files changed, 31 insertions, 19 deletions
diff --git a/src/output/recorder_output_plugin.c b/src/output/recorder_output_plugin.c index e2366bf90..ac4a52107 100644 --- a/src/output/recorder_output_plugin.c +++ b/src/output/recorder_output_plugin.c @@ -120,32 +120,22 @@ recorder_output_finish(struct audio_output *ao) g_free(recorder); } -/** - * Writes pending data from the encoder to the output file. - */ static bool -recorder_output_encoder_to_file(struct recorder_output *recorder, - GError **error_r) +recorder_write_to_file(struct recorder_output *recorder, + const void *_data, size_t length, + GError **error_r) { - assert(recorder->fd >= 0); + assert(length > 0); - /* read from the encoder */ + const int fd = recorder->fd; - size_t size = encoder_read(recorder->encoder, recorder->buffer, - sizeof(recorder->buffer)); - if (size == 0) - return true; - - /* write everything into the file */ + const uint8_t *data = (const uint8_t *)_data, *end = data + length; - size_t position = 0; while (true) { - ssize_t nbytes = write(recorder->fd, - recorder->buffer + position, - size - position); + ssize_t nbytes = write(fd, data, end - data); if (nbytes > 0) { - position += (size_t)nbytes; - if (position >= size) + data += nbytes; + if (data == end) return true; } else if (nbytes == 0) { /* shouldn't happen for files */ @@ -161,6 +151,28 @@ recorder_output_encoder_to_file(struct recorder_output *recorder, } } +/** + * Writes pending data from the encoder to the output file. + */ +static bool +recorder_output_encoder_to_file(struct recorder_output *recorder, + GError **error_r) +{ + assert(recorder->fd >= 0); + + /* read from the encoder */ + + size_t size = encoder_read(recorder->encoder, recorder->buffer, + sizeof(recorder->buffer)); + if (size == 0) + return true; + + /* write everything into the file */ + + return recorder_write_to_file(recorder, recorder->buffer, size, + error_r); +} + static bool recorder_output_open(struct audio_output *ao, struct audio_format *audio_format, |