Fix length computation in truncate filter

This commit is contained in:
Nikita Lisitsa 2026-07-18 19:03:29 +03:00
parent 3713f620bb
commit dbf5117dc6

View file

@ -13,19 +13,21 @@ namespace psemek::audio
{ {
truncate_impl(stream_ptr stream, duration length) truncate_impl(stream_ptr stream, duration length)
: stream_(std::move(stream)) : stream_(std::move(stream))
, length_(length) , remaining_(length.samples())
, total_length_(stream_->played() + remaining_)
{} {}
std::optional<std::size_t> length() const override std::optional<std::size_t> length() const override
{ {
return length_.samples(); return total_length_;
} }
std::size_t read(util::span<float> samples) override std::size_t read(util::span<float> samples) override
{ {
auto played = stream_->played(); auto const max_count = std::min<std::size_t>(remaining_, samples.size());
auto max_count = std::min<std::size_t>(length_.samples() - played, samples.size()); auto const count = stream_->read(samples.prefix(max_count));
return stream_->read(samples.prefix(max_count)); remaining_ -= count;
return count;
} }
std::size_t played() const override std::size_t played() const override
@ -35,7 +37,8 @@ namespace psemek::audio
private: private:
stream_ptr stream_; stream_ptr stream_;
duration length_; std::size_t remaining_;
std::size_t total_length_;
}; };
} }