decoder/ogg: ignore the BOS packet after seek to the beginning of song
Previously, MPD would skip the current song after attempting to seek to its beginnig, because that was a seek to offset 0. At offset 0, MPD will see the BOS packet again, which results in throwing StopDecoder in MPDOpusDecoder::OnOggEnd(). Closes https://github.com/MusicPlayerDaemon/MPD/issues/470
This commit is contained in:
@@ -20,6 +20,7 @@
|
||||
#include "OggVisitor.hxx"
|
||||
|
||||
#include <stdexcept>
|
||||
#include <utility>
|
||||
|
||||
void
|
||||
OggVisitor::EndStream()
|
||||
@@ -51,7 +52,13 @@ OggVisitor::ReadNextPage()
|
||||
inline void
|
||||
OggVisitor::HandlePacket(const ogg_packet &packet)
|
||||
{
|
||||
const bool _post_seek = std::exchange(post_seek, false);
|
||||
|
||||
if (packet.b_o_s) {
|
||||
if (_post_seek)
|
||||
/* ignore the BOS packet after seeking */
|
||||
return;
|
||||
|
||||
EndStream();
|
||||
has_stream = true;
|
||||
OnOggBeginning(packet);
|
||||
@@ -97,4 +104,6 @@ OggVisitor::PostSeek()
|
||||
|
||||
/* find the next Ogg page and feed it into the stream */
|
||||
sync.ExpectPageSeekIn(stream);
|
||||
|
||||
post_seek = true;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user