keep portmap & portindex in sync when renaming ports
authorRobin Gareus <robin@gareus.org>
Tue, 26 Apr 2016 00:26:20 +0000 (02:26 +0200)
committerRobin Gareus <robin@gareus.org>
Tue, 26 Apr 2016 00:26:20 +0000 (02:26 +0200)
Fixes crash on session re-load (introduced in 800c8182 and fde99e68)

libs/backends/alsa/alsa_audiobackend.cc
libs/backends/coreaudio/coreaudio_backend.cc
libs/backends/dummy/dummy_audiobackend.cc

index 8f8eaa75a393731d1543bff634bbaed8f543b9a8..a3ba3f36c476f167720a03c317dcbe18a02f7c77 100644 (file)
@@ -1210,11 +1210,20 @@ AlsaAudioBackend::port_name_size () const
 int
 AlsaAudioBackend::set_port_name (PortEngine::PortHandle port, const std::string& name)
 {
+       std::string newname (_instance_name + ":" + name);
        if (!valid_port (port)) {
-               PBD::error << _("AlsaBackend::set_port_name: Invalid Port(s)") << endmsg;
+               PBD::error << _("AlsaBackend::set_port_name: Invalid Port") << endmsg;
                return -1;
        }
-       return static_cast<AlsaPort*>(port)->set_name (_instance_name + ":" + name);
+       if (find_port (newname)) {
+               PBD::error << _("AlsaBackend::set_port_name: Port with given name already exists") << endmsg;
+               return -1;
+       }
+
+       AlsaPort* p = static_cast<AlsaPort*>(port);
+       _portmap.erase (p->name());
+       _portmap.insert (make_pair (newname, p));
+       return p->set_name (newname);
 }
 
 std::string
index 0047721d81f1613b5c556e9b676e6eb2b4ab3745..b1721dd2d582f1f59804e67871f3f94336321a4f 100644 (file)
@@ -902,11 +902,20 @@ CoreAudioBackend::port_name_size () const
 int
 CoreAudioBackend::set_port_name (PortEngine::PortHandle port, const std::string& name)
 {
+       std::string newname (_instance_name + ":" + name);
        if (!valid_port (port)) {
                PBD::warning << _("CoreAudioBackend::set_port_name: Invalid Port(s)") << endmsg;
                return -1;
        }
-       return static_cast<CoreBackendPort*>(port)->set_name (_instance_name + ":" + name);
+       if (find_port (newname)) {
+               PBD::error << _("CoreAudioBackend::set_port_name: Port with given name already exists") << endmsg;
+               return -1;
+       }
+
+       CoreBackendPort* p = static_cast<CoreBackendPort*>(port);
+       _portmap.erase (p->name());
+       _portmap.insert (make_pair (newname, p));
+       return p->set_name (newname);
 }
 
 std::string
index 94ed1a0fd74e2478563406b18d88e63434626a69..91efd79a495f2226b120374f2e79c60da32cf386 100644 (file)
@@ -432,6 +432,9 @@ DummyAudioBackend::_start (bool /*for_latency_measurement*/)
                for (PortIndex::const_iterator it = _ports.begin (); it != _ports.end (); ++it) {
                        PBD::info << _("DummyAudioBackend: port '") << (*it)->name () << "' exists." << endmsg;
                }
+               for (PortMap::const_iterator it = _portmap.begin (); it != _portmap.end (); ++it) {
+                       PBD::info << _("DummyAudioBackend: portmap '") << (*it).first << "' exists." << endmsg;
+               }
                _system_inputs.clear();
                _system_outputs.clear();
                _system_midi_in.clear();
@@ -643,11 +646,22 @@ DummyAudioBackend::port_name_size () const
 int
 DummyAudioBackend::set_port_name (PortEngine::PortHandle port, const std::string& name)
 {
+       std::string newname (_instance_name + ":" + name);
+
        if (!valid_port (port)) {
                PBD::error << _("DummyBackend::set_port_name: Invalid Port(s)") << endmsg;
                return -1;
        }
-       return static_cast<DummyPort*>(port)->set_name (_instance_name + ":" + name);
+
+       if (find_port (newname)) {
+               PBD::error << _("DummyBackend::set_port_name: Port with given name already exists") << endmsg;
+               return -1;
+       }
+
+       DummyPort* p = static_cast<DummyPort*>(port);
+       _portmap.erase (p->name());
+       _portmap.insert (make_pair (newname, p));
+       return p->set_name (newname);
 }
 
 std::string