diff options
author | Max Kellermann <max@duempel.org> | 2011-11-28 08:27:59 +0100 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2011-11-28 09:23:36 +0100 |
commit | 74beefcaf6a2a82785649752bf346e5c8fb9ec62 (patch) | |
tree | 68f5e6a4d6e5784e9691fe84d7e321955dfece03 | |
parent | 399a3abefc00f913945189fdb3a646759f082054 (diff) | |
download | mpd-74beefcaf6a2a82785649752bf346e5c8fb9ec62.tar.gz mpd-74beefcaf6a2a82785649752bf346e5c8fb9ec62.tar.xz mpd-74beefcaf6a2a82785649752bf346e5c8fb9ec62.zip |
encoder/null: use fifo_buffer instead of pcm_buffer
This fixes a buffer corruption bug; pcm_buffer is not designed to be a
persistent buffers, and will discard anything between two consecutive
calls.
-rw-r--r-- | NEWS | 2 | ||||
-rw-r--r-- | src/encoder/null_encoder.c | 34 |
2 files changed, 16 insertions, 20 deletions
@@ -2,7 +2,7 @@ ver 0.16.6 (2010/??/??) * decoder: - fix assertion failure when resuming streams * encoder: - - flac, wave: fix buffer corruption bug + - flac, null, wave: fix buffer corruption bug * event_pipe: fix WIN32 regression * define WINVER in ./configure * WIN32: autodetect filesystem encoding diff --git a/src/encoder/null_encoder.c b/src/encoder/null_encoder.c index bf7e61c3b..4e45f4345 100644 --- a/src/encoder/null_encoder.c +++ b/src/encoder/null_encoder.c @@ -20,7 +20,8 @@ #include "config.h" #include "encoder_api.h" #include "encoder_plugin.h" -#include "pcm_buffer.h" +#include "fifo_buffer.h" +#include "growing_fifo.h" #include <assert.h> #include <string.h> @@ -28,8 +29,7 @@ struct null_encoder { struct encoder encoder; - struct pcm_buffer buffer; - size_t buffer_length; + struct fifo_buffer *buffer; }; extern const struct encoder_plugin null_encoder_plugin; @@ -65,7 +65,7 @@ null_encoder_close(struct encoder *_encoder) { struct null_encoder *encoder = (struct null_encoder *)_encoder; - pcm_buffer_deinit(&encoder->buffer); + fifo_buffer_free(encoder->buffer); } @@ -76,9 +76,7 @@ null_encoder_open(struct encoder *_encoder, { struct null_encoder *encoder = (struct null_encoder *)_encoder; - encoder->buffer_length = 0; - pcm_buffer_init(&encoder->buffer); - + encoder->buffer = growing_fifo_new(); return true; } @@ -88,28 +86,26 @@ null_encoder_write(struct encoder *_encoder, G_GNUC_UNUSED GError **error) { struct null_encoder *encoder = (struct null_encoder *)_encoder; - char *buffer = pcm_buffer_get(&encoder->buffer, encoder->buffer_length + length); - - memcpy(buffer+encoder->buffer_length, data, length); - encoder->buffer_length += length; - return true; + growing_fifo_append(&encoder->buffer, data, length); + return length; } static size_t null_encoder_read(struct encoder *_encoder, void *dest, size_t length) { struct null_encoder *encoder = (struct null_encoder *)_encoder; - char *buffer = pcm_buffer_get(&encoder->buffer, encoder->buffer_length); - - if (length > encoder->buffer_length) - length = encoder->buffer_length; - memcpy(dest, buffer, length); + size_t max_length; + const void *src = fifo_buffer_read(encoder->buffer, &max_length); + if (src == NULL) + return 0; - encoder->buffer_length -= length; - memmove(buffer, buffer + length, encoder->buffer_length); + if (length > max_length) + length = max_length; + memcpy(dest, src, length); + fifo_buffer_consume(encoder->buffer, length); return length; } |