aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2009-02-09 16:36:11 +0100
committerMax Kellermann <max@duempel.org>2009-02-09 16:36:11 +0100
commite5da9e459dc407283daeb0bd483f4d9d12d72de4 (patch)
treec5b9b0dc97d54ae0f2138d120ce04336b6a1a953
parentce2f1ba881bf83844b2fc7c2666f2e6741df58cc (diff)
downloadmpd-e5da9e459dc407283daeb0bd483f4d9d12d72de4.tar.gz
mpd-e5da9e459dc407283daeb0bd483f4d9d12d72de4.tar.xz
mpd-e5da9e459dc407283daeb0bd483f4d9d12d72de4.zip
shout: clear buffer before calling the encoder
Always assume the buffer is empty before calling the encoder. Always flush the buffer immediately after there has been added something. This reduces the risk of buffer overruns, because there will never be a "rest" in the current buffer.
-rw-r--r--NEWS1
-rw-r--r--src/output/shout_mp3.c6
-rw-r--r--src/output/shout_ogg.c17
-rw-r--r--src/output/shout_plugin.c9
4 files changed, 15 insertions, 18 deletions
diff --git a/NEWS b/NEWS
index 2a4582528..782fdfa4b 100644
--- a/NEWS
+++ b/NEWS
@@ -15,6 +15,7 @@ ver 0.14.2 (2009/??/??)
- shout: switch to blocking mode
- shout: use libshout's synchronization
- shout: don't postpone metadata
+ - shout: clear buffer before calling the encoder
* mapper: remove trailing slashes from music_directory
* player: set player error when output device fails
diff --git a/src/output/shout_mp3.c b/src/output/shout_mp3.c
index 86d39fc66..6086c843e 100644
--- a/src/output/shout_mp3.c
+++ b/src/output/shout_mp3.c
@@ -43,8 +43,8 @@ static int shout_mp3_encoder_clear_encoder(struct shout_data *sd)
struct shout_buffer *buf = &sd->buf;
int ret;
- if ((ret = lame_encode_flush(ld->gfp, buf->data + buf->len,
- buf->len)) < 0)
+ ret = lame_encode_flush(ld->gfp, buf->data, sizeof(buf->data));
+ if (ret < 0)
g_warning("error flushing lame buffers\n");
lame_close(ld->gfp);
@@ -164,7 +164,7 @@ static int shout_mp3_encoder_encode(struct shout_data *sd,
bytes_out = lame_encode_buffer_float(ld->gfp, left, right,
samples, buf->data,
- sizeof(buf->data) - buf->len);
+ sizeof(buf->data));
g_free(left);
if (right != left)
diff --git a/src/output/shout_ogg.c b/src/output/shout_ogg.c
index 3ecfd3008..6c89fdecb 100644
--- a/src/output/shout_ogg.c
+++ b/src/output/shout_ogg.c
@@ -75,23 +75,14 @@ static void copy_tag_to_vorbis_comment(struct shout_data *sd)
static int copy_ogg_buffer_to_shout_buffer(ogg_page *og,
struct shout_buffer *buf)
{
- if (sizeof(buf->data) - buf->len >= (size_t)og->header_len) {
- memcpy(buf->data + buf->len,
- og->header, og->header_len);
- buf->len += og->header_len;
- } else {
+ if ((size_t)og->header_len + (size_t)og->body_len > sizeof(buf->data)) {
g_warning("%s: not enough buffer space!\n", __func__);
return -1;
}
- if (sizeof(buf->data) - buf->len >= (size_t)og->body_len) {
- memcpy(buf->data + buf->len,
- og->body, og->body_len);
- buf->len += og->body_len;
- } else {
- g_warning("%s: not enough buffer space!\n", __func__);
- return -1;
- }
+ memcpy(buf->data, og->header, og->header_len);
+ memcpy(buf->data + og->header_len, og->body, og->body_len);
+ buf->len = og->header_len + og->body_len;
return 0;
}
diff --git a/src/output/shout_plugin.c b/src/output/shout_plugin.c
index 108c966dd..e57cc0efa 100644
--- a/src/output/shout_plugin.c
+++ b/src/output/shout_plugin.c
@@ -57,7 +57,6 @@ static struct shout_data *new_shout_data(void)
ret->bitrate = -1;
ret->quality = -2.0;
ret->timeout = DEFAULT_CONN_TIMEOUT;
- ret->buf.len = 0;
return ret;
}
@@ -318,13 +317,14 @@ static int write_page(struct shout_data *sd)
err = shout_send(sd->shout_conn, sd->buf.data, sd->buf.len);
if (handle_shout_error(sd, err) < 0)
return -1;
- sd->buf.len = 0;
return 0;
}
static void close_shout_conn(struct shout_data * sd)
{
+ sd->buf.len = 0;
+
if (sd->encoder->clear_encoder_func(sd))
write_page(sd);
@@ -390,6 +390,8 @@ static int open_shout_conn(void *data)
if (status != 0)
return status;
+ sd->buf.len = 0;
+
if (sd->encoder->init_encoder_func(sd) < 0) {
shout_close(sd->shout_conn);
return -1;
@@ -417,6 +419,8 @@ my_shout_play(void *data, const char *chunk, size_t size)
{
struct shout_data *sd = (struct shout_data *)data;
+ sd->buf.len = 0;
+
if (sd->encoder->encode_func(sd, chunk, size))
return false;
@@ -448,6 +452,7 @@ static void my_shout_set_tag(void *data,
char song[1024];
bool ret;
+ sd->buf.len = 0;
sd->tag = tag;
ret = sd->encoder->send_metadata_func(sd, song, sizeof(song));
if (ret) {