diff --git a/libs/audio/source/effect/truncate.cpp b/libs/audio/source/effect/truncate.cpp index d4b55ac4..dac065c9 100644 --- a/libs/audio/source/effect/truncate.cpp +++ b/libs/audio/source/effect/truncate.cpp @@ -13,19 +13,21 @@ namespace psemek::audio { truncate_impl(stream_ptr stream, duration length) : stream_(std::move(stream)) - , length_(length) + , remaining_(length.samples()) + , total_length_(stream_->played() + remaining_) {} std::optional length() const override { - return length_.samples(); + return total_length_; } std::size_t read(util::span samples) override { - auto played = stream_->played(); - auto max_count = std::min(length_.samples() - played, samples.size()); - return stream_->read(samples.prefix(max_count)); + auto const max_count = std::min(remaining_, samples.size()); + auto const count = stream_->read(samples.prefix(max_count)); + remaining_ -= count; + return count; } std::size_t played() const override @@ -35,7 +37,8 @@ namespace psemek::audio private: stream_ptr stream_; - duration length_; + std::size_t remaining_; + std::size_t total_length_; }; }