When exporting multiple formats with identical filename
extension for the same time-span, the format-name needs
to be added.
Previously that was done internally when starting to export.
The Export-Dialog did not show correct filenames nor
warn of existing files that will be overwritten.
* Fix exporting multiple formats with different
normalization settings or demo-noise settings
* Add true-peak limiter (based on x42-limiter dpl.lv2)
* Optionally use a limiter for loudness normalization
* Fall back to short-term loudness when normalizing
material too short for integrating loudness.
Previously an empty RegionList was used (auto-partition
changes were never collected at rec-stop), furthermore
auto-partitioned regions do not have an old ARDOUR::AutomationList
(fade in/out) property (_have_old is false).
When the metronome is routed through a track, it
will correctly get the downstream playback latency.
Capture Alignment is Capture-Time.
This fixes a case where the metronome is connected to
physical I/O and a track. This can result in ambiguous
latency if the track's output is not connected or
connected via latent master bus.
This reverts commit f08b90f368.
The convolver may be re-activated shortly after initialization
(e.g. session load, switching snapshots, or buffer-size.
In this case not all process threads may have started.
Convproc::stop_process() skips them (their state is still ST_IDLE).
Yet some short time later the thread's main function runs
and changes the state to ST_PROC, and check_stop () waits forever.
This is solved by waiting for all threads to start.
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.
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.
"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
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.