summaryrefslogtreecommitdiffstats
path: root/src/server/GraphImpl.cpp
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2017-12-16 22:27:22 +0100
committerDavid Robillard <d@drobilla.net>2017-12-16 22:27:22 +0100
commitf2d3c77c9a470f20506c90098ab5cf4d3e5c9eff (patch)
tree38b27fed96f39bd1a3b255206f3af93c8f4708af /src/server/GraphImpl.cpp
parentd078741456bacf08e2bc3e5d6cda58c2d16ef029 (diff)
downloadingen-f2d3c77c9a470f20506c90098ab5cf4d3e5c9eff.tar.gz
ingen-f2d3c77c9a470f20506c90098ab5cf4d3e5c9eff.tar.bz2
ingen-f2d3c77c9a470f20506c90098ab5cf4d3e5c9eff.zip
Adjust indices when ports are deleted
Diffstat (limited to 'src/server/GraphImpl.cpp')
-rw-r--r--src/server/GraphImpl.cpp38
1 files changed, 32 insertions, 6 deletions
diff --git a/src/server/GraphImpl.cpp b/src/server/GraphImpl.cpp
index adfb433d..389fd182 100644
--- a/src/server/GraphImpl.cpp
+++ b/src/server/GraphImpl.cpp
@@ -312,6 +312,27 @@ GraphImpl::num_ports_non_rt() const
return _inputs.size() + _outputs.size();
}
+bool
+GraphImpl::has_port_with_index(uint32_t index) const
+{
+ BufferFactory& bufs = *_engine.buffer_factory();
+ const auto index_atom = bufs.forge().make(int32_t(index));
+
+ for (auto p = _inputs.begin(); p != _inputs.end(); ++p) {
+ if (p->has_property(bufs.uris().lv2_index, index_atom)) {
+ return true;
+ }
+ }
+
+ for (auto p = _outputs.begin(); p != _outputs.end(); ++p) {
+ if (p->has_property(bufs.uris().lv2_index, index_atom)) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
void
GraphImpl::remove_port(DuplexPort& port)
{
@@ -337,13 +358,18 @@ GraphImpl::build_ports_array(Raul::Maid& maid)
const size_t n = _inputs.size() + _outputs.size();
MPtr<Ports> result = maid.make_managed<Ports>(n);
- size_t i = 0;
-
- for (PortList::iterator p = _inputs.begin(); p != _inputs.end(); ++p, ++i)
- result->at(i) = &*p;
+ std::map<size_t, DuplexPort*> ports;
+ for (PortList::iterator p = _inputs.begin(); p != _inputs.end(); ++p) {
+ ports.emplace(p->index(), &*p);
+ }
+ for (PortList::iterator p = _outputs.begin(); p != _outputs.end(); ++p) {
+ ports.emplace(p->index(), &*p);
+ }
- for (PortList::iterator p = _outputs.begin(); p != _outputs.end(); ++p, ++i)
- result->at(i) = &*p;
+ size_t i = 0;
+ for (const auto& p : ports) {
+ result->at(i++) = p.second;
+ }
assert(i == n);