diff options
-rw-r--r-- | NEWS | 1 | ||||
-rw-r--r-- | src/output/shout_mp3.c | 6 | ||||
-rw-r--r-- | src/output/shout_ogg.c | 17 | ||||
-rw-r--r-- | src/output/shout_plugin.c | 9 |
4 files changed, 15 insertions, 18 deletions
@@ -50,6 +50,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 d5766d0a3..ebf84c0bf 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 fcb178459..4ad40acab 100644 --- a/src/output/shout_plugin.c +++ b/src/output/shout_plugin.c @@ -58,7 +58,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; } @@ -287,13 +286,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); @@ -359,6 +359,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; @@ -386,6 +388,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; @@ -410,6 +414,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) { |