X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fio.cc;h=90db95ad5948b8265d597cc275af131743e9678d;hb=4e5423b3487771220cdca4c2b1a79c4d74b6afa5;hp=2dcc9d53a7f71c9510fb7de98d6f99eeaa8cd5b3;hpb=18011482bb1c8c0b66a4dbc50f46f6bc011f650a;p=ardour.git diff --git a/libs/ardour/io.cc b/libs/ardour/io.cc index 2dcc9d53a7..90db95ad59 100644 --- a/libs/ardour/io.cc +++ b/libs/ardour/io.cc @@ -31,6 +31,7 @@ #include "pbd/replace_all.h" #include "pbd/unknown_type.h" #include "pbd/enumwriter.h" +#include "pbd/locale_guard.h" #include "pbd/types_convert.h" #include "ardour/audioengine.h" @@ -134,67 +135,25 @@ IO::increment_port_buffer_offset (pframes_t offset) { /* io_lock, not taken: function must be called from Session::process() calltree */ - if (_direction == Output) { - for (PortSet::iterator i = _ports.begin(); i != _ports.end(); ++i) { - i->increment_port_buffer_offset (offset); - } - } + if (_direction == Output) { + for (PortSet::iterator i = _ports.begin(); i != _ports.end(); ++i) { + i->increment_port_buffer_offset (offset); + } + } } void -IO::silence (framecnt_t nframes) +IO::silence (samplecnt_t nframes) { /* io_lock, not taken: function must be called from Session::process() calltree */ for (PortSet::iterator i = _ports.begin(); i != _ports.end(); ++i) { - i->get_buffer(nframes).silence (nframes); - } -} - -/** Set _bundles_connected to those bundles that are connected such that every - * port on every bundle channel x is connected to port x in _ports. - */ -void -IO::check_bundles_connected () -{ - std::vector new_list; - - for (std::vector::iterator i = _bundles_connected.begin(); i != _bundles_connected.end(); ++i) { - - uint32_t const N = (*i)->bundle->nchannels().n_total(); - - if (_ports.num_ports() < N) { - continue; - } - - bool ok = true; - - for (uint32_t j = 0; j < N; ++j) { - /* Every port on bundle channel j must be connected to our input j */ - Bundle::PortList const pl = (*i)->bundle->channel_ports (j); - for (uint32_t k = 0; k < pl.size(); ++k) { - if (_ports.port(j)->connected_to (pl[k]) == false) { - ok = false; - break; - } - } - - if (ok == false) { - break; - } - } - - if (ok) { - new_list.push_back (*i); - } else { - delete *i; + if (i->port_handle ()) { + i->get_buffer(nframes).silence (nframes); } } - - _bundles_connected = new_list; } - int IO::disconnect (boost::shared_ptr our_port, string other_port, void* src) { @@ -202,26 +161,24 @@ IO::disconnect (boost::shared_ptr our_port, string other_port, void* src) return 0; } - { - Glib::Threads::Mutex::Lock lm (io_lock); - - /* check that our_port is really one of ours */ + { + Glib::Threads::Mutex::Lock lm (io_lock); - if ( ! _ports.contains(our_port)) { - return -1; - } + /* check that our_port is really one of ours */ - /* disconnect it from the source */ + if ( ! _ports.contains(our_port)) { + return -1; + } - if (our_port->disconnect (other_port)) { - error << string_compose(_("IO: cannot disconnect port %1 from %2"), our_port->name(), other_port) << endmsg; - return -1; - } + /* disconnect it from the source */ - check_bundles_connected (); - } + if (our_port->disconnect (other_port)) { + error << string_compose(_("IO: cannot disconnect port %1 from %2"), our_port->name(), other_port) << endmsg; + return -1; + } + } - changed (IOChange (IOChange::ConnectionsChanged), src); /* EMIT SIGNAL */ + changed (IOChange (IOChange::ConnectionsChanged), src); /* EMIT SIGNAL */ _session.set_dirty (); @@ -285,7 +242,6 @@ IO::remove_port (boost::shared_ptr port, void* src) } _session.engine().unregister_port (port); - check_bundles_connected (); } } @@ -392,8 +348,6 @@ IO::disconnect (void* src) for (PortSet::iterator i = _ports.begin(); i != _ports.end(); ++i) { i->disconnect_all (); } - - check_bundles_connected (); } changed (IOChange (IOChange::ConnectionsChanged), src); /* EMIT SIGNAL */ @@ -479,7 +433,6 @@ IO::ensure_ports_locked (ChanCount count, bool clear, bool& changed) } if (changed) { - check_bundles_connected (); PortCountChanged (n_ports()); /* EMIT SIGNAL */ _session.set_dirty (); } @@ -553,7 +506,6 @@ IO::state (bool /*full_state*/) { XMLNode* node = new XMLNode (state_node_name); int n; - LocaleGuard lg; Glib::Threads::Mutex::Lock lm (io_lock); node->set_property ("name", name()); @@ -565,12 +517,6 @@ IO::state (bool /*full_state*/) node->set_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->set_property ("name", (*i)->bundle->name ()); - node->add_child_nocopy (*n); - } - for (PortSet::iterator i = _ports.begin(); i != _ports.end(); ++i) { vector connections; @@ -616,9 +562,6 @@ IO::set_state (const XMLNode& node, int version) */ assert (version >= 3000); - XMLNodeConstIterator iter; - LocaleGuard lg; - /* force use of non-localized representation of decimal point, since we use it a lot in XML files and so forth. */ @@ -731,10 +674,10 @@ IO::connecting_became_legal () connection_legal_c.disconnect (); - // 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); - } + // 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; @@ -983,7 +926,7 @@ IO::make_connections (const XMLNode& node, int version, bool in) } if (prop) { - connect (p, prop->value(), this); + connect (p, prop->value(), this); } } } @@ -1273,11 +1216,11 @@ IO::apply_pretty_name () } } -framecnt_t +samplecnt_t IO::latency () const { - framecnt_t max_latency; - framecnt_t latency; + samplecnt_t max_latency; + samplecnt_t latency; max_latency = 0; @@ -1285,22 +1228,28 @@ IO::latency () const for (PortSet::const_iterator i = _ports.begin(); i != _ports.end(); ++i) { if ((latency = i->private_latency_range (_direction == Output).max) > max_latency) { - DEBUG_TRACE (DEBUG::Latency, string_compose ("port %1 has %2 latency of %3 - use\n", - name(), - ((_direction == Output) ? "PLAYBACK" : "CAPTURE"), - latency)); + DEBUG_TRACE (DEBUG::Latency, string_compose ("port %1 has %2 latency of %3 - use\n", + name(), + ((_direction == Output) ? "PLAYBACK" : "CAPTURE"), + latency)); max_latency = latency; } } - DEBUG_TRACE (DEBUG::Latency, string_compose ("%1: max %4 latency from %2 ports = %3\n", - name(), _ports.num_ports(), max_latency, - ((_direction == Output) ? "PLAYBACK" : "CAPTURE"))); + DEBUG_TRACE (DEBUG::Latency, string_compose ("%1: max %4 latency from %2 ports = %3\n", + name(), _ports.num_ports(), max_latency, + ((_direction == Output) ? "PLAYBACK" : "CAPTURE"))); return max_latency; } int -IO::connect_ports_to_bundle (boost::shared_ptr c, bool exclusive, void* src) +IO::connect_ports_to_bundle (boost::shared_ptr c, bool exclusive, void* src) { + return connect_ports_to_bundle(c, exclusive, false, src); +} + +int +IO::connect_ports_to_bundle (boost::shared_ptr c, bool exclusive, + bool allow_partial, void* src) { BLOCK_PROCESS_CALLBACK (); @@ -1313,24 +1262,8 @@ IO::connect_ports_to_bundle (boost::shared_ptr c, bool exclusive, void* } } - c->connect (_bundle, _session.engine()); - - /* If this is a UserBundle, make a note of what we've done */ + c->connect (_bundle, _session.engine(), allow_partial); - boost::shared_ptr ub = boost::dynamic_pointer_cast (c); - if (ub) { - - /* See if we already know about this one */ - std::vector::iterator i = _bundles_connected.begin(); - while (i != _bundles_connected.end() && (*i)->bundle != ub) { - ++i; - } - - if (i == _bundles_connected.end()) { - /* We don't, so make a note */ - _bundles_connected.push_back (new UserBundleInfo (this, ub)); - } - } } changed (IOChange (IOChange::ConnectionsChanged), src); /* EMIT SIGNAL */ @@ -1349,19 +1282,6 @@ IO::disconnect_ports_from_bundle (boost::shared_ptr c, void* src) /* If this is a UserBundle, make a note of what we've done */ - boost::shared_ptr ub = boost::dynamic_pointer_cast (c); - if (ub) { - - std::vector::iterator i = _bundles_connected.begin(); - while (i != _bundles_connected.end() && (*i)->bundle != ub) { - ++i; - } - - if (i != _bundles_connected.end()) { - delete *i; - _bundles_connected.erase (i); - } - } } changed (IOChange (IOChange::ConnectionsChanged), src); /* EMIT SIGNAL */ @@ -1498,11 +1418,10 @@ IO::midi(uint32_t n) const /** * Setup a bundle that describe our inputs or outputs. Also creates the bundle if necessary. */ - void IO::setup_bundle () { - char buf[32]; + char buf[32]; if (!_bundle) { _bundle.reset (new Bundle (_direction == Input)); @@ -1517,7 +1436,7 @@ IO::setup_bundle () } else { snprintf(buf, sizeof (buf), _("%s out"), _name.val().c_str()); } - _bundle->set_name (buf); + _bundle->set_name (buf); int c = 0; for (DataType::iterator i = DataType::begin(); i != DataType::end(); ++i) { @@ -1540,11 +1459,6 @@ IO::bundles_connected () { BundleList bundles; - /* User bundles */ - for (std::vector::iterator i = _bundles_connected.begin(); i != _bundles_connected.end(); ++i) { - bundles.push_back ((*i)->bundle); - } - /* Session bundles */ boost::shared_ptr b = _session.bundles (); for (ARDOUR::BundleList::iterator i = b->begin(); i != b->end(); ++i) { @@ -1637,22 +1551,22 @@ IO::set_name_in_state (XMLNode& node, const string& new_name) bool IO::connected () const { - /* do we have any connections at all? */ + /* do we have any connections at all? */ - for (PortSet::const_iterator p = _ports.begin(); p != _ports.end(); ++p) { - if (p->connected()) { - return true; - } - } + for (PortSet::const_iterator p = _ports.begin(); p != _ports.end(); ++p) { + if (p->connected()) { + return true; + } + } - return false; + return false; } bool IO::connected_to (boost::shared_ptr other) const { if (!other) { - return connected (); + return connected (); } assert (_direction != other->direction()); @@ -1690,7 +1604,7 @@ IO::connected_to (const string& str) const * Caller must hold process lock. */ void -IO::process_input (boost::shared_ptr proc, framepos_t start_frame, framepos_t end_frame, double speed, pframes_t nframes) +IO::process_input (boost::shared_ptr proc, samplepos_t start_sample, samplepos_t end_sample, double speed, pframes_t nframes) { /* don't read the data into new buffers - just use the port buffers directly */ @@ -1701,7 +1615,7 @@ IO::process_input (boost::shared_ptr proc, framepos_t start_frame, fr _buffers.get_backend_port_addresses (_ports, nframes); if (proc) { - proc->run (_buffers, start_frame, end_frame, speed, nframes, true); + proc->run (_buffers, start_sample, end_sample, speed, nframes, true); } } @@ -1734,7 +1648,7 @@ IO::collect_input (BufferSet& bufs, pframes_t nframes, ChanCount offset) } void -IO::copy_to_outputs (BufferSet& bufs, DataType type, pframes_t nframes, framecnt_t offset) +IO::copy_to_outputs (BufferSet& bufs, DataType type, pframes_t nframes, samplecnt_t offset) { PortSet::iterator o = _ports.begin(type); BufferSet::iterator i = bufs.begin(type); @@ -1780,12 +1694,12 @@ bool IO::physically_connected () const { for (PortSet::const_iterator i = _ports.begin(); i != _ports.end(); ++i) { - if (i->physically_connected()) { - return true; - } - } + if (i->physically_connected()) { + return true; + } + } - return false; + return false; } bool