From f2d3c77c9a470f20506c90098ab5cf4d3e5c9eff Mon Sep 17 00:00:00 2001 From: David Robillard Date: Sat, 16 Dec 2017 22:27:22 +0100 Subject: Adjust indices when ports are deleted --- src/server/GraphImpl.cpp | 38 ++++++++++++++++++++++++++++++++------ 1 file changed, 32 insertions(+), 6 deletions(-) (limited to 'src/server/GraphImpl.cpp') 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 result = maid.make_managed(n); - size_t i = 0; - - for (PortList::iterator p = _inputs.begin(); p != _inputs.end(); ++p, ++i) - result->at(i) = &*p; + std::map 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); -- cgit v1.2.1