diff --git a/Userland/Libraries/LibAudio/MP3Loader.cpp b/Userland/Libraries/LibAudio/MP3Loader.cpp index ccd1a5bfb5..17bff9f338 100644 --- a/Userland/Libraries/LibAudio/MP3Loader.cpp +++ b/Userland/Libraries/LibAudio/MP3Loader.cpp @@ -192,7 +192,7 @@ MaybeLoaderError MP3LoaderPlugin::build_seek_table() frame_count++; sample_count += MP3::frame_size; - TRY(m_stream->seek(error_or_header.value().frame_size - 6, SeekMode::FromCurrentPosition)); + TRY(m_stream->seek(error_or_header.value().frame_size - error_or_header.value().header_size, SeekMode::FromCurrentPosition)); // TODO: This is just here to clear the bitstream buffer. // Bitstream should have a method to sync its state to the underlying stream. @@ -223,10 +223,13 @@ ErrorOr MP3LoaderPlugin::read_header() header.copyright_bit = TRY(m_bitstream->read_bit()); header.original_bit = TRY(m_bitstream->read_bit()); header.emphasis = static_cast(TRY(m_bitstream->read_bits(2))); - if (!header.protection_bit) + header.header_size = 4; + if (!header.protection_bit) { header.crc16 = TRY(m_bitstream->read_bits(16)); + header.header_size += 2; + } header.frame_size = 144 * header.bitrate * 1000 / header.samplerate + header.padding_bit; - header.slot_count = header.frame_size - ((header.channel_count() == 2 ? 32 : 17) + (header.protection_bit ? 0 : 2) + 4); + header.slot_count = header.frame_size - ((header.channel_count() == 2 ? 32 : 17) + header.header_size); return header; } diff --git a/Userland/Libraries/LibAudio/MP3Types.h b/Userland/Libraries/LibAudio/MP3Types.h index 764b0a00f6..bf3d25db56 100644 --- a/Userland/Libraries/LibAudio/MP3Types.h +++ b/Userland/Libraries/LibAudio/MP3Types.h @@ -58,6 +58,7 @@ struct Header { bool original_bit { false }; Emphasis emphasis { Emphasis::None }; u16 crc16 { 0 }; + size_t header_size { 0 }; size_t frame_size { 0 }; size_t slot_count { 0 };