Commit Graph

30 Commits

Author SHA1 Message Date
Robin Gareus dacf488c86
Fix callback order of port-dis/connections
Previously the port-engine was a LIFO. Changes were pushed back
and then popped-back. This causes issues when re-connecting
Transport Masters.

The GUI does the following when changing connections:
1. disconnect all
2. connect to new port

which lead to TransportMaster::connection_handler being called
in reverse order: connect, disconnect, and the transport
master was assumed to not be connected.

--

Now connections queue is a FIFO and code was consolidated.

(Note, we cannot use a std::deque because it does not support
memory pre-allocation with ::reserve)
2023-12-02 23:34:58 +01:00
Robin Gareus ac801e8455
Improve port-connect error messages 2023-06-22 02:47:30 +02:00
Robin Gareus 522c8f9426
Improve port-engine debug messages
try to get to the bottom of "unregister_port: Failed to find port"
errors.
2023-06-05 19:10:10 +02:00
Robin Gareus 287a21c09e
Add API to query hardware port name
In case of internal backends this allows to retrieve the
Device name for a given (hashed unique) port-name.

As opposed to "pretty-name" (which defaults to hw-port-name),
this cannot be changed by the user.

It is intended to be used when probing for control surfaces.
2023-05-02 23:39:27 +02:00
Robin Gareus 295dbd8e1e
Make RCU reader return a const pointer (omnibus commit) 2023-04-08 00:15:37 +02:00
Paul Davis 4ba4cd69ff switch from glib atomic to std::atomic (libs edition) 2023-03-24 14:19:15 -06:00
Paul Davis b35518e212 switch from boost::{shared,weak}_ptr to std::{shared,weak}_ptr
This is mostly a simple lexical search+replace but the absence of operator< for
std::weak_ptr<T> leads to some complications, particularly with Evoral::Sequence
and ExportPortChannel.
2023-03-24 14:19:15 -06:00
Robin Gareus ef08c819da
Fix crash on port unregistration
pr->erase (*i); deletes the iterator, it cannot be safely
dereferenced again later.
2022-07-16 20:26:56 +02:00
Robin Gareus 32161cf154
Fix valid_port race/crash when ranaming ports
PortIndex is sorted by name, and uses port-name as unique identifier.

Ports can be re-named concurrently with processing.
::set_port_name() updates the RCU in the background. The engine
may concurrently process with an old RCU reader value.

In this case valid_port() failed in the process-callback.
and ::get_buffer() returned NULL
2022-06-18 22:54:08 +02:00
Robin Gareus 226dadbd19
Further reduce DSP load of debug builds
In all years of using these assert()s never triggered. Besides
there are valid_port() tests in other strategic locations that
are not periodically hit in realtime context.
2022-05-06 02:04:55 +02:00
Robin Gareus ce95c9fb09
Fix std::set< BackendPortPtr> lookup by key
The set uses a custom sort-by-name comparator.
Previously it was possible to have an inconsistent set iterator.
std::set::find() did not find a given port while std::find() did.

This fixes using std::set::find() on the PortIndex set.
2022-05-06 02:04:33 +02:00
Robin Gareus dbd8089fb8
Sort concurrent MIDI events on port-level #8828
See also 8dbbc19567 as well as
Evoral::Sequence<Time>::const_iterator::choose_next
ARDOUR::MidiBuffer::second_simultaneous_midi_byte_is_first
2021-11-30 19:41:39 +01:00
Robin Gareus 79330f909e
Work around connection loss when re-starting JACK backend
If connecting ports using the port-engine fails,
ardour forgets the connection.

Internal backends only produced an error if a port was already
connected, when using ::connect (handle, other), but
ignore already existing connection when using port-names.

Various ports are connected twice when the engine connects
at session load. This worked fine for as long as the engine
was never stopped (saving the session asks the port-engine),
but failed when the engine went away and internal representation
is used.
2021-11-01 23:11:41 +01:00
Robin Gareus 7dc21fdc96
PortList debug methods (to be called from gdb) 2021-05-07 01:43:19 +02:00
Robin Gareus cc7b8b1bc5
gcc-11 compat, volatile atomic variables (1/2)
"While 'atomic' has a volatile qualifier, this is a historical
artifact and the pointer passed to it should not be volatile."

Furthermore "It is very important that all accesses to a
particular integer or pointer be performed using only this API"
(from https://developer.gnome.org/glib/2.68/glib-Atomic-Operations.html)

Hence initialization of atomic variables is changed to also use
this API, instead of directly initializing the value.

This also fixes a few cases where atomic variables were
accessed directly.

see also libs/pbd/pbd/g_atomic_compat.h
2021-03-22 15:30:07 +01:00
Robin Gareus 634d325e5d
Prevent deadlock when disconnecting
The backend holds `_port_callback_mutex` while disconnecting ports.
In some cases disconnecting a port can drop the last reference
resulting in a port-deletion from the connection handler.
This in turn will eventually aquire the `_port_callback_mutex`
and deadlock.

This is now circumvented by using atomic operations instead of
taking a lock to set the `_port_change_flag`.

The flag is also used to trigger a latency update in some cases,
atomic is preferable to taking a lock to set this flag.

--

Full bt: https://paste.debian.net/1184056/
Short:

#1  in pthread_mutex_lock ()
#2  in ARDOUR::PortEngineSharedImpl::port_connect_add_remove_callback()
#3  in ARDOUR::BackendPort::~BackendPort()
#4  in ARDOUR::DummyPort::~DummyPort()
#6  in ARDOUR::DummyAudioPort::~DummyAudioPort()
#7  in boost::checked_delete<ARDOUR::BackendPort>(ARDOUR::BackendPort*)
#12 in boost::shared_ptr<ARDOUR::ProtoPort>::reset()
#13 in ARDOUR::Port::drop()
#14 in ARDOUR::Port::~Port()
#15 in ARDOUR::AudioPort::~AudioPort()
#17 in ARDOUR::AudioEngine::add_pending_port_deletion(ARDOUR::Port*)
#20 in boost::detail::sp_counted_base::release()
#37 in ARDOUR::PortManager::connect_callback() at libs/ardour/port_manager.cc:788
#38 in ARDOUR::DummyAudioBackend::main_process_thread() at libs/backends/dummy/dummy_audiobackend.cc:1018
2021-02-04 21:06:20 +01:00
Robin Gareus 21e66216be
Separate user-set pretty-names from hardware I/O names
This allow to restore original engine port-names as set
by the backend. ALSA MIDI, CoreAudio, CoreMIDI and PortAudio
drivers can provide human readable physical port names for
some devices.
2021-01-18 03:18:20 +01:00
Robin Gareus b40826792a
Fix port-connection callbacks on engine restart
When the engine is restarted, ports are re-established,
and previously queued port-connections need to be cleared.

This caused a bug:
 * when the engine is stopped all ports are disconnected.
   _port_connection_queue contains all disconnections
 * engine is stopped so _port_connection_queue is not processed
 * engine-restart re-etablishes ports and appends those connections
   to _port_connection_queue
 * process-callback processes the list in **reverse** order
```
   while (!_port_connection_queue.empty ()) {
      _port_connection_queue.pop_back ();
   }
```
 * ARDOUR::PortManager::connect_callback() is first called
   with connected() and the disconnected()
 * All ports are assumed to not be connected
   Port::_externally_connected == 0 for all ports

Result:

 * vari-speed playback resampling does not work (only external
   I/O is reampled), split cycles processing (looping) fails
   since AudioPort::get_audio_buffer() does not apply the
   _global_port_buffer_offset
2020-09-05 23:06:00 +02:00
Robin Gareus a80064981e
NO-OP: Consolidate PortConnect code into shared parent class 2020-09-05 23:05:57 +02:00
Robin Gareus fcd347fe0c
Fix --no-nls, i18n include order in libs -- #8361
Ardour's "pbd/i18n.h" needs to be included last,
after any include that may indirectly pull in getext or libintl.

For that reason "pbd/i18n.h" must not be used in header files either.
2020-08-19 17:39:32 +02:00
Robin Gareus 75404eaa64
Ignore NO-OP Latency changes
This also fixes an endless recursion when directly connecting
is_physical() ports to each other.
2020-06-05 20:44:57 +02:00
Paul Davis 8ea608b3d9 fix plurals and other mistakes in error strings; switch to PBD::warning since these are not user errors nor fixable 2020-04-15 15:26:34 -06:00
Paul Davis 20b4b4ea90 remove debug output 2020-04-08 18:43:20 -06:00
Paul Davis dd94d43c46 when renaming a port, remove the backend's port map entry based on the *old* name (not the new one) 2020-04-08 18:41:37 -06:00
Paul Davis ec9784764c better fix for port destruction 2020-04-07 23:21:48 -06:00
Paul Davis d827f3fdae fix up shared_ptr<> use in JACK backend 2020-04-07 13:23:49 -06:00
Paul Davis b9cb306e8b use shared_ptr to manage backend port lifetimes (Pulse,ALSA,Dummy,JACK)
JACK is not yet finished.

Changes also include minor reformatting and a spelling correction (latecies to latencies)
2020-04-07 13:23:49 -06:00
Paul Davis 72925e4453 use _instance_name in all messages from PortEngineSharedImpl 2020-04-02 19:45:31 -06:00
Paul Davis 04551c39f6 use PortEngineSharedImpl with DummyAudioBackend 2020-04-02 19:45:31 -06:00
Paul Davis 9461a30a97 refactor shared PortEngine implementation from AlsaAudioBackend 2020-04-02 19:45:31 -06:00