void
IO::disconnect_check (boost::shared_ptr<Port> a, boost::shared_ptr<Port> b)
{
+ if (_session.state_of_the_state () & Session::Deletion) {
+ return;
+ }
/* this could be called from within our own ::disconnect() method(s)
or from somewhere that operates directly on a port. so, we don't
know for sure if we can take this lock or not. if we fail,
}
}
+ apply_pretty_name ();
setup_bundle ();
_session.set_dirty ();
char buf[64];
string str;
int n;
- LocaleGuard lg (X_("C"));
+ LocaleGuard lg;
Glib::Threads::Mutex::Lock lm (io_lock);
node->add_property("name", _name);
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<UserBundleInfo*>::iterator i = _bundles_connected.begin(); i != _bundles_connected.end(); ++i) {
XMLNode* n = new XMLNode ("Bundle");
n->add_property ("name", (*i)->bundle->name ());
*/
assert (version >= 3000);
- const XMLProperty* prop;
+ XMLProperty const * prop;
XMLNodeConstIterator iter;
- LocaleGuard lg (X_("C"));
+ LocaleGuard lg;
/* force use of non-localized representation of decimal point,
since we use it a lot in XML files and so forth.
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)) {
int
IO::set_state_2X (const XMLNode& node, int version, bool in)
{
- const XMLProperty* prop;
+ XMLProperty const * prop;
XMLNodeConstIterator iter;
- LocaleGuard lg (X_("C"));
+ LocaleGuard lg;
/* force use of non-localized representation of decimal point,
since we use it a lot in XML files and so forth.
return make_connections_2X (node, version, in);
}
- const XMLProperty* prop;
+ XMLProperty const * prop;
for (XMLNodeConstIterator i = node.children().begin(); i != node.children().end(); ++i) {
the name of the thing we're applying it to.
*/
- XMLProperty* prop;
+ XMLProperty * prop;
XMLNodeList children = node.children();
for (XMLNodeIterator i = children.begin(); i != children.end(); ++i) {
int
IO::make_connections_2X (const XMLNode& node, int /*version*/, bool in)
{
- const XMLProperty* prop;
+ XMLProperty const * prop;
/* XXX: bundles ("connections" as was) */
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
{
case 2:
return c == 0 ? _("L") : _("R");
default:
- snprintf (buf, sizeof(buf), _("%d"), (c + 1));
+ snprintf (buf, sizeof(buf), "%d", (c + 1));
return buf;
}
} else {
- snprintf (buf, sizeof(buf), _("%d"), (c + 1));
+ snprintf (buf, sizeof(buf), "%d", (c + 1));
return buf;
}
string
IO::name_from_state (const XMLNode& node)
{
- const XMLProperty* prop;
+ XMLProperty const * prop;
if ((prop = node.property ("name")) != 0) {
return prop->value();
* Caller must hold process lock.
*/
void
-IO::process_input (boost::shared_ptr<Processor> proc, framepos_t start_frame, framepos_t end_frame, pframes_t nframes)
+IO::process_input (boost::shared_ptr<Processor> proc, framepos_t start_frame, framepos_t end_frame, double speed, pframes_t nframes)
{
/* don't read the data into new buffers - just use the port buffers directly */
_buffers.get_backend_port_addresses (_ports, nframes);
if (proc) {
- proc->run (_buffers, start_frame, end_frame, nframes, true);
+ proc->run (_buffers, start_frame, end_frame, speed, nframes, true);
}
}
void
IO::copy_to_outputs (BufferSet& bufs, DataType type, pframes_t nframes, framecnt_t offset)
{
- // Copy any buffers 1:1 to outputs
-
PortSet::iterator o = _ports.begin(type);
BufferSet::iterator i = bufs.begin(type);
BufferSet::iterator prev = i;
+ assert(i != bufs.end(type)); // or second loop will crash
+
+ // Copy any buffers 1:1 to outputs
+
while (i != bufs.end(type) && o != _ports.end (type)) {
Buffer& port_buffer (o->get_buffer (nframes));
port_buffer.read_from (*i, nframes, offset);