X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fio.cc;h=3bbe34f825b97a31861ae90c5e0e05a9f8e54553;hb=cb09b0b34e6382bcd403526e8501b62d609fed39;hp=1349d49a0ce1c36667c4cff1b57f151ebd188778;hpb=650964f3203319b013c49a286b5fc5fc203f3bbb;p=ardour.git diff --git a/libs/ardour/io.cc b/libs/ardour/io.cc index 1349d49a0c..3bbe34f825 100644 --- a/libs/ardour/io.cc +++ b/libs/ardour/io.cc @@ -16,9 +16,9 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#include #include #include +#include #include #include @@ -38,6 +38,7 @@ #include "ardour/debug.h" #include "ardour/io.h" #include "ardour/port.h" +#include "ardour/profile.h" #include "ardour/route.h" #include "ardour/session.h" #include "ardour/user_bundle.h" @@ -111,7 +112,7 @@ IO::disconnect_check (boost::shared_ptr a, boost::shared_ptr b) * ::disconnect() */ if (_ports.contains (a) || _ports.contains (b)) { - changed (IOChange (IOChange::ConnectionsChanged), this); /* EMIT SIGNAL */ + changed (IOChange (IOChange::ConnectionsChanged), this); /* EMIT SIGNAL */ } } else { /* we didn't get the lock, so assume that we're inside @@ -297,7 +298,7 @@ IO::remove_port (boost::shared_ptr port, void* src) } _session.set_dirty (); - + return 0; } @@ -319,12 +320,12 @@ IO::add_port (string destination, void* src, DataType type) ChanCount before = _ports.count (); ChanCount after = before; after.set (type, after.get (type) + 1); - + bool const r = PortCountChanging (after); /* EMIT SIGNAL */ if (r) { return -1; } - + IOChange change; { @@ -337,7 +338,7 @@ IO::add_port (string destination, void* src, DataType type) /* Create a new port */ string portname = build_legal_port_name (type); - + if (_direction == Input) { if ((our_port = _session.engine().register_input_port (type, portname)) == 0) { error << string_compose(_("IO: cannot register input port %1"), portname) << endmsg; @@ -353,7 +354,7 @@ IO::add_port (string destination, void* src, DataType type) change.before = _ports.count (); _ports.add (our_port); } - + PortCountChanged (n_ports()); /* EMIT SIGNAL */ change.type = IOChange::ConfigurationChanged; change.after = _ports.count (); @@ -367,6 +368,7 @@ IO::add_port (string destination, void* src, DataType type) } } + apply_pretty_name (); setup_bundle (); _session.set_dirty (); @@ -395,7 +397,7 @@ IO::disconnect (void* src) int IO::ensure_ports_locked (ChanCount count, bool clear, bool& changed) { -#ifndef WIN32 +#ifndef PLATFORM_WINDOWS assert (!AudioEngine::instance()->process_lock().trylock()); #endif @@ -468,7 +470,7 @@ IO::ensure_ports_locked (ChanCount count, bool clear, bool& changed) int IO::ensure_ports (ChanCount count, bool clear, void* src) { -#ifndef WIN32 +#ifndef PLATFORM_WINDOWS assert (!AudioEngine::instance()->process_lock().trylock()); #endif @@ -505,7 +507,7 @@ IO::ensure_ports (ChanCount count, bool clear, void* src) int IO::ensure_io (ChanCount count, bool clear, void* src) { -#ifndef WIN32 +#ifndef PLATFORM_WINDOWS assert (!AudioEngine::instance()->process_lock().trylock()); #endif @@ -524,9 +526,8 @@ IO::state (bool /*full_state*/) XMLNode* node = new XMLNode (state_node_name); char buf[64]; string str; - vector::iterator ci; int n; - LocaleGuard lg (X_("POSIX")); + LocaleGuard lg (X_("C")); Glib::Threads::Mutex::Lock lm (io_lock); node->add_property("name", _name); @@ -535,6 +536,10 @@ IO::state (bool /*full_state*/) node->add_property ("direction", enum_2_string (_direction)); node->add_property ("default-type", _default_type.to_string()); + if (!_pretty_name_prefix.empty ()) { + node->add_property("pretty-name", _pretty_name_prefix); + } + for (std::vector::iterator i = _bundles_connected.begin(); i != _bundles_connected.end(); ++i) { XMLNode* n = new XMLNode ("Bundle"); n->add_property ("name", (*i)->bundle->name ()); @@ -550,6 +555,8 @@ IO::state (bool /*full_state*/) pnode->add_property (X_("name"), i->name()); if (i->get_connections (connections)) { + vector::const_iterator ci; + std::sort (connections.begin(), connections.end()); for (n = 0, ci = connections.begin(); ci != connections.end(); ++ci, ++n) { @@ -572,7 +579,7 @@ IO::state (bool /*full_state*/) snprintf (buf, sizeof (buf), "%" PRId64, _user_latency); node->add_property (X_("user-latency"), buf); - + return *node; } @@ -587,7 +594,7 @@ IO::set_state (const XMLNode& node, int version) const XMLProperty* prop; XMLNodeConstIterator iter; - LocaleGuard lg (X_("POSIX")); + LocaleGuard lg (X_("C")); /* force use of non-localized representation of decimal point, since we use it a lot in XML files and so forth. @@ -617,6 +624,11 @@ IO::set_state (const XMLNode& node, int version) return -1; } + // after create_ports, updates names + if ((prop = node.property ("pretty-name")) != 0) { + set_pretty_name (prop->value()); + } + if (connecting_legal) { if (make_connections (node, version, false)) { @@ -643,7 +655,7 @@ IO::set_state_2X (const XMLNode& node, int version, bool in) { const XMLProperty* prop; XMLNodeConstIterator iter; - LocaleGuard lg (X_("POSIX")); + LocaleGuard lg (X_("C")); /* force use of non-localized representation of decimal point, since we use it a lot in XML files and so forth. @@ -691,13 +703,16 @@ IO::set_state_2X (const XMLNode& node, int version, bool in) int IO::connecting_became_legal () { - int ret; + int ret = 0; assert (pending_state_node); connection_legal_c.disconnect (); - ret = make_connections (*pending_state_node, pending_state_node_version, pending_state_node_in); + // it's not required for TracksLive, as long as TracksLive's session does all the connections when it's being loaded + if (!Profile->get_trx() ) { + ret = make_connections (*pending_state_node, pending_state_node_version, pending_state_node_in); + } delete pending_state_node; pending_state_node = 0; @@ -853,6 +868,7 @@ IO::get_port_counts (const XMLNode& node, int version, ChanCount& n, boost::shar for (iter = node.children().begin(); iter != node.children().end(); ++iter) { if ((*iter)->name() == X_("Bundle")) { + prop = (*iter)->property ("name"); if ((c = find_possible_bundle (prop->value())) != 0) { n = ChanCount::max (n, c->nchannels()); return 0; @@ -976,9 +992,9 @@ IO::prepare_for_reset (XMLNode& node, const std::string& name) for (XMLNodeIterator i = children.begin(); i != children.end(); ++i) { if ((*i)->name() == "Port") { - + prop = (*i)->property (X_("name")); - + if (prop) { string new_name; string old = prop->value(); @@ -986,10 +1002,10 @@ IO::prepare_for_reset (XMLNode& node, const std::string& name) if (slash != string::npos) { /* port name is of form: / */ - + new_name = name; new_name += old.substr (old.find ('/')); - + prop->set_value (new_name); } } @@ -1038,7 +1054,8 @@ IO::make_connections_2X (const XMLNode& node, int /*version*/, bool in) if (p != string::npos) { ports[x].replace (p, 4, "/audio_out"); } - nth(i)->connect (ports[x]); + if (NULL != nth(i).get()) + nth(i)->connect (ports[x]); } } @@ -1080,7 +1097,8 @@ IO::make_connections_2X (const XMLNode& node, int /*version*/, bool in) if (p != string::npos) { ports[x].replace (p, 3, "/audio_in"); } - nth(i)->connect (ports[x]); + if (NULL != nth(i).get()) + nth(i)->connect (ports[x]); } } @@ -1096,7 +1114,6 @@ int IO::set_ports (const string& str) { vector ports; - int i; int n; uint32_t nports; @@ -1113,14 +1130,10 @@ IO::set_ports (const string& str) } } - string::size_type start, end, ostart; - - ostart = 0; - start = 0; - end = 0; - i = 0; - - while ((start = str.find_first_of ('{', ostart)) != string::npos) { + string::size_type start = 0; + string::size_type end = 0; + string::size_type ostart = 0; + for (int i = 0; (start = str.find_first_of ('{', ostart)) != string::npos; ++i) { start += 1; if ((end = str.find_first_of ('}', start)) == string::npos) { @@ -1141,7 +1154,6 @@ IO::set_ports (const string& str) } ostart = end+1; - i++; } return 0; @@ -1156,7 +1168,6 @@ IO::parse_io_string (const string& str, vector& ports) return 0; } - pos = 0; opos = 0; ports.clear (); @@ -1178,7 +1189,6 @@ IO::parse_gain_string (const string& str, vector& ports) { string::size_type pos, opos; - pos = 0; opos = 0; ports.clear (); @@ -1220,6 +1230,31 @@ IO::set_name (const string& requested_name) return r; } +void +IO::set_pretty_name (const std::string& str) +{ + if (_pretty_name_prefix == str) { + return; + } + _pretty_name_prefix = str; + apply_pretty_name (); +} + +void +IO::apply_pretty_name () +{ + uint32_t pn = 1; + if (_pretty_name_prefix.empty ()) { + return; + } + for (PortSet::iterator i = _ports.begin (); i != _ports.end(); ++i, ++pn) { + (*i)->set_pretty_name (string_compose (("%1/%2 %3"), + _pretty_name_prefix, + _direction == Output ? _("Out") : _("In"), + pn)); + } +} + framecnt_t IO::latency () const { @@ -1343,7 +1378,7 @@ IO::bundle_changed (Bundle::Change /*c*/) string IO::build_legal_port_name (DataType type) { - const int name_size = jack_port_name_size(); + const int name_size = AudioEngine::instance()->port_name_size(); int limit; string suffix; @@ -1377,22 +1412,22 @@ IO::build_legal_port_name (DataType type) // allow up to 4 digits for the output port number, plus the slash, suffix and extra space - limit = name_size - _session.engine().client_name().length() - (suffix.length() + 5); + limit = name_size - AudioEngine::instance()->my_name().length() - (suffix.length() + 5); - char buf1[name_size+1]; - char buf2[name_size+1]; + std::vector buf1(name_size+1); + std::vector buf2(name_size+1); /* colons are illegal in port names, so fix that */ string nom = _name.val(); replace_all (nom, ":", ";"); - snprintf (buf1, name_size+1, ("%.*s/%s"), limit, nom.c_str(), suffix.c_str()); + snprintf (&buf1[0], name_size+1, ("%.*s/%s"), limit, nom.c_str(), suffix.c_str()); - int port_number = find_port_hole (buf1); - snprintf (buf2, name_size+1, "%s %d", buf1, port_number); + int port_number = find_port_hole (&buf1[0]); + snprintf (&buf2[0], name_size+1, "%s %d", &buf1[0], port_number); - return string (buf2); + return string (&buf2[0]); } int32_t @@ -1410,13 +1445,13 @@ IO::find_port_hole (const char* base) */ for (n = 1; n < 9999; ++n) { - char buf[jack_port_name_size()]; + std::vector buf (AudioEngine::instance()->port_name_size()); PortSet::iterator i = _ports.begin(); - snprintf (buf, jack_port_name_size(), _("%s %u"), base, n); + snprintf (&buf[0], buf.size()+1, _("%s %u"), base, n); for ( ; i != _ports.end(); ++i) { - if (i->name() == buf) { + if (string(i->name()) == string(&buf[0])) { break; } } @@ -1610,8 +1645,10 @@ IO::connected_to (boost::shared_ptr other) const for (i = 0; i < no; ++i) { for (j = 0; j < ni; ++j) { - if (nth(i)->connected_to (other->nth(j)->name())) { - return true; + if ((NULL != nth(i).get()) && (NULL != other->nth(j).get())) { + if (nth(i)->connected_to (other->nth(j)->name())) { + return true; + } } } } @@ -1644,7 +1681,7 @@ IO::process_input (boost::shared_ptr proc, framepos_t start_frame, fr return; } - _buffers.get_jack_port_addresses (_ports, nframes); + _buffers.get_backend_port_addresses (_ports, nframes); if (proc) { proc->run (_buffers, start_frame, end_frame, nframes, true); } @@ -1672,7 +1709,7 @@ IO::collect_input (BufferSet& bufs, pframes_t nframes, ChanCount offset) } for ( ; i != _ports.end(*t); ++i, ++b) { - Buffer& bb (i->get_buffer (nframes)); + const Buffer& bb (i->get_buffer (nframes)); b->read_from (bb, nframes); } }