summaryrefslogtreecommitdiff
path: root/libs/ardour/jack_port.cc
diff options
context:
space:
mode:
Diffstat (limited to 'libs/ardour/jack_port.cc')
-rw-r--r--libs/ardour/jack_port.cc89
1 files changed, 79 insertions, 10 deletions
diff --git a/libs/ardour/jack_port.cc b/libs/ardour/jack_port.cc
index c7d737ca0f..c4705816e9 100644
--- a/libs/ardour/jack_port.cc
+++ b/libs/ardour/jack_port.cc
@@ -28,10 +28,8 @@ using namespace ARDOUR;
using namespace PBD;
using namespace std;
-AudioEngine* JackPort::engine = 0;
-
JackPort::JackPort (const std::string& name, DataType type, Flags flgs)
- : Port (type, flgs), _port (0)
+ : Port (name, flgs), _port (0)
{
_port = jack_port_register (engine->jack(), name.c_str(), type.to_jack_type(), flgs, 0);
@@ -39,6 +37,8 @@ JackPort::JackPort (const std::string& name, DataType type, Flags flgs)
throw failed_constructor();
}
+ _flags = flgs;
+ _type = type;
_name = jack_port_name (_port);
}
@@ -50,7 +50,7 @@ JackPort::~JackPort ()
}
int
-JackPort::set_name (string str)
+JackPort::set_name (const string& str)
{
int ret;
@@ -67,12 +67,6 @@ JackPort::disconnect ()
return jack_port_disconnect (engine->jack(), _port);
}
-void
-JackPort::set_engine (AudioEngine* e)
-{
- engine = e;
-}
-
nframes_t
JackPort::total_latency () const
{
@@ -107,4 +101,79 @@ JackPort::recompute_total_latency () const
#endif
}
+int
+JackPort::reconnect ()
+{
+ /* caller must hold process lock; intended to be used only after reestablish() */
+
+ for (set<string>::iterator i = _named_connections.begin(); i != _named_connections.end(); ++i) {
+ if (connect (*i)) {
+ return -1;
+ }
+ }
+
+ return 0;
+}
+
+int
+JackPort::connect (const std::string& other)
+{
+ int ret;
+
+ if (_flags & IsOutput) {
+ /* this is the source */
+ ret = jack_connect (engine->jack(), _name.c_str(), other.c_str());
+ } else {
+ ret = jack_connect (engine->jack(), other.c_str(), _name.c_str());
+ }
+
+ if (ret == 0) {
+ _named_connections.insert (other);
+ }
+
+ return ret;
+}
+
+int
+JackPort::disconnect (const std::string& other)
+{
+ int ret;
+
+ if (_flags & IsInput) {
+ ret = jack_disconnect (engine->jack(), _name.c_str(), other.c_str());
+ } else {
+ ret = jack_disconnect (engine->jack(), other.c_str(), _name.c_str());
+ }
+
+ set<string>::iterator i = _named_connections.find (other);
+
+ if (i != _named_connections.end()) {
+ _named_connections.erase (i);
+ }
+
+ return ret;
+}
+
+int
+JackPort::disconnect_all ()
+{
+ _named_connections.clear ();
+ return jack_port_disconnect (engine->jack(), _port);
+}
+
+int
+JackPort::get_connections (vector<string>& names) const
+{
+ const char** cstrs = jack_port_get_connections (_port);
+ int i;
+
+ if (!cstrs) {
+ return 0;
+ }
+
+ for (i = 0; cstrs[i]; ++i) {
+ names.push_back (string (cstrs[i]));
+ }
+ return i;
+}