summaryrefslogtreecommitdiff
path: root/libs/ardour/port.cc
diff options
context:
space:
mode:
authorCarl Hetherington <carl@carlh.net>2009-02-11 00:58:24 +0000
committerCarl Hetherington <carl@carlh.net>2009-02-11 00:58:24 +0000
commitd469cc3e3a536fceedbfc41e52ad3d7d178f7b0d (patch)
tree5cee0af05edc00f5b19116727b1aebfd3bc52719 /libs/ardour/port.cc
parentfe4e98a72987f197239a025413bfddb4c29b8ba8 (diff)
Remove internal ports.
git-svn-id: svn://localhost/ardour2/branches/3.0@4525 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/ardour/port.cc')
-rw-r--r--libs/ardour/port.cc302
1 files changed, 48 insertions, 254 deletions
diff --git a/libs/ardour/port.cc b/libs/ardour/port.cc
index 74de1922fe..676a6a0e4f 100644
--- a/libs/ardour/port.cc
+++ b/libs/ardour/port.cc
@@ -31,10 +31,8 @@ using namespace ARDOUR;
AudioEngine* Port::_engine = 0;
/** @param n Port short name */
-Port::Port (std::string const & n, DataType t, Flags f, bool e)
- : _jack_port (0)
- , _last_monitor (false)
- , _latency (0)
+Port::Port (std::string const & n, DataType t, Flags f)
+ : _last_monitor (false)
, _name (n)
, _flags (f)
{
@@ -46,91 +44,29 @@ Port::Port (std::string const & n, DataType t, Flags f, bool e)
assert (_name.find_first_of (':') == std::string::npos);
- if (e) {
- try {
- cerr << "NEW PORT " << _name << " ext = " << e << endl;
- do_make_external (t);
- }
- catch (...) {
- throw failed_constructor ();
- }
+ if ((_jack_port = jack_port_register (_engine->jack (), _name.c_str (), t.to_jack_type (), _flags, 0)) == 0) {
+ throw failed_constructor ();
}
}
/** Port destructor */
Port::~Port ()
{
- if (_jack_port) {
- jack_port_unregister (_engine->jack (), _jack_port);
- }
-}
-
-/** Make this port externally visible by setting it up to use a JACK port.
- * @param t Data type, so that we can call this method from the constructor.
- */
-void
-Port::do_make_external (DataType t)
-{
- if (_jack_port) {
- /* already external */
- return;
- }
-
- if ((_jack_port = jack_port_register (_engine->jack (), _name.c_str (), t.to_jack_type (), _flags, 0)) == 0) {
- throw std::runtime_error ("Could not register JACK port");
- }
-}
-
-void
-Port::make_external ()
-{
- do_make_external (type ());
+ jack_port_unregister (_engine->jack (), _jack_port);
}
/** @return true if this port is connected to anything */
bool
Port::connected () const
{
- if (!_connections.empty ()) {
- /* connected to a Port* */
- return true;
- }
-
- if (_jack_port == 0) {
- /* not using a JACK port, so can't be connected to anything else */
- return false;
- }
-
- return (jack_port_connected (_jack_port) != 0);
-}
-
-/** @return true if this port is connected to anything via an external port */
-bool
-Port::externally_connected () const
-{
- if (_jack_port == 0) {
- /* not using a JACK port, so can't be connected to anything else */
- return false;
- }
-
return (jack_port_connected (_jack_port) != 0);
}
int
Port::disconnect_all ()
{
- /* Disconnect from Port* connections */
- for (std::set<Port*>::iterator i = _connections.begin (); i != _connections.end (); ++i) {
- (*i)->_connections.erase (this);
- }
-
- _connections.clear ();
-
- /* And JACK connections */
jack_port_disconnect (_engine->jack(), _jack_port);
- _named_connections.clear ();
-
- check_buffer_status ();
+ _connections.clear ();
return 0;
}
@@ -141,22 +77,7 @@ Port::disconnect_all ()
bool
Port::connected_to (std::string const & o) const
{
- std::string const full = _engine->make_port_name_non_relative (o);
- std::string const shrt = _engine->make_port_name_non_relative (o);
-
- if (_jack_port && jack_port_connected_to (_jack_port, full.c_str ())) {
- /* connected via JACK */
- return true;
- }
-
- for (std::set<Port*>::iterator i = _connections.begin (); i != _connections.end (); ++i) {
- if ((*i)->name () == shrt) {
- /* connected internally */
- return true;
- }
- }
-
- return false;
+ return jack_port_connected_to (_jack_port, _engine->make_port_name_non_relative(o).c_str ());
}
/** @param o Filled in with port full names of ports that we are connected to */
@@ -165,24 +86,14 @@ Port::get_connections (std::vector<std::string> & c) const
{
int n = 0;
- /* JACK connections */
- if (_jack_port) {
- const char** jc = jack_port_get_connections (_jack_port);
- if (jc) {
- for (int i = 0; jc[i]; ++i) {
- c.push_back (jc[i]);
- ++n;
- }
+ const char** jc = jack_port_get_connections (_jack_port);
+ if (jc) {
+ for (int i = 0; jc[i]; ++i) {
+ c.push_back (jc[i]);
+ ++n;
}
}
-
- /* Internal connections */
- for (std::set<Port*>::iterator i = _connections.begin (); i != _connections.end (); ++i) {
- std::string const full = _engine->make_port_name_non_relative ((*i)->name());
- c.push_back (full);
- ++n;
- }
-
+
return n;
}
@@ -192,36 +103,19 @@ Port::connect (std::string const & other)
/* caller must hold process lock */
std::string const other_shrt = _engine->make_port_name_non_relative (other);
-
- Port* p = _engine->get_port_by_name_locked (other_shrt);
-
- int r;
-
- if (p && !p->external ()) {
- /* non-external Ardour port; connect using Port* */
- r = connect (p);
- } else {
- /* connect using name */
-
- /* for this to work, we must be an external port */
- if (!external ()) {
- make_external ();
- }
-
- std::string const this_shrt = _engine->make_port_name_non_relative (_name);
-
- if (sends_output ()) {
- r = jack_connect (_engine->jack (), this_shrt.c_str (), other_shrt.c_str ());
- } else {
- r = jack_connect (_engine->jack (), other_shrt.c_str (), this_shrt.c_str());
- }
+ std::string const this_shrt = _engine->make_port_name_non_relative (_name);
- if (r == 0) {
- _named_connections.insert (other);
- }
+ int r = 0;
+
+ if (sends_output ()) {
+ r = jack_connect (_engine->jack (), this_shrt.c_str (), other_shrt.c_str ());
+ } else {
+ r = jack_connect (_engine->jack (), other_shrt.c_str (), this_shrt.c_str());
+ }
+
+ if (r == 0) {
+ _connections.insert (other);
}
-
- check_buffer_status ();
return r;
}
@@ -232,32 +126,21 @@ Port::disconnect (std::string const & other)
/* caller must hold process lock */
std::string const other_shrt = _engine->make_port_name_non_relative (other);
-
- Port* p = _engine->get_port_by_name_locked (other_shrt);
- int r;
+ std::string const this_shrt = _engine->make_port_name_non_relative (_name);
- if (p && !p->external ()) {
- /* non-external Ardour port; disconnect using Port* */
- r = disconnect (p);
+ int r = 0;
+
+ if (sends_output ()) {
+ r = jack_disconnect (_engine->jack (), this_shrt.c_str (), other_shrt.c_str ());
} else {
- /* disconnect using name */
-
- std::string const this_shrt = _engine->make_port_name_non_relative (_name);
-
- if (sends_output ()) {
- r = jack_disconnect (_engine->jack (), this_shrt.c_str (), other_shrt.c_str ());
- } else {
- r = jack_disconnect (_engine->jack (), other_shrt.c_str (), this_shrt.c_str ());
- }
-
- if (r == 0) {
- _named_connections.erase (other);
- }
-
- check_buffer_status ();
+ r = jack_disconnect (_engine->jack (), other_shrt.c_str (), this_shrt.c_str ());
}
-
- return r;
+
+ if (r == 0) {
+ _connections.erase (other);
+ }
+
+return r;
}
@@ -270,41 +153,13 @@ Port::connected_to (Port* o) const
int
Port::connect (Port* o)
{
- /* caller must hold process lock */
-
- if (external () && o->external ()) {
- /* we're both external; connect using name */
- return connect (o->name ());
- }
-
- /* otherwise connect by Port* */
- _connections.insert (o);
- o->_connections.insert (this);
-
- check_buffer_status ();
- o->check_buffer_status ();
-
- return 0;
+ return connect (o->name ());
}
int
Port::disconnect (Port* o)
{
- if (external () && o->external ()) {
- /* we're both external; try disconnecting using name */
- int const r = disconnect (o->name ());
- if (r == 0) {
- return 0;
- }
- }
-
- _connections.erase (o);
- o->_connections.erase (this);
-
- check_buffer_status ();
- o->check_buffer_status ();
-
- return 0;
+ return disconnect (o->name ());
}
void
@@ -316,19 +171,13 @@ Port::set_engine (AudioEngine* e)
void
Port::ensure_monitor_input (bool yn)
{
- if (_jack_port) {
- jack_port_ensure_monitor (_jack_port, yn);
- }
+ jack_port_ensure_monitor (_jack_port, yn);
}
bool
Port::monitoring_input () const
{
- if (_jack_port) {
- return jack_port_monitoring_input (_jack_port);
- } else {
- return false;
- }
+ return jack_port_monitoring_input (_jack_port);
}
void
@@ -345,29 +194,19 @@ void
Port::recompute_total_latency () const
{
#ifdef HAVE_JACK_RECOMPUTE_LATENCY
- if (_jack_port) {
- jack_recompute_total_latency (_engine->jack (), _jack_port);
- }
+ jack_recompute_total_latency (_engine->jack (), _jack_port);
#endif
}
nframes_t
Port::total_latency () const
{
- if (_jack_port) {
- return jack_port_get_total_latency (_engine->jack (), _jack_port);
- } else {
- return _latency;
- }
+ return jack_port_get_total_latency (_engine->jack (), _jack_port);
}
int
Port::reestablish ()
{
- if (!_jack_port) {
- return 0;
- }
-
_jack_port = jack_port_register (_engine->jack(), _name.c_str(), type().to_jack_type(), _flags, 0);
if (_jack_port == 0) {
@@ -386,11 +225,7 @@ Port::reconnect ()
{
/* caller must hold process lock; intended to be used only after reestablish() */
- if (!_jack_port) {
- return 0;
- }
-
- for (std::set<string>::iterator i = _named_connections.begin(); i != _named_connections.end(); ++i) {
+ for (std::set<string>::iterator i = _connections.begin(); i != _connections.end(); ++i) {
if (connect (*i)) {
return -1;
}
@@ -405,14 +240,8 @@ Port::set_name (std::string const & n)
{
assert (_name.find_first_of (':') == std::string::npos);
- int r = 0;
-
- if (_jack_port) {
- r = jack_port_set_name (_jack_port, n.c_str());
- if (r == 0) {
- _name = n;
- }
- } else {
+ int const r = jack_port_set_name (_jack_port, n.c_str());
+ if (r == 0) {
_name = n;
}
@@ -420,48 +249,13 @@ Port::set_name (std::string const & n)
}
void
-Port::set_latency (nframes_t n)
-{
- _latency = n;
-}
-
-void
Port::request_monitor_input (bool yn)
{
- if (_jack_port) {
- jack_port_request_monitor (_jack_port, yn);
- }
+ jack_port_request_monitor (_jack_port, yn);
}
void
-Port::check_buffer_status ()
+Port::set_latency (nframes_t n)
{
- if (external() && receives_input()) {
- if (!externally_connected()) {
- if (!_connections.empty()) {
-
- /* There are no external connections, so the
- external port buffer will be the silent buffer. We cannot write into it.
- But we have to write somewhere because there is at least one internal
- connection that is supplying us with data.
- */
-
- if (!using_internal_data()) {
- use_internal_data ();
- }
-
- } else {
-
- /* There are no external connections and no internal ones
- either, so we can revert to use the externally supplied
- buffer which will be silent (whatever the semantics of
- that are for a particular data type.
- */
-
- if (using_internal_data()) {
- use_external_data ();
- }
- }
- }
- }
+ jack_port_set_latency (_jack_port, n);
}