diff --git a/Userland/Libraries/LibAudio/FlacLoader.cpp b/Userland/Libraries/LibAudio/FlacLoader.cpp index 56d5b442f61..11ae35f7145 100644 --- a/Userland/Libraries/LibAudio/FlacLoader.cpp +++ b/Userland/Libraries/LibAudio/FlacLoader.cpp @@ -109,7 +109,11 @@ MaybeLoaderError FlacLoaderPlugin::parse_header() } m_total_samples = LOADER_TRY(streaminfo_data.read_bits(36)); - FLAC_VERIFY(m_total_samples > 0, LoaderError::Category::Format, "Number of samples is zero"); + if (m_total_samples == 0) { + // "A value of zero here means the number of total samples is unknown." + dbgln("FLAC Warning: File has unknown amount of samples, the loader will not stop before EOF"); + m_total_samples = NumericLimits::max(); + } VERIFY(streaminfo_data.is_aligned_to_byte_boundary()); LOADER_TRY(streaminfo_data.read_until_filled({ m_md5_checksum, sizeof(m_md5_checksum) })); @@ -129,7 +133,7 @@ MaybeLoaderError FlacLoaderPlugin::parse_header() break; case FlacMetadataBlockType::APPLICATION: // Note: Third-party library can encode specific data in this. - dbgln("Unknown 'Application' metadata block encountered."); + dbgln("FLAC Warning: Unknown 'Application' metadata block encountered."); [[fallthrough]]; case FlacMetadataBlockType::PADDING: // Note: A padding block is empty and does not need any treatment. @@ -330,14 +334,15 @@ bool FlacLoaderPlugin::should_insert_seekpoint_at(u64 sample_index) const ErrorOr>, LoaderError> FlacLoaderPlugin::load_chunks(size_t samples_to_read_from_input) { ssize_t remaining_samples = static_cast(m_total_samples - m_loaded_samples); - if (remaining_samples <= 0) + // The first condition is relevant for unknown-size streams (total samples = 0 in the header) + if (m_stream->is_eof() || remaining_samples <= 0) return Vector> {}; size_t samples_to_read = min(samples_to_read_from_input, remaining_samples); Vector> frames; size_t sample_index = 0; - while (sample_index < samples_to_read) { + while (!m_stream->is_eof() && sample_index < samples_to_read) { TRY(frames.try_append(TRY(next_frame()))); sample_index += m_current_frame->sample_count; }