} 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 */
}
}
}
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) {
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) {
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) {
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;
draw_association_indicator (cr, tx, ty);
break;
- case PortMatrixNode::UNKNOWN:
- draw_unknown_indicator (cr, tx, ty);
- break;
-
case PortMatrixNode::NOT_ASSOCIATED:
break;
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
{
}
break;
- case PortMatrixNode::UNKNOWN:
- have_unknown = true;
- break;
-
case PortMatrixNode::NOT_ASSOCIATED:
if (i == j) {
have_diagonal_not_association = true;
}
}
- 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;
}
- return PortMatrixNode::UNKNOWN;
+ /* NOTREACHED */
+ return PortMatrixNode::NOT_ASSOCIATED;
}
void
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);
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
};
};