The variable is unset (and unused), windows_search_path()
is used on that platform.
This prevents the "ARDOUR_DATA_PATH not set in environment"
message from being printed.
Remove unused code that was copy/pasted from mixer_strip.cc
which is not needed for foldback strips. Notably alternative
delivery display mode (aux-sends).
This GTK button style is out of place in both contexts.
Furthermore it is inconsistent to not have the same button
in the editor (there is a dropzone).
* un-hardcode button numbers, use portable modifier API
* allow to toggle Send bypass with middle-click
* add support for delete-operator
* Only act on single-click press
Prefer to reuse spill logic from the mixer-ui.
This allows to spill routes directly after spilling
foldbacks. Previously that resulted in FB "show sends"
to keep flashing even then no foldbacks were spilled anymore.
It also simplifies various aspects of foldback prev/next
logic.
This increases timeout granularity and ensure that
rt (TSFM) and butler thread can run to prepare exports.
This may fix an issue some windows users reported
"Cannot prepare transport for export", and increasing
the buffersize to 1024 or 2048 works around the isssue.
This also fixes an edge-case usecs_per_cycle() may return -1
(sleep forever) when the engine dies.
This correctly matches reserved words when looking
up C++ documentation, but prints the exposed binding.
e.g. ARDOUR::PluginInsert::type -> ARDOUR.PluginInsert._type
https://github.com/Ardour/manual/pull/171
The mixer gain-entry selects all when the entry is focused
(see ArdourWidgets::FocusEntry). Due to the selection there is
no visible cursor, and it was not obvious that the entry
has focus. Also moving the mouse outside of the strip drops focus
without any indication.
"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
This combines SessionEvent per playlist. Now per change
there are "only" two SessionEvent::Overwrite events
queued per playlist in the GUI thread for later processing
the Butler.
These are triggered by Playlist::ContentsChanged()
and Playlist::LayeringChanged(), both of which trigger
DiskIOProcessor::playlist_modified.
(Previously there used to be two per region)
Playlist::ContentsChanged() is implicit.
Region::send_change()
-> Playlist::region_changed ()
-> Playlist::notify_contents_changed ()
-> Playlist::ContentsChanged () /* EMIT SIGNAL*/
This cuts the number of signals in half and also
allows to freeze/thaw the playlist to collect the
signals for each playlist into a single signal.
With a large session:
Editor::insert_time()
-> Playlist::shift()
-> 4000+ regions are modified
-> 4k calls to Region::send_change()
-> --"-- Playlist::region_changed ()
-> --"-- Playlist::region_bounds_changed ()
-> --"-- Playlist::notify_contents_changed ()
-> --"-- ContentsChanged () /* EMIT SIGNAL */
-> --"-- DiskReader::playlist_modified ()
-> 4k Session::request_overwrite_buffer events are queued
The butler thread processes them all in the background, but
this also enqueues 4k+ events to the GUI event pool since the
GUI subscribed to Playlist::ContentsChanged ().
However the GUI is inside Editor::insert_time() and cannot handle
events. So they keep accumulating, and eventually hits
"POOL OUT OF MEMORY - RECOMPILE WITH LARGER SIZE!"
-=-
This fixes the issue by collecting blocking ::notify_contents_changed
until all region_changed() events are processed, and a single call
to Playlist::flush_notifications() notifies the UI and disk-reader.
This works around JACK not allowing to directly access physical
input buffers by creating an explicit connection.
Ardour access input-buffers directly without connection
for input meters and AFL. This work in general since data
on those ports are always read unconditionally at the start of
each process cycle.
jack_port_get_buffer (jack_port_by_name (c, "system:capture_1"), n);
However with jack this fails if the given port is not connected.
Due to an internal jack optimization collecting input data is
skipped for ports that have no connections.