diff options
author | Carl Hetherington <carl@carlh.net> | 2009-02-11 00:58:24 +0000 |
---|---|---|
committer | Carl Hetherington <carl@carlh.net> | 2009-02-11 00:58:24 +0000 |
commit | d469cc3e3a536fceedbfc41e52ad3d7d178f7b0d (patch) | |
tree | 5cee0af05edc00f5b19116727b1aebfd3bc52719 /libs/ardour/port.cc | |
parent | fe4e98a72987f197239a025413bfddb4c29b8ba8 (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.cc | 302 |
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); } |