diff --git a/libs/audio/include/psemek/audio/combine/mixer.hpp b/libs/audio/include/psemek/audio/combine/mixer.hpp index 1796978a..d4d0f296 100644 --- a/libs/audio/include/psemek/audio/combine/mixer.hpp +++ b/libs/audio/include/psemek/audio/combine/mixer.hpp @@ -15,6 +15,7 @@ namespace psemek::audio virtual channel_ptr add(stream_ptr stream) = 0; virtual std::size_t stream_count() const = 0; + virtual std::size_t max_length() const = 0; }; using mixer_ptr = std::shared_ptr; diff --git a/libs/audio/source/combine/mixer.cpp b/libs/audio/source/combine/mixer.cpp index 98c5e69c..24e00958 100644 --- a/libs/audio/source/combine/mixer.cpp +++ b/libs/audio/source/combine/mixer.cpp @@ -22,6 +22,8 @@ namespace psemek::audio return stream_count_.load(); } + std::size_t max_length() const override; + std::size_t read(util::span samples) override; std::optional length() const override @@ -59,6 +61,17 @@ namespace psemek::audio return result; } + std::size_t mixer_impl::max_length() const + { + // TODO: safe access when the mixer is already playing? + std::size_t result = 0; + for (auto const & channel : new_channels_) + if (auto stream = channel->stream()) + if (auto length = stream->length(); length && *length > result) + result = *length; + return result; + } + std::size_t mixer_impl::read(util::span samples) { {