diff options
author | David Robillard <d@drobilla.net> | 2013-06-09 02:27:16 +0000 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2013-06-09 02:27:16 +0000 |
commit | 2a37fbef6832aebfcb22feefa0bb05104eb6f018 (patch) | |
tree | 5e161bce0a7e0e6c5b66659693a139bff8520ec2 | |
parent | 947b2ebaee2a4a6e5b59ec90856dd66eae63b3f2 (diff) | |
download | ingen-2a37fbef6832aebfcb22feefa0bb05104eb6f018.tar.gz ingen-2a37fbef6832aebfcb22feefa0bb05104eb6f018.tar.bz2 ingen-2a37fbef6832aebfcb22feefa0bb05104eb6f018.zip |
Inherit certain properties from ports connected to patch ports.
This is a bit too hard-edged at present, but does the right thing when building
a patch from scratch at least. Something needs to be done about removing the
properties, but this is hard for outputs since the arcs aren't keyed that way.
The main problem here is that Ardour barfs on plugins with MIDI input for audio
tracks, so if you *ever* connect the control input to a MIDI anything, it will
stick and not work in an Ardour audio track. Maybe it should be just
implemented for inputs as a stop gap...
git-svn-id: http://svn.drobilla.net/lad/trunk/ingen@5136 a436a847-0d15-0410-975c-d299462d15a1
-rw-r--r-- | src/server/DuplexPort.cpp | 34 | ||||
-rw-r--r-- | src/server/DuplexPort.hpp | 4 | ||||
-rw-r--r-- | src/server/InputPort.hpp | 2 | ||||
-rw-r--r-- | src/server/PortImpl.cpp | 6 | ||||
-rw-r--r-- | src/server/PortImpl.hpp | 10 | ||||
-rw-r--r-- | src/server/events/Connect.cpp | 11 | ||||
-rw-r--r-- | src/server/events/Connect.hpp | 4 | ||||
-rw-r--r-- | src/server/internals/Controller.cpp | 2 | ||||
-rw-r--r-- | src/server/internals/Note.cpp | 2 | ||||
-rw-r--r-- | src/server/internals/Trigger.cpp | 2 |
10 files changed, 70 insertions, 7 deletions
diff --git a/src/server/DuplexPort.cpp b/src/server/DuplexPort.cpp index 6049e001..0e19e939 100644 --- a/src/server/DuplexPort.cpp +++ b/src/server/DuplexPort.cpp @@ -53,6 +53,40 @@ DuplexPort::~DuplexPort() } } +void +DuplexPort::inherit_neighbour(const PortImpl* port, + Resource::Properties& remove, + Resource::Properties& add) +{ + /* TODO: This needs to become more sophisticated, and correct the situation + if the port is disconnected. */ + if (_type == PortType::CONTROL || _type == PortType::CV) { + if (port->minimum().get<float>() < _min.get<float>()) { + _min = port->minimum(); + remove.insert(std::make_pair(_bufs.uris().lv2_minimum, + Property(_bufs.uris().wildcard))); + add.insert(std::make_pair(_bufs.uris().lv2_minimum, + port->minimum())); + } + if (port->maximum().get<float>() > _max.get<float>()) { + _max = port->maximum(); + remove.insert(std::make_pair(_bufs.uris().lv2_maximum, + Property(_bufs.uris().wildcard))); + add.insert(std::make_pair(_bufs.uris().lv2_maximum, + port->maximum())); + } + } else if (_type == PortType::ATOM) { + for (Resource::Properties::const_iterator i = port->properties().find( + _bufs.uris().atom_supports); + i != port->properties().end() && + i->first == _bufs.uris().atom_supports; + ++i) { + set_property(i->first, i->second); + add.insert(*i); + } + } +} + bool DuplexPort::get_buffers(BufferFactory& bufs, Raul::Array<BufferRef>* buffers, diff --git a/src/server/DuplexPort.hpp b/src/server/DuplexPort.hpp index a7ad58bd..725c09c7 100644 --- a/src/server/DuplexPort.hpp +++ b/src/server/DuplexPort.hpp @@ -56,6 +56,10 @@ public: virtual ~DuplexPort(); + void inherit_neighbour(const PortImpl* port, + Resource::Properties& remove, + Resource::Properties& add); + uint32_t max_tail_poly(Context& context) const; bool get_buffers(BufferFactory& bufs, diff --git a/src/server/InputPort.hpp b/src/server/InputPort.hpp index d1082b71..43a182e4 100644 --- a/src/server/InputPort.hpp +++ b/src/server/InputPort.hpp @@ -71,7 +71,7 @@ public: void add_arc(ProcessContext& context, ArcImpl* c); ArcImpl* remove_arc(ProcessContext& context, - const OutputPort* tail); + const OutputPort* tail); bool apply_poly(ProcessContext& context, Raul::Maid& maid, uint32_t poly); diff --git a/src/server/PortImpl.cpp b/src/server/PortImpl.cpp index 29b6e044..0fc73649 100644 --- a/src/server/PortImpl.cpp +++ b/src/server/PortImpl.cpp @@ -92,12 +92,6 @@ PortImpl::PortImpl(BufferFactory& bufs, if (type == PortType::ATOM) { add_property(uris.atom_bufferType, bufs.forge().make_urid(buffer_type)); - if (block->graph_type() == Ingen::Node::GraphType::GRAPH) { - add_property(uris.atom_supports, - bufs.forge().make_urid(uris.midi_MidiEvent)); - add_property(uris.atom_supports, - bufs.forge().make_urid(uris.time_Position)); - } } } diff --git a/src/server/PortImpl.hpp b/src/server/PortImpl.hpp index c980a134..8e6c8e77 100644 --- a/src/server/PortImpl.hpp +++ b/src/server/PortImpl.hpp @@ -122,6 +122,16 @@ public: void activate(BufferFactory& bufs); void deactivate(); + /** + Inherit any properties from a connected neighbour. + + This is used for Graph ports, so e.g. a control input has the range of + all the ports it is connected to. + */ + virtual void inherit_neighbour(const PortImpl* port, + Resource::Properties& remove, + Resource::Properties& add) {} + virtual void connect_buffers(); virtual void recycle_buffers(); diff --git a/src/server/events/Connect.cpp b/src/server/events/Connect.cpp index 4c4a3974..75659452 100644 --- a/src/server/events/Connect.cpp +++ b/src/server/events/Connect.cpp @@ -124,6 +124,9 @@ Connect::pre_process() _graph->add_arc(_arc); _head->increment_num_arcs(); + + tail_output->inherit_neighbour(_head, _tail_remove, _tail_add); + _head->inherit_neighbour(tail_output, _head_remove, _head_add); } _buffers = new Raul::Array<BufferRef>(_head->poly()); @@ -156,6 +159,14 @@ Connect::post_process() Broadcaster::Transfer t(*_engine.broadcaster()); if (respond() == Status::SUCCESS) { _engine.broadcaster()->connect(_tail_path, _head_path); + if (!_tail_remove.empty() || !_tail_add.empty()) { + _engine.broadcaster()->delta( + Node::path_to_uri(_tail_path), _tail_remove, _tail_add); + } + if (!_tail_remove.empty() || !_tail_add.empty()) { + _engine.broadcaster()->delta( + Node::path_to_uri(_tail_path), _tail_remove, _tail_add); + } } } diff --git a/src/server/events/Connect.hpp b/src/server/events/Connect.hpp index 4b515087..d5e58a99 100644 --- a/src/server/events/Connect.hpp +++ b/src/server/events/Connect.hpp @@ -64,6 +64,10 @@ private: CompiledGraph* _compiled_graph; SPtr<ArcImpl> _arc; Raul::Array<BufferRef>* _buffers; + Resource::Properties _tail_remove; + Resource::Properties _tail_add; + Resource::Properties _head_remove; + Resource::Properties _head_add; }; } // namespace Events diff --git a/src/server/internals/Controller.cpp b/src/server/internals/Controller.cpp index dd693eb3..5ac37df4 100644 --- a/src/server/internals/Controller.cpp +++ b/src/server/internals/Controller.cpp @@ -56,6 +56,8 @@ ControllerNode::ControllerNode(InternalPlugin* plugin, _midi_in_port = new InputPort(bufs, this, Raul::Symbol("input"), 0, 1, PortType::ATOM, uris.atom_Sequence, Atom()); _midi_in_port->set_property(uris.lv2_name, bufs.forge().alloc("Input")); + _midi_in_port->set_property(uris.atom_supports, + bufs.forge().make_urid(uris.midi_MidiEvent)); _ports->at(0) = _midi_in_port; _param_port = new InputPort(bufs, this, Raul::Symbol("controller"), 1, 1, diff --git a/src/server/internals/Note.cpp b/src/server/internals/Note.cpp index f7d0e16c..a1da9f2f 100644 --- a/src/server/internals/Note.cpp +++ b/src/server/internals/Note.cpp @@ -63,6 +63,8 @@ NoteNode::NoteNode(InternalPlugin* plugin, _midi_in_port = new InputPort(bufs, this, Raul::Symbol("input"), 0, 1, PortType::ATOM, uris.atom_Sequence, Atom()); _midi_in_port->set_property(uris.lv2_name, bufs.forge().alloc("Input")); + _midi_in_port->set_property(uris.atom_supports, + bufs.forge().make_urid(uris.midi_MidiEvent)); _ports->at(0) = _midi_in_port; _freq_port = new OutputPort(bufs, this, Raul::Symbol("frequency"), 1, _polyphony, diff --git a/src/server/internals/Trigger.cpp b/src/server/internals/Trigger.cpp index 78f87b34..abef29ca 100644 --- a/src/server/internals/Trigger.cpp +++ b/src/server/internals/Trigger.cpp @@ -56,6 +56,8 @@ TriggerNode::TriggerNode(InternalPlugin* plugin, _midi_in_port = new InputPort(bufs, this, Raul::Symbol("input"), 0, 1, PortType::ATOM, uris.atom_Sequence, Atom()); _midi_in_port->set_property(uris.lv2_name, bufs.forge().alloc("Input")); + _midi_in_port->set_property(uris.atom_supports, + bufs.forge().make_urid(uris.midi_MidiEvent)); _ports->at(0) = _midi_in_port; _note_port = new InputPort(bufs, this, Raul::Symbol("note"), 1, 1, |