diff options
author | David Robillard <d@drobilla.net> | 2018-01-21 20:52:32 +0100 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2018-01-22 00:20:19 +0100 |
commit | d9c5d89d230b204a90cca4dee4165ba6ebdf00fd (patch) | |
tree | bfef33474927a6c22f723fcc849d8df801f618e9 /ingen/client/ThreadedSigClientInterface.hpp | |
parent | 7150b9bc10511e17abdd6e528fd1317522f64eae (diff) | |
download | ingen-d9c5d89d230b204a90cca4dee4165ba6ebdf00fd.tar.gz ingen-d9c5d89d230b204a90cca4dee4165ba6ebdf00fd.tar.bz2 ingen-d9c5d89d230b204a90cca4dee4165ba6ebdf00fd.zip |
Only enqueue messages when the engine is remote
When the engine is local, messages are emitted in the Gtk thread and applied
immediately. This should make the GUI more responsive.
Diffstat (limited to 'ingen/client/ThreadedSigClientInterface.hpp')
-rw-r--r-- | ingen/client/ThreadedSigClientInterface.hpp | 95 |
1 files changed, 0 insertions, 95 deletions
diff --git a/ingen/client/ThreadedSigClientInterface.hpp b/ingen/client/ThreadedSigClientInterface.hpp deleted file mode 100644 index 751ea37b..00000000 --- a/ingen/client/ThreadedSigClientInterface.hpp +++ /dev/null @@ -1,95 +0,0 @@ -/* - This file is part of Ingen. - Copyright 2007-2015 David Robillard <http://drobilla.net/> - - 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 <http://www.gnu.org/licenses/>. -*/ - -#ifndef INGEN_CLIENT_THREADEDSIGCLIENTINTERFACE_HPP -#define INGEN_CLIENT_THREADEDSIGCLIENTINTERFACE_HPP - -#include <cstdint> -#include <mutex> -#include <string> -#include <vector> - -#undef nil -#include <sigc++/sigc++.h> - -#include "ingen/Atom.hpp" -#include "ingen/Interface.hpp" -#include "ingen/client/SigClientInterface.hpp" -#include "ingen/ingen.h" - -/** Returns nothing and takes no parameters (because they have all been bound) */ -typedef sigc::slot<void> Closure; - -namespace Ingen { - -class Interface; - -namespace Client { - -/** A LibSigC++ signal emitting interface for clients to use. - * - * This emits signals (possibly) in a different thread than the ClientInterface - * functions are called. It must be explicitly driven with the emit_signals() - * function, which fires all enqueued signals up until the present. You can - * use this in a GTK idle callback for receiving thread safe engine signals. - * - * @ingroup IngenClient - */ -class INGEN_API ThreadedSigClientInterface : public SigClientInterface -{ -public: - ThreadedSigClientInterface() - : message_slot(_signal_message.make_slot()) - {} - - URI uri() const override { return URI("ingen:/clients/sig_queue"); } - - void message(const Message& msg) override { - std::lock_guard<std::mutex> lock(_mutex); - _sigs.push_back(sigc::bind(message_slot, msg)); - } - - /** Process all queued events - Called from GTK thread to emit signals. */ - bool emit_signals() override { - // Get pending signals - std::vector<Closure> sigs; - { - std::lock_guard<std::mutex> lock(_mutex); - std::swap(sigs, _sigs); - } - - for (auto& ev : sigs) { - ev(); - ev.disconnect(); - } - - return true; - } - -private: - std::mutex _mutex; - std::vector<Closure> _sigs; - - using Graph = Resource::Graph; - using Path = Raul::Path; - - sigc::slot<void, Message> message_slot; -}; - -} // namespace Client -} // namespace Ingen - -#endif |