Allow ardour to manipulate connections between two JACK ports that don't belong to us.

git-svn-id: svn://localhost/ardour2/branches/3.0@6100 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
Carl Hetherington 2009-11-16 22:32:58 +00:00
parent ce8bd8948e
commit 95e4f7558b
5 changed files with 36 additions and 37 deletions

View file

@ -69,9 +69,14 @@ GlobalPortMatrix::set_state (ARDOUR::BundleChannel c[2], bool s)
} else {
q->disconnect (*i);
}
} else {
/* two non-Ardour ports */
if (s) {
jack_connect (_session.engine().jack (), j->c_str(), i->c_str());
} else {
jack_disconnect (_session.engine().jack (), j->c_str(), i->c_str());
}
}
/* we don't handle connections between two non-Ardour ports */
}
}
}
@ -84,7 +89,7 @@ GlobalPortMatrix::get_state (ARDOUR::BundleChannel c[2]) const
if (in_ports.empty() || out_ports.empty()) {
/* we're looking at a bundle with no parts associated with this channel,
so nothing to connect */
return PortMatrixNode::UNKNOWN;
return PortMatrixNode::NOT_ASSOCIATED;
}
for (ARDOUR::Bundle::PortList::const_iterator i = in_ports.begin(); i != in_ports.end(); ++i) {
@ -93,9 +98,31 @@ GlobalPortMatrix::get_state (ARDOUR::BundleChannel c[2]) const
ARDOUR::Port* p = _session.engine().get_port_by_name (*i);
ARDOUR::Port* q = _session.engine().get_port_by_name (*j);
/* we don't know the state of connections between two non-Ardour ports */
if (!p && !q) {
return PortMatrixNode::UNKNOWN;
/* two non-Ardour ports; things are slightly more involved */
/* XXX: is this the easiest way to do this? */
/* XXX: isn't this very inefficient? */
jack_client_t* jack = _session.engine().jack ();
jack_port_t* jp = jack_port_by_name (jack, i->c_str());
if (jp == 0) {
return PortMatrixNode::NOT_ASSOCIATED;
}
char const ** c = jack_port_get_all_connections (jack, jp);
char const ** p = c;
while (p && *p != 0) {
if (strcmp (*p, j->c_str()) == 0) {
free (c);
return PortMatrixNode::ASSOCIATED;
}
++p;
}
free (c);
return PortMatrixNode::NOT_ASSOCIATED;
}
if (p && p->connected_to (*j) == false) {

View file

@ -113,7 +113,7 @@ IOSelector::get_state (ARDOUR::BundleChannel c[2]) const
if (our_ports.empty() || other_ports.empty()) {
/* we're looking at a bundle with no parts associated with this channel,
so nothing to connect */
return PortMatrixNode::UNKNOWN;
return PortMatrixNode::NOT_ASSOCIATED;
}
for (ARDOUR::Bundle::PortList::const_iterator i = our_ports.begin(); i != our_ports.end(); ++i) {

View file

@ -166,9 +166,6 @@ PortMatrixGrid::render_group_pair (cairo_t* cr, boost::shared_ptr<const PortGrou
ARDOUR::BundleChannel (j->bundle, 0)
));
switch (s) {
case PortMatrixNode::UNKNOWN:
draw_unknown_indicator (cr, bx, by);
break;
case PortMatrixNode::ASSOCIATED:
draw_association_indicator (cr, bx, by);
break;
@ -210,10 +207,6 @@ PortMatrixGrid::render_group_pair (cairo_t* cr, boost::shared_ptr<const PortGrou
draw_association_indicator (cr, tx, ty);
break;
case PortMatrixNode::UNKNOWN:
draw_unknown_indicator (cr, tx, ty);
break;
case PortMatrixNode::NOT_ASSOCIATED:
break;
@ -266,20 +259,6 @@ PortMatrixGrid::draw_empty_square (cairo_t* cr, uint32_t x, uint32_t y)
cairo_fill (cr);
}
void
PortMatrixGrid::draw_unknown_indicator (cairo_t* cr, uint32_t x, uint32_t y)
{
set_source_rgba (cr, unknown_colour(), 0.5);
cairo_rectangle (
cr,
x + thick_grid_line_width(),
y + thick_grid_line_width(),
grid_spacing() - 2 * thick_grid_line_width(),
grid_spacing() - 2 * thick_grid_line_width()
);
cairo_fill (cr);
}
PortMatrixNode
PortMatrixGrid::position_to_node (uint32_t x, uint32_t y) const
{
@ -340,10 +319,6 @@ PortMatrixGrid::get_association (PortMatrixNode node) const
}
break;
case PortMatrixNode::UNKNOWN:
have_unknown = true;
break;
case PortMatrixNode::NOT_ASSOCIATED:
if (i == j) {
have_diagonal_not_association = true;
@ -356,9 +331,7 @@ PortMatrixGrid::get_association (PortMatrixNode node) const
}
}
if (have_unknown) {
return PortMatrixNode::UNKNOWN;
} else if (have_diagonal_association && !have_off_diagonal_association && !have_diagonal_not_association) {
if (have_diagonal_association && !have_off_diagonal_association && !have_diagonal_not_association) {
return PortMatrixNode::ASSOCIATED;
} else if (!have_diagonal_association && !have_off_diagonal_association) {
return PortMatrixNode::NOT_ASSOCIATED;
@ -375,7 +348,8 @@ PortMatrixGrid::get_association (PortMatrixNode node) const
}
return PortMatrixNode::UNKNOWN;
/* NOTREACHED */
return PortMatrixNode::NOT_ASSOCIATED;
}
void

View file

@ -62,7 +62,6 @@ private:
void queue_draw_for (PortMatrixNode const &);
void draw_association_indicator (cairo_t *, uint32_t, uint32_t, double p = 1);
void draw_empty_square (cairo_t *, uint32_t, uint32_t);
void draw_unknown_indicator (cairo_t *, uint32_t, uint32_t);
std::list<PortMatrixNode> nodes_on_line (int, int, int, int) const;
PortMatrixNode::State get_association (PortMatrixNode) const;
void set_association (PortMatrixNode, bool);

View file

@ -40,7 +40,6 @@ struct PortMatrixNode
enum State {
ASSOCIATED, ///< the ports are associated
NOT_ASSOCIATED, ///< the ports are not associated
UNKNOWN, ///< we don't know anything about these two ports' relationship
PARTIAL ///< used when we are examining bundles; the bundles are partially associated
};
};