summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2013-06-09 02:27:16 +0000
committerDavid Robillard <d@drobilla.net>2013-06-09 02:27:16 +0000
commit2a37fbef6832aebfcb22feefa0bb05104eb6f018 (patch)
tree5e161bce0a7e0e6c5b66659693a139bff8520ec2
parent947b2ebaee2a4a6e5b59ec90856dd66eae63b3f2 (diff)
downloadingen-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.cpp34
-rw-r--r--src/server/DuplexPort.hpp4
-rw-r--r--src/server/InputPort.hpp2
-rw-r--r--src/server/PortImpl.cpp6
-rw-r--r--src/server/PortImpl.hpp10
-rw-r--r--src/server/events/Connect.cpp11
-rw-r--r--src/server/events/Connect.hpp4
-rw-r--r--src/server/internals/Controller.cpp2
-rw-r--r--src/server/internals/Note.cpp2
-rw-r--r--src/server/internals/Trigger.cpp2
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,