X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fport.cc;h=33b41f5c046e40dd05a23a97ea1afd494a712378;hb=cf52d6e4b40111eb04b244ec054055a4ec15dbe0;hp=677a9fba1e9a5fdbf076efa0d8a749a9fc665fff;hpb=dd89363292ca02f223ac17dbe72048810be5edfd;p=ardour.git diff --git a/libs/ardour/port.cc b/libs/ardour/port.cc index 677a9fba1e..33b41f5c04 100644 --- a/libs/ardour/port.cc +++ b/libs/ardour/port.cc @@ -30,7 +30,7 @@ #include "ardour/port.h" #include "ardour/port_engine.h" -#include "i18n.h" +#include "pbd/i18n.h" using namespace std; using namespace ARDOUR; @@ -38,6 +38,7 @@ using namespace PBD; PBD::Signal2, boost::shared_ptr > Port::PostDisconnect; PBD::Signal0 Port::PortDrop; +PBD::Signal0 Port::PortSignalDrop; bool Port::_connecting_blocked = false; pframes_t Port::_global_port_buffer_offset = 0; @@ -73,8 +74,11 @@ Port::Port (std::string const & n, DataType t, PortFlags f) cerr << "Failed to register port \"" << _name << "\", reason is unknown from here\n"; throw failed_constructor (); } - + PortDrop.connect_same_thread (drop_connection, boost::bind (&Port::drop, this)); + PortSignalDrop.connect_same_thread (drop_connection, boost::bind (&Port::signal_drop, this)); + port_manager->PortConnectedOrDisconnected.connect_same_thread (engine_connection, + boost::bind (&Port::port_connected_or_disconnected, this, _1, _3, _5)); } /** Port destructor */ @@ -103,6 +107,25 @@ Port::pretty_name(bool fallback_to_name) const return ""; } +bool +Port::set_pretty_name(const std::string& n) +{ + if (_port_handle) { + if (0 == port_engine.set_port_property (_port_handle, + "http://jackaudio.org/metadata/pretty-name", n, "")) + { + return true; + } + } + return false; +} + +void +Port::signal_drop () +{ + engine_connection.disconnect (); +} + void Port::drop () { @@ -113,13 +136,33 @@ Port::drop () } } +void +Port::port_connected_or_disconnected (boost::weak_ptr w0, boost::weak_ptr w1, bool con) +{ + if (con) { + /* we're only interested in disconnect */ + return; + } + boost::shared_ptr p0 = w0.lock (); + boost::shared_ptr p1 = w1.lock (); + /* a cheaper, less hacky way to do boost::shared_from_this() ... */ + boost::shared_ptr pself = AudioEngine::instance()->get_port_by_name (name()); + + if (p0 == pself) { + PostDisconnect (p0, p1); // emit signal + } + if (p1 == pself) { + PostDisconnect (p1, p0); // emit signal + } +} + /** @return true if this port is connected to anything */ bool Port::connected () const { if (_port_handle) { return (port_engine.connected (_port_handle) != 0); - } + } return false; } @@ -127,14 +170,22 @@ int Port::disconnect_all () { if (_port_handle) { - + + std::vector connections; + get_connections (connections); + port_engine.disconnect_all (_port_handle); _connections.clear (); - - /* a cheaper, less hacky way to do boost::shared_from_this() ... + + /* a cheaper, less hacky way to do boost::shared_from_this() ... */ boost::shared_ptr pself = port_manager->get_port_by_name (name()); - PostDisconnect (pself, boost::shared_ptr()); // emit signal + for (vector::const_iterator c = connections.begin(); c != connections.end() && pself; ++c) { + boost::shared_ptr pother = AudioEngine::instance()->get_port_by_name (*c); + if (pother) { + PostDisconnect (pself, pother); // emit signal + } + } } return 0; @@ -147,7 +198,7 @@ bool Port::connected_to (std::string const & o) const { if (!_port_handle) { - return false; + return false; } if (!port_engine.available()) { @@ -217,8 +268,7 @@ Port::disconnect (std::string const & other) _connections.erase (other); } - /* a cheaper, less hacky way to do boost::shared_from_this() ... - */ + /* a cheaper, less hacky way to do boost::shared_from_this() ... */ boost::shared_ptr pself = AudioEngine::instance()->get_port_by_name (name()); boost::shared_ptr pother = AudioEngine::instance()->get_port_by_name (other); @@ -227,7 +277,7 @@ Port::disconnect (std::string const & other) a check on whether this may affect anything that we need to know about. */ - PostDisconnect (pself, pother); // emit signal + PostDisconnect (pself, pother); // emit signal } return r; @@ -365,7 +415,7 @@ Port::public_latency_range (bool /*playback*/) const if (_port_handle) { r = port_engine.get_latency_range (_port_handle, sends_output() ? true : false); - + DEBUG_TRACE (DEBUG::Latency, string_compose ( "GET PORT %1: %4 PUBLIC latency range %2 .. %3\n", name(), r.min, r.max, @@ -457,6 +507,8 @@ Port::reestablish () reset (); + port_manager->PortConnectedOrDisconnected.connect_same_thread (engine_connection, + boost::bind (&Port::port_connected_or_disconnected, this, _1, _3, _5)); return 0; } @@ -520,7 +572,7 @@ Port::get_state () const } vector c; - + get_connections (c); for (vector::const_iterator i = c.begin(); i != c.end(); ++i) { @@ -535,7 +587,7 @@ Port::get_state () const int Port::set_state (const XMLNode& node, int) { - const XMLProperty* prop; + XMLProperty const * prop; if (node.name() != state_node_name) { return -1; @@ -554,7 +606,7 @@ Port::set_state (const XMLNode& node, int) if ((*c)->name() != X_("Connection")) { continue; } - + if ((prop = (*c)->property (X_("other"))) == 0) { continue; }