Age | Commit message (Collapse) | Author |
|
|
|
This is also needed when exporting.
|
|
|
|
This means that using the wheel in the GUI (or equivalent) ends its effect at transport stop
|
|
'lower_bound()' iterates between param #1 and param #2, comparing the result
with param #3 - either by making the comparison internally or by deferring to
an external comparator function. Prior to C99 however, BOTH cases required
param #3 to match the type being iterated.
In the case of a deferred comparison, there was apparently a proposal to
relax this restriction in C99, though I'm not sure if it in fact got
implemented (can't find any examples of it anywhere...)
|
|
|
|
This allows users to rename sends without enforcing a numeric
bitslot number. However this prevents a user to to use "send" names
that are potentially used for new sends or inserts.
|
|
Ardour statically links libardour against zita-convolver,
this is required because it's used in plugins and available
by Lua scripts.
libzita-convolver has been modified to be in a custom namespace
and extern global symbols have been removed.
On most GNU/Linux distros system-wide default zita-convolver
is not compatible nor suitable to be used as-is.
|
|
|
|
|
|
|
|
From #ardour IRC:
> there have been a few times that I wished a-Delay could boost volume
> it has an "output gain" slider, but it only subtracts. the maximum is 0db
> delay is a big part of guitar solos, so a boost in the same plugin would be awesome
|
|
IO::set_name() may fail, in case Port::set_name() fails.
In that case the IOProcessor should not update its name.
|
|
Session::next_*_send_id() starts counting at bit 1.
Probably for historical reasons (bit zero = 1).
|
|
|
|
|
|
This prevents later crashes. Tracks cannot exist without a playlist.
|
|
This is in preparation of displaying verbose errors to the user.
|
|
Otherwise this will lead to a corrupt state:
ERROR: Session: XMLNode describing a AudioRegion references an unknown source id
ERROR: Session: cannot create Region from XML description. Can not load state for region
ERROR: Playlist: cannot create region from XML
and a track without playlist is created, resulting in a later crash.
Eventually SessionPlaylists::load() needs to handle this gracefully,
but this should help catch cases causing the actual issue.
|
|
|
|
~StatefulDiffCommand() may trigger UndoTransaction::command_death()
which may delete the StatefulDiffCommand() that's just being destroyed.
This depends on the signal-connection order, which is undefined.
In any case when a shared_ptr<> object is being destroyed it means
that all references to it are already gone. There's no need to
emit drop_references from the d'tor.
|
|
This fixes a case when deleting a plugin, deletes all automation
undo/redo events:
<UndoTransaction name="add automation event">
<MementoCommand type-name="ARDOUR::AutomationList">
...
`delete this;` calls the d'tor which emits drop_references(),
that leads to UndoTransaction::command_death() destroying the
object, whichh causes a double free.
|
|
LWS_CALLBACK_HTTP_CONFIRM_UPGRADE is only available since v3.1.0
|
|
set_auto_punch_location() is a NO-OP when there's no punch range.
This disconnects `punch_connections`, clears session-events,
and emits auto_punch_location_changed().
|
|
This is in preparation for GUI sensitivity of Loop and Punch actions.
|
|
|
|
|
|
|
|
This also prevents switching between punch-in/out record
and looping without transport-stop.
|
|
|
|
|
|
The previous approach failed in case where PluginInsert
uses no-inplace buffers with a linear map.
Since buffers are replicated up to a total of number of
all (inputs + outputs), the number of output buffers
could not be determined. There was insufficient information
using the I/O map alone.
With a known number of outputs processing and applying
the i/o map is also a lot easier and faster.
This break the API of process_map().
|
|
|
|
Previously this could assert(), copying a buffer to itself.
|
|
Every day can be x-mas day, how else can we be lovers? :)
|
|
(valgrind trace, line-numbers from mixbus+6.0-190-g0ec6bc35a)
This may happen initially for unconnected graph nodes,
e.g. Foldback Busses from ARDOUR::Session::post_engine_init().
==29797== Conditional jump or move depends on uninitialised value(s)
==29797== at 0x6167D3F: trace_terminal(boost::shared_ptr<ARDOUR::Route>, boost::shared_ptr<ARDOUR::Route>, bool) (session.cc:2174)
==29797== by 0x6167D99: trace_terminal(boost::shared_ptr<ARDOUR::Route>, boost::shared_ptr<ARDOUR::Route>, bool) (session.cc:2174)
==29797== by 0x6167D99: trace_terminal(boost::shared_ptr<ARDOUR::Route>, boost::shared_ptr<ARDOUR::Route>, bool) (session.cc:2174)
==29797== by 0x616890D: ARDOUR::Session::resort_routes_using(boost::shared_ptr<std::__cxx11::list<boost::shared_ptr<ARDOUR::Route>, std::allocator<boost::shared_ptr<ARDOUR::Route> > > >) (session.cc:2289)
|
|
(valgrind trace, line-numbers from mixbus+6.0-190-g0ec6bc35a)
==29797== Invalid write of size 4
==29797== at 0x619BB3F: boost::dynamic_bitset<unsigned int, std::allocator<unsigned int> >::reference::do_reset() (dynamic_bitset.hpp:120)
==29797== by 0x6196002: boost::dynamic_bitset<unsigned int, std::allocator<unsigned int> >::reference::do_assign(bool) (dynamic_bitset.hpp:122)
==29797== by 0x618F670: boost::dynamic_bitset<unsigned int, std::allocator<unsigned int> >::reference::operator=(bool) (dynamic_bitset.hpp:107)
==29797== by 0x617E426: ARDOUR::Session::unmark_send_id(unsigned int) (session.cc:5633)
==29797== by 0x6156714: ARDOUR::Send::~Send() (send.cc:125)
==29797== by 0x5CE12A7: ARDOUR::InternalSend::~InternalSend() (internal_send.cc:71)
==29797== by 0x5CE1319: ARDOUR::InternalSend::~InternalSend() (internal_send.cc:76)
==29797== by 0x1556128: void boost::checked_delete<ARDOUR::InternalSend>(ARDOUR::InternalSend*) (checked_delete.hpp:34)
==29797== by 0x155E689: boost::detail::sp_counted_impl_p<ARDOUR::InternalSend>::dispose() (sp_counted_impl.hpp:92)
==29797== by 0xCC0E30: boost::detail::sp_counted_base::release() (sp_counted_base_std_atomic.hpp:110)
==29797== by 0xCC0EA6: boost::detail::shared_count::~shared_count() (shared_count.hpp:426)
==29797== by 0x134BD15: boost::shared_ptr<ARDOUR::InternalSend>::~shared_ptr() (shared_ptr.hpp:366)
==29797== by 0x60FACC1: ARDOUR::Route::~Route() (route.cc:498)
==29797== by 0x60FAF4D: ARDOUR::Route::~Route() (route.cc:517)
==29797== by 0x166144C: void boost::checked_delete<ARDOUR::Route>(ARDOUR::Route*) (checked_delete.hpp:34)
==29797== by 0x166338F: boost::detail::sp_counted_impl_p<ARDOUR::Route>::dispose() (sp_counted_impl.hpp:92)
==29797== by 0xCC0E30: boost::detail::sp_counted_base::release() (sp_counted_base_std_atomic.hpp:110)
==29797== by 0xCC0EA6: boost::detail::shared_count::~shared_count() (shared_count.hpp:426)
==29797== by 0xCD2385: boost::shared_ptr<ARDOUR::Route>::~shared_ptr() (shared_ptr.hpp:366)
==29797== by 0x615D0E5: ARDOUR::Session::~Session() (session.cc:455)
==29797== by 0x615D4A3: ARDOUR::Session::~Session() (session.cc:461)
|
|
See https://ardour.org/styleguide.html #10
https://pastebin.com/gJfrNhL2
|
|
|
|
When a playlist is deleted and drops_references(), any
undo/redo StatefulDiffCommand referncing playlist invoke
Destructible::drop_references() of the Command.
This leads to command_death(). As opposed to UndoTransaction::clear()
the StatefulDiffCommand was not destroyed.
In case of playlists StatefulDiffCommand::_changes contains
PBD::SequenceProperty<std::list<boost::shared_ptr<Region> > >
and shared pointer reference of the playlist regions were kept
indefinitely.
This fixes the following scenario:
New session, import an file, delete the created track,
clean up unused sources (delete unused playlists)[, quit].
A reference to the imported region was kept, because of the
playlist's undo command (insert region). Yet the source file
was deleted.
PS. Most playlist changes are accompanied by GUI zoom/selection
MementoCommands. Those are currently never directly dropped.
command_death() leaves those in place.
|
|
|
|
|
|
|
|
This fixes various cases where SessionHandleRef shared_ptr<>
were kept when sources were removed.
|
|
Various operations clear the history (e.g. cleanup). In that
case the GUI correctly had an empty Undo/Redo history, but the
file on disk was left in place.
Next session load restored the old, incorrect Undo/Redo history.
|
|
|
|
Previously the region was only removed from the Session's
region_map without sending notifications.
|
|
|
|
Code only handled a reversing->rolling path, not reversing->stopped
|
|
This type of MIDI port fetches all of its data from inside ::cycle_start(),
and delivers it to a FIFO connected to another thread (typically a
control surface).
Unlike regular MidiPorts, which will be read from inside a Session::process()
call, these ports will read their data once per AudioEngine::process() cycle.
They therefore cannot use MidiPort::get_midi_buffer() which scales and adjusts
event timestamps as if the data is being accessed from within Session::process().
It is still an open question whether or not AsyncMIDIPort::cycle_start() should
still scale event timestamps by speed. In some respects it seems more appropriate
to do so, and the reading thread (e.g. a control surface) doesn't care about
the "nframes" limit on timestamps that exists for calls within a Session::process()
tree. For now, leave the timestamps unscaled by speed.
|