/* This file is part of Ingen. Copyright 2018 David Robillard Ingen is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or any later version. Ingen is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for details. You should have received a copy of the GNU Affero General Public License along with Ingen. If not, see . */ #ifndef INGEN_QUEUEDINTERFACE_HPP #define INGEN_QUEUEDINTERFACE_HPP #include "ingen/Interface.hpp" #include "ingen/Message.hpp" #include "ingen/URI.hpp" #include #include #include #include namespace ingen { /** Stores all messages and emits them to a sink on demand. * * This can be used to make an interface thread-safe. */ class QueuedInterface : public Interface { public: explicit QueuedInterface(std::shared_ptr sink) : _sink(std::move(sink)) {} URI uri() const override { return URI("ingen:/QueuedInterface"); } void message(const Message& message) override { const std::lock_guard lock{_mutex}; _messages.emplace_back(message); } void emit() { std::vector messages; { const std::lock_guard lock{_mutex}; _messages.swap(messages); } for (const auto& i : messages) { _sink->message(i); } } const std::shared_ptr& sink() const { return _sink; } private: std::mutex _mutex; std::shared_ptr _sink; std::vector _messages; }; } // namespace ingen #endif // INGEN_QUEUEDINTERFACE_HPP