X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fport.cc;h=cf961d68286d92281591d1561dc8d6ad8b04c4c6;hb=be6d6231fbe56875815c81999e1fc41db0e21a23;hp=3aaa371f168297750038eaaeb2cfb46f408e5c69;hpb=f0fcda204444922fc0e1261929aa6fdb84412036;p=ardour.git diff --git a/libs/ardour/port.cc b/libs/ardour/port.cc index 3aaa371f16..cf961d6828 100644 --- a/libs/ardour/port.cc +++ b/libs/ardour/port.cc @@ -44,6 +44,7 @@ PBD::Signal0 Port::PortDrop; bool Port::_connecting_blocked = false; pframes_t Port::_global_port_buffer_offset = 0; pframes_t Port::_cycle_nframes = 0; +std::string Port::state_node_name = X_("Port"); /* a handy define to shorten what would otherwise be a needlessly verbose * repeated phrase @@ -121,7 +122,7 @@ Port::disconnect_all () bool Port::connected_to (std::string const & o) const { - if (!port_engine.connected()) { + if (!port_engine.available()) { return false; } @@ -131,7 +132,7 @@ Port::connected_to (std::string const & o) const int Port::get_connections (std::vector & c) const { - if (!port_engine.connected()) { + if (!port_engine.available()) { c.insert (c.end(), _connections.begin(), _connections.end()); return c.size(); } @@ -152,8 +153,10 @@ Port::connect (std::string const & other) } if (sends_output ()) { + DEBUG_TRACE (DEBUG::Ports, string_compose ("Connect %1 to %2\n", our_name, other_name)); r = port_engine.connect (our_name, other_name); } else { + DEBUG_TRACE (DEBUG::Ports, string_compose ("Connect %1 to %2\n", other_name, our_name)); r = port_engine.connect (other_name, our_name); } @@ -419,6 +422,8 @@ Port::reconnect () { /* caller must hold process lock; intended to be used only after reestablish() */ + DEBUG_TRACE (DEBUG::Ports, string_compose ("Connect %1 to %2 destinations\n",name(), _connections.size())); + for (std::set::iterator i = _connections.begin(); i != _connections.end(); ++i) { if (connect (*i)) { return -1; @@ -453,3 +458,61 @@ Port::physically_connected () const return port_engine.physically_connected (_port_handle); } +XMLNode& +Port::get_state () const +{ + XMLNode* root = new XMLNode (state_node_name); + + root->add_property (X_("name"), AudioEngine::instance()->make_port_name_relative (name())); + + if (receives_input()) { + root->add_property (X_("direction"), X_("input")); + } else { + root->add_property (X_("direction"), X_("output")); + } + + vector c; + + get_connections (c); + + for (vector::const_iterator i = c.begin(); i != c.end(); ++i) { + XMLNode* child = new XMLNode (X_("Connection")); + child->add_property (X_("other"), *i); + root->add_child_nocopy (*child); + } + + return *root; +} + +int +Port::set_state (const XMLNode& node, int) +{ + const XMLProperty* prop; + + if (node.name() != state_node_name) { + return -1; + } + + if ((prop = node.property (X_("name"))) != 0) { + set_name (prop->value()); + } + + const XMLNodeList& children (node.children()); + + _connections.clear (); + + for (XMLNodeList::const_iterator c = children.begin(); c != children.end(); ++c) { + + if ((*c)->name() != X_("Connection")) { + continue; + } + + if ((prop = (*c)->property (X_("other"))) == 0) { + continue; + } + + _connections.insert (prop->value()); + } + + return 0; +}