summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Hetherington <carl@carlh.net>2009-11-16 22:32:58 +0000
committerCarl Hetherington <carl@carlh.net>2009-11-16 22:32:58 +0000
commit95e4f7558b6d9616ef2180682a8c203c2226261b (patch)
tree09d119eba3f136c446089c70bd8b428cdebfc380
parentce8bd8948e794377697fdc9e0f3674cf7593c725 (diff)
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
-rw-r--r--gtk2_ardour/global_port_matrix.cc37
-rw-r--r--gtk2_ardour/io_selector.cc2
-rw-r--r--gtk2_ardour/port_matrix_grid.cc32
-rw-r--r--gtk2_ardour/port_matrix_grid.h1
-rw-r--r--gtk2_ardour/port_matrix_types.h1
5 files changed, 36 insertions, 37 deletions
diff --git a/gtk2_ardour/global_port_matrix.cc b/gtk2_ardour/global_port_matrix.cc
index 0f107452a5..c303e3ce72 100644
--- a/gtk2_ardour/global_port_matrix.cc
+++ b/gtk2_ardour/global_port_matrix.cc
@@ -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) {
diff --git a/gtk2_ardour/io_selector.cc b/gtk2_ardour/io_selector.cc
index 68cd1c8408..a689fc666e 100644
--- a/gtk2_ardour/io_selector.cc
+++ b/gtk2_ardour/io_selector.cc
@@ -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) {
diff --git a/gtk2_ardour/port_matrix_grid.cc b/gtk2_ardour/port_matrix_grid.cc
index 543efa91ca..b6be4165a9 100644
--- a/gtk2_ardour/port_matrix_grid.cc
+++ b/gtk2_ardour/port_matrix_grid.cc
@@ -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
diff --git a/gtk2_ardour/port_matrix_grid.h b/gtk2_ardour/port_matrix_grid.h
index 7172b82699..be4083c59a 100644
--- a/gtk2_ardour/port_matrix_grid.h
+++ b/gtk2_ardour/port_matrix_grid.h
@@ -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);
diff --git a/gtk2_ardour/port_matrix_types.h b/gtk2_ardour/port_matrix_types.h
index f36821cd90..15c40713b0 100644
--- a/gtk2_ardour/port_matrix_types.h
+++ b/gtk2_ardour/port_matrix_types.h
@@ -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
};
};