From cab34558ce64d4887edd9e415ecbba232377405c Mon Sep 17 00:00:00 2001 From: lisyarus Date: Wed, 5 Oct 2022 22:31:29 +0300 Subject: [PATCH] Support replacing a mixing channel stream --- libs/audio/include/psemek/audio/mixer.hpp | 3 +++ libs/audio/source/mixer.cpp | 9 +++++++++ 2 files changed, 12 insertions(+) diff --git a/libs/audio/include/psemek/audio/mixer.hpp b/libs/audio/include/psemek/audio/mixer.hpp index 7f401c88..cc464584 100644 --- a/libs/audio/include/psemek/audio/mixer.hpp +++ b/libs/audio/include/psemek/audio/mixer.hpp @@ -1,6 +1,7 @@ #pragma once #include +#include #include @@ -16,6 +17,8 @@ namespace psemek::audio virtual bool is_stopped() const = 0; + virtual void replace(util::function modifier) = 0; + virtual ~channel() {} }; diff --git a/libs/audio/source/mixer.cpp b/libs/audio/source/mixer.cpp index 07379b85..52720ee8 100644 --- a/libs/audio/source/mixer.cpp +++ b/libs/audio/source/mixer.cpp @@ -18,6 +18,8 @@ namespace psemek::audio void stop() override; bool is_stopped() const override; + + void replace(util::function modifier) override; }; void channel_impl::stop() @@ -30,6 +32,13 @@ namespace psemek::audio return std::atomic_load(&stream) != nullptr; } + void channel_impl::replace(util::function modifier) + { + stream_ptr stream = std::atomic_load(&(this->stream)); + stream = modifier(std::move(stream)); + std::atomic_store(&(this->stream), std::move(stream)); + } + struct mixer_impl final : mixer , std::enable_shared_from_this