From 6268bb2accfdc0dcad6cb8b54ba56ec64609d474 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Sun, 26 Mar 2017 14:58:59 +0200 Subject: Remove NodeImpl class --- src/server/BlockImpl.cpp | 5 +- src/server/BlockImpl.hpp | 19 +++++-- src/server/DuplexPort.hpp | 3 ++ src/server/Engine.cpp | 5 -- src/server/GraphImpl.hpp | 2 +- src/server/NodeImpl.cpp | 52 ------------------- src/server/NodeImpl.hpp | 100 ------------------------------------ src/server/PortImpl.cpp | 7 ++- src/server/PortImpl.hpp | 17 +++++- src/server/events/Delta.cpp | 43 ++++++++-------- src/server/events/DisconnectAll.cpp | 23 ++++----- src/server/wscript | 1 - 12 files changed, 76 insertions(+), 201 deletions(-) delete mode 100644 src/server/NodeImpl.cpp delete mode 100644 src/server/NodeImpl.hpp (limited to 'src') diff --git a/src/server/BlockImpl.cpp b/src/server/BlockImpl.cpp index d0f0d646..ceae2df2 100644 --- a/src/server/BlockImpl.cpp +++ b/src/server/BlockImpl.cpp @@ -38,7 +38,10 @@ BlockImpl::BlockImpl(PluginImpl* plugin, bool polyphonic, GraphImpl* parent, SampleRate srate) - : NodeImpl(plugin->uris(), parent, symbol) + : Node(plugin->uris(), parent ? parent->path().child(symbol) : Raul::Path("/")) + , _parent(parent) + , _path(parent ? parent->path().child(symbol) : Raul::Path("/")) + , _symbol(symbol) , _plugin(plugin) , _polyphony((polyphonic && parent) ? parent->internal_poly() : 1) , _mark(Mark::UNVISITED) diff --git a/src/server/BlockImpl.hpp b/src/server/BlockImpl.hpp index fc789813..1a794e2d 100644 --- a/src/server/BlockImpl.hpp +++ b/src/server/BlockImpl.hpp @@ -22,12 +22,11 @@ #include #include +#include "ingen/Node.hpp" #include "lilv/lilv.h" - #include "raul/Array.hpp" #include "BufferRef.hpp" -#include "NodeImpl.hpp" #include "PluginImpl.hpp" #include "PortType.hpp" #include "RunContext.hpp" @@ -56,7 +55,7 @@ class Worker; * * \ingroup engine */ -class BlockImpl : public NodeImpl +class BlockImpl : public Node , public boost::intrusive::slist_base_hook<> // In GraphImpl { public: @@ -72,6 +71,17 @@ public: virtual GraphType graph_type() const { return GraphType::BLOCK; } + BlockImpl* parent() const { return _parent; } + GraphImpl* graph_parent() const { return (GraphImpl*)_parent; } + const Raul::Path& path() const { return _path; } + const Raul::Symbol& symbol() const { return _symbol; } + + void set_uri(const Raul::URI& uri) override { + _path = uri_to_path(uri); + _symbol = Raul::Symbol(_path.is_root() ? "main" : _path.symbol()); + Node::set_uri(uri); + } + /** Return true iff this is main (the top level graph). * * This is sometimes called "the root graph", but the term "main" is used @@ -200,6 +210,9 @@ public: protected: PortImpl* nth_port_by_type(uint32_t n, bool input, PortType type); + BlockImpl* _parent; + Raul::Path _path; + Raul::Symbol _symbol; PluginImpl* _plugin; MPtr _ports; ///< Access in audio thread only uint32_t _polyphony; diff --git a/src/server/DuplexPort.hpp b/src/server/DuplexPort.hpp index e12841dd..af32d1e8 100644 --- a/src/server/DuplexPort.hpp +++ b/src/server/DuplexPort.hpp @@ -26,6 +26,7 @@ namespace Ingen { namespace Server { class BlockImpl; +class GraphImpl; /** A duplex Port (both an input and output port on a Graph) * @@ -53,6 +54,8 @@ public: virtual ~DuplexPort(); + GraphImpl* parent_graph() const { return (GraphImpl*)_parent; } + DuplexPort* duplicate(Engine& engine, const Raul::Symbol& symbol, GraphImpl* parent); diff --git a/src/server/Engine.cpp b/src/server/Engine.cpp index e2fb08af..35b71a39 100644 --- a/src/server/Engine.cpp +++ b/src/server/Engine.cpp @@ -167,11 +167,6 @@ Engine::~Engine() const SPtr store = this->store(); if (store) { - for (auto& s : *store.get()) { - if (!dynamic_ptr_cast(s.second)->parent()) { - s.second.reset(); - } - } store->clear(); } diff --git a/src/server/GraphImpl.hpp b/src/server/GraphImpl.hpp index 6064624a..8c6e3711 100644 --- a/src/server/GraphImpl.hpp +++ b/src/server/GraphImpl.hpp @@ -59,7 +59,7 @@ public: virtual ~GraphImpl(); - virtual GraphType graph_type() const { return GraphType::GRAPH; } + virtual Node::GraphType graph_type() const { return Node::GraphType::GRAPH; } BlockImpl* duplicate(Engine& engine, const Raul::Symbol& symbol, diff --git a/src/server/NodeImpl.cpp b/src/server/NodeImpl.cpp deleted file mode 100644 index 8f47fd83..00000000 --- a/src/server/NodeImpl.cpp +++ /dev/null @@ -1,52 +0,0 @@ -/* - This file is part of Ingen. - Copyright 2007-2015 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 . -*/ - -#include "GraphImpl.hpp" -#include "NodeImpl.hpp" -#include "ThreadManager.hpp" - -using namespace std; - -namespace Ingen { -namespace Server { - -NodeImpl::NodeImpl(const Ingen::URIs& uris, - BlockImpl* parent, - const Raul::Symbol& symbol) - : Node(uris, parent ? parent->path().child(symbol) : Raul::Path("/")) - , _parent(parent) - , _path(parent ? parent->path().child(symbol) : Raul::Path("/")) - , _symbol(symbol) -{ -} - -const Atom& -NodeImpl::get_property(const Raul::URI& key) const -{ - ThreadManager::assert_not_thread(THREAD_PROCESS); - static const Atom null_atom; - Properties::const_iterator i = properties().find(key); - return (i != properties().end()) ? i->second : null_atom; -} - -GraphImpl* -NodeImpl::parent_graph() const -{ - return dynamic_cast((BlockImpl*)_parent); -} - -} // namespace Server -} // namespace Ingen diff --git a/src/server/NodeImpl.hpp b/src/server/NodeImpl.hpp deleted file mode 100644 index f4de621e..00000000 --- a/src/server/NodeImpl.hpp +++ /dev/null @@ -1,100 +0,0 @@ -/* - This file is part of Ingen. - Copyright 2007-2015 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_ENGINE_NODEIMPL_HPP -#define INGEN_ENGINE_NODEIMPL_HPP - -#include -#include -#include - -#include "ingen/Node.hpp" -#include "ingen/Resource.hpp" -#include "raul/Deletable.hpp" -#include "raul/Path.hpp" - -namespace Raul { class Maid; } - -namespace Ingen { - -namespace Shared { class URIs; } - -namespace Server { - -class BlockImpl; -class BufferFactory; -class GraphImpl; -class RunContext; - -/** An object on the audio graph (a Graph, Block, or Port). - * - * Each of these is a Raul::Deletable and so can be deleted in a realtime safe - * way from anywhere, and they all have a map of variable for clients to store - * arbitrary values in (which the engine puts no significance to whatsoever). - * - * \ingroup engine - */ -class NodeImpl : public Node -{ -public: - virtual ~NodeImpl() {} - - const Raul::Symbol& symbol() const { return _symbol; } - const BlockImpl* parent() const { return _parent; } - BlockImpl* parent() { return _parent; } - - /** Rename */ - void set_uri(const Raul::URI& uri) override { - _path = uri_to_path(uri); - _symbol = Raul::Symbol(_path.is_root() ? "main" : _path.symbol()); - Node::set_uri(uri); - } - - const Atom& get_property(const Raul::URI& key) const; - - /** The Graph this object is a child of. */ - virtual GraphImpl* parent_graph() const; - - const Raul::Path& path() const { return _path; } - - /** Prepare for a new (external) polyphony value. - * - * Preprocessor thread, poly is actually applied by apply_poly. - * \return true on success. - */ - virtual bool prepare_poly(BufferFactory& bufs, uint32_t poly) = 0; - - /** Apply a new (external) polyphony value. - * - * \param context Process context (process thread only). - * \param poly Must be <= the most recent value passed to prepare_poly. - */ - virtual bool apply_poly(RunContext& context, uint32_t poly) = 0; - -protected: - NodeImpl(const Ingen::URIs& uris, - BlockImpl* parent, - const Raul::Symbol& symbol); - - BlockImpl* _parent; - Raul::Path _path; - Raul::Symbol _symbol; -}; - -} // namespace Server -} // namespace Ingen - -#endif // INGEN_ENGINE_NODEIMPL_HPP diff --git a/src/server/PortImpl.cpp b/src/server/PortImpl.cpp index 434c6ee0..7b84be17 100644 --- a/src/server/PortImpl.cpp +++ b/src/server/PortImpl.cpp @@ -44,7 +44,7 @@ monitor_period(const Engine& engine) PortImpl::PortImpl(BufferFactory& bufs, BlockImpl* const block, - const Raul::Symbol& name, + const Raul::Symbol& symbol, uint32_t index, uint32_t poly, PortType type, @@ -52,8 +52,11 @@ PortImpl::PortImpl(BufferFactory& bufs, const Atom& value, size_t buffer_size, bool is_output) - : NodeImpl(bufs.uris(), block, name) + : Node(bufs.uris(), block->path().child(symbol)) , _bufs(bufs) + , _parent(block) + , _path(block->path().child(symbol)) + , _symbol(symbol) , _index(index) , _poly(poly) , _buffer_size(buffer_size) diff --git a/src/server/PortImpl.hpp b/src/server/PortImpl.hpp index cda6ab68..aac31fc8 100644 --- a/src/server/PortImpl.hpp +++ b/src/server/PortImpl.hpp @@ -20,10 +20,10 @@ #include #include "ingen/Atom.hpp" +#include "ingen/Node.hpp" #include "raul/Array.hpp" #include "BufferRef.hpp" -#include "NodeImpl.hpp" #include "PortType.hpp" #include "types.hpp" @@ -44,7 +44,7 @@ class RunContext; * * \ingroup engine */ -class PortImpl : public NodeImpl +class PortImpl : public Node { public: struct SetState { @@ -101,6 +101,16 @@ public: virtual GraphType graph_type() const { return GraphType::PORT; } + BlockImpl* parent() const { return _parent; } + const Raul::Path& path() const { return _path; } + const Raul::Symbol& symbol() const { return _symbol; } + + void set_uri(const Raul::URI& uri) override { + _path = uri_to_path(uri); + _symbol = Raul::Symbol(_path.is_root() ? "main" : _path.symbol()); + Node::set_uri(uri); + } + /** Set the the voices (buffers) for this port in the audio thread. */ void set_voices(RunContext& context, MPtr&& voices); @@ -278,6 +288,9 @@ protected: size_t num_in_arcs) const; BufferFactory& _bufs; + BlockImpl* _parent; + Raul::Path _path; + Raul::Symbol _symbol; uint32_t _index; uint32_t _poly; uint32_t _buffer_size; diff --git a/src/server/events/Delta.cpp b/src/server/events/Delta.cpp index ecc1830a..5ea00c9f 100644 --- a/src/server/events/Delta.cpp +++ b/src/server/events/Delta.cpp @@ -217,8 +217,6 @@ Delta::pre_process(PreProcessContext& ctx) _types.reserve(_properties.size()); - NodeImpl* obj = dynamic_cast(_object); - // Remove any properties removed in delta for (const auto& r : _remove) { const Raul::URI& key = r.first; @@ -277,10 +275,9 @@ Delta::pre_process(PreProcessContext& ctx) const Raul::URI& key = p.first; const Property& value = p.second; SpecialType op = SpecialType::NONE; - if (obj) { - Resource& resource = *obj; + if (is_graph_object) { if (value != uris.patch_wildcard) { - if (resource.add_property(key, value, value.context())) { + if (_object->add_property(key, value, value.context())) { _added.emplace(key, value); } } @@ -375,22 +372,22 @@ Delta::pre_process(PreProcessContext& ctx) } if (!_create_event && key == uris.ingen_polyphonic) { - GraphImpl* parent = dynamic_cast(obj->parent()); + GraphImpl* parent = dynamic_cast( + _engine.store()->get(uri_to_path(_subject).parent())); if (!parent) { _status = Status::BAD_OBJECT_TYPE; } else if (value.type() != uris.forge.Bool) { _status = Status::BAD_VALUE_TYPE; } else { - op = SpecialType::POLYPHONIC; - obj->set_property(key, value, value.context()); - BlockImpl* block = dynamic_cast(obj); - if (block) { - block->set_polyphonic(value.get()); - } - if (value.get()) { - obj->prepare_poly(*_engine.buffer_factory(), parent->internal_poly()); - } else { - obj->prepare_poly(*_engine.buffer_factory(), 1); + op = SpecialType::POLYPHONIC; + _object->set_property(key, value, value.context()); + const uint32_t poly = ( + value.get() ? parent->internal_poly() : 1); + if (BlockImpl* block = dynamic_cast(_object)) { + block->set_polyphonic(poly); + block->prepare_poly(*_engine.buffer_factory(), poly); + } else if (PortImpl* port = dynamic_cast(_object)) { + port->prepare_poly(*_engine.buffer_factory(), poly); } } } @@ -455,7 +452,6 @@ Delta::execute(RunContext& context) _engine.control_bindings()->remove(context, _removed_bindings); } - NodeImpl* const object = dynamic_cast(_object); BlockImpl* const block = dynamic_cast(_object); PortImpl* const port = dynamic_cast(_object); @@ -484,11 +480,14 @@ Delta::execute(RunContext& context) } break; case SpecialType::POLYPHONIC: { - GraphImpl* parent = reinterpret_cast(object->parent()); - if (value.get()) { - object->apply_poly(context, parent->internal_poly_process()); - } else { - object->apply_poly(context, 1); + GraphImpl* parent = reinterpret_cast( + block ? block->parent() : port->parent()); + const uint32_t poly = ( + value.get() ? parent->internal_poly_process() : 1); + if (block) { + block->apply_poly(context, poly); + } else if (port) { + port->apply_poly(context, poly); } } break; case SpecialType::POLYPHONY: diff --git a/src/server/events/DisconnectAll.cpp b/src/server/events/DisconnectAll.cpp index 45fec243..4d5a0958 100644 --- a/src/server/events/DisconnectAll.cpp +++ b/src/server/events/DisconnectAll.cpp @@ -88,23 +88,22 @@ DisconnectAll::pre_process(PreProcessContext& ctx) _parent_path); } - NodeImpl* const object = dynamic_cast( - _engine.store()->get(_path)); - if (!object) { + Node* const node = _engine.store()->get(_path); + if (!node) { return Event::pre_process_done(Status::NOT_FOUND, _path); } - if (object->parent_graph() != _parent - && object->parent()->parent_graph() != _parent) { - return Event::pre_process_done(Status::INVALID_PARENT, _parent_path); + BlockImpl* parent = nullptr; + if ((_block = dynamic_cast(node))) { + parent = _block->parent(); + } else if ((_port = dynamic_cast(node))) { + parent = _port->parent(); + } else { + return Event::pre_process_done(Status::INTERNAL_ERROR, _path); } - // Only one of these will succeed - _block = dynamic_cast(object); - _port = dynamic_cast(object); - - if (!_block && !_port) { - return Event::pre_process_done(Status::INTERNAL_ERROR, _path); + if (parent != _parent && parent->parent() != _parent) { + return Event::pre_process_done(Status::INVALID_PARENT, _parent_path); } } diff --git a/src/server/wscript b/src/server/wscript index a8efd2f8..cc6441fc 100644 --- a/src/server/wscript +++ b/src/server/wscript @@ -21,7 +21,6 @@ def build(bld): InternalPlugin.cpp LV2Block.cpp LV2Plugin.cpp - NodeImpl.cpp PortImpl.cpp PostProcessor.cpp PreProcessor.cpp -- cgit v1.2.1