aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2011-11-28 08:27:59 +0100
committerMax Kellermann <max@duempel.org>2011-11-28 09:23:36 +0100
commit74beefcaf6a2a82785649752bf346e5c8fb9ec62 (patch)
tree68f5e6a4d6e5784e9691fe84d7e321955dfece03
parent399a3abefc00f913945189fdb3a646759f082054 (diff)
downloadmpd-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--NEWS2
-rw-r--r--src/encoder/null_encoder.c34
2 files changed, 16 insertions, 20 deletions
diff --git a/NEWS b/NEWS
index 61257509b..441aac8cb 100644
--- a/NEWS
+++ b/NEWS
@@ -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;
}