diff options
author | Max Kellermann <max@duempel.org> | 2009-05-05 22:40:51 +0200 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2009-05-05 22:40:51 +0200 |
commit | ebc1d3516c0334a093d8426e52402febb3dd6b00 (patch) | |
tree | cf35b07984b5b70788b20c999c24d598fe5c2149 /src/encoder/vorbis_encoder.c | |
parent | 7875072d3860865aadcbd245c71e86b6c94203d4 (diff) | |
download | mpd-ebc1d3516c0334a093d8426e52402febb3dd6b00.tar.gz mpd-ebc1d3516c0334a093d8426e52402febb3dd6b00.tar.xz mpd-ebc1d3516c0334a093d8426e52402febb3dd6b00.zip |
vorbis_encoder: start a new stream in tag()
When a new tag is set, end the current stream and begin a new one.
Use vorbis_analysis_headerout() to write a full ogg header. This
fixes a problem with icecast: after a song change in MPD, icecast
stops forwarding ogg packets to its clients.
Diffstat (limited to 'src/encoder/vorbis_encoder.c')
-rw-r--r-- | src/encoder/vorbis_encoder.c | 15 |
1 files changed, 9 insertions, 6 deletions
diff --git a/src/encoder/vorbis_encoder.c b/src/encoder/vorbis_encoder.c index 0332f1106..a5f6387f6 100644 --- a/src/encoder/vorbis_encoder.c +++ b/src/encoder/vorbis_encoder.c @@ -295,22 +295,25 @@ vorbis_encoder_tag(struct encoder *_encoder, const struct tag *tag, { struct vorbis_encoder *encoder = (struct vorbis_encoder *)_encoder; vorbis_comment comment; - ogg_packet packet; /* write the vorbis_comment object */ vorbis_comment_init(&comment); copy_tag_to_vorbis_comment(&comment, tag); - /* convert that vorbis_comment into a ogg_packet */ + /* reset ogg_stream_state and begin a new stream */ - vorbis_commentheader_out(&comment, &packet); + ogg_stream_reset_serialno(&encoder->os, g_random_int()); + + /* send that vorbis_comment to the ogg_stream_state */ + + vorbis_encoder_headerout(encoder, &comment); vorbis_comment_clear(&comment); - /* .. and send it into the ogg_stream_state */ + /* the next vorbis_encoder_read() call should flush the + ogg_stream_state */ - ogg_stream_packetin(&encoder->os, &packet); - ogg_packet_clear(&packet); + encoder->flush = true; return true; } |