Commit Graph

421 Commits

Author SHA1 Message Date
Robin Gareus
e4d9344d2a Revert PinMapping Changes
This reverts
 * e48d97ed69
 * 98c906b733
 * 0cf73d459b

because the C++ API std::map:at can throw and exception
was not implemented (and also deemed excessive for the
case at hand). Also an explicit API for *p*plugin_pin
mapping is preferable and facilitates debugging.
2024-09-03 13:25:48 +02:00
Alejandro Domínguez
0cf73d459b Deprecate ARDOUR::PinMappings C++11's std::map::at emulation 2024-08-31 05:49:03 +02:00
Robin Gareus
f111f200c1 Fix signal analysis when buffer-size changes
PI::signal-analysis buffers were not updated when a user
changes the buffersize.

This also remove a single use Session API.
2024-04-23 21:49:48 +02:00
Robin Gareus
df8106bd85 PluginInsert match I/O: skip div by zero 2024-04-23 21:49:41 +02:00
Robin Gareus
5216a6d987 Refactor and consolidate setting and copying plugin state 2024-04-21 16:32:47 +02:00
Robin Gareus
f5b53a6d14 Consolidate PluginInsert Match, move to parent class 2024-04-21 16:32:47 +02:00
Robin Gareus
2da3141706 Consolidate plugin_factory, move to parent class 2024-04-21 16:32:47 +02:00
Robin Gareus
d2bdf440c8 Consolidate PluginControl Code
This code was (for the most part) duplicated, and with
preparation for Region FX, a third copy motivated this
consolidation.
2024-04-21 16:32:47 +02:00
Robin Gareus
6e28c43cef Don't show plugin preset UI for plugins without controls
Notably Ardour's General MIDI Synth has no presets, but
users try.

This also prevents presets of plugins with internal state,
but no user visible controls. But those usually have a plugin
provided presets.
2024-01-28 14:58:55 +01:00
Robin Gareus
066df7cc1a LV2: fix crash when replicating stateful plugin on copy
When copying a mono LV2 plugin to a stereo track, the
state of the copied mono plugin is copied to the replicated
instance.

However at this point in time PBD::Stateful::ForceIDRegeneration
is still enabled, and the state ID has not been set.

This used to not be an issue. Older versions of liblilv
handle non-existent paths just fine.

However in lilv v0.24.20-10-gdd5e851 `lilv_path_absolute`
was replaced with `zix_canonical_path` which returns NULL
if a state file does not [yet] exist. This lead to a segfault
due to strlen(NULL) in `serd_node_new_file_uri`:

#0 strlen -- SEGV on unknown address 0x000000000000
#1 serd_node_new_file_uri () at /lib/x86_64-linux-gnu/libserd-0.so.0
#2 lilv_state_new_from_file () at /lib/x86_64-linux-gnu/liblilv-0.so.0
#3 ARDOUR::LV2Plugin::set_state(XMLNode const&, int) at ../libs/ardour/lv2_plugin.cc:2320
2023-12-15 04:30:45 +01:00
Robin Gareus
0e3cf0454c Yet another plugin parameter automation time-domain fix
see also fded5063d9
2023-10-04 21:45:06 +02:00
Paul Davis
3b565693c8 objects don't have a time domain, they have a time domain provider (libs) 2023-08-02 15:22:52 -06:00
Paul Davis
2bbf06c8cc class name change to clearly disambiguate Evoral::ControlList (a list of time/value pairs) from lists of Controls in libardour 2023-08-02 15:22:45 -06:00
Robin Gareus
42caef16bc Delay MIDI-bypass for latent plugins 2023-05-26 19:17:56 +02:00
Robin Gareus
295dbd8e1e Make RCU reader return a const pointer (omnibus commit) 2023-04-08 00:15:37 +02:00
Robin Gareus
1dce50e787 Fix another CAS (amend 4ba4cd69ff) 2023-03-26 22:16:47 +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
05a13e151e PI: Leave unconnected buffers when split processing
Otherwise a stereo plugin on a mono bus will still
have two valid input buffers, and a map saying so
during process().
2023-03-17 05:58:10 +01:00
Robin Gareus
3d62ab1c53 Do not create sidechain ports by default
In many cases optional sidechain inputs are not used.
Previously sidechain ports were created, but remained
unconnected and silence was passed to the plugin's key input.

Plugins can detected if a pin is connected. Some plugins
(e.g. VST3  Waves SSL Comp) activate the sidechain processing
automatically when depending in connection.

It is more common that a user does not want to use an external
sidechain, and if they want they should use the pin-dialog
to connect it. So leaving it off by default is sensible.

see also #9223
2023-02-05 16:06:19 +01:00
Robin Gareus
55d1b66b72 Connect sidechain pins when adding sidechain [ports]
This is in preparation to allow to skip adding sidechain ports
by default. When a user later adds the SC input ports, it is
convenient to connect the pins just like they are when they
are connected when instantiating the plugin (via reset_map).
2023-02-05 15:55:29 +01:00
Robin Gareus
64ec70ec20 Fix plugin replication wrt. sidechains
Ignore sidechain pins, when no sidechain ports are present.
Otherwise a plugin with 1 audio input and 1 sidechain input
would match a stereo track when the sidechain port is not present.
2023-02-05 15:46:33 +01:00
Robin Gareus
830dfdda24 Fix assert() when resolving impossible pin match (#9218)
Adding a MIDI only plugin at a point where there is no
MIDI data, and/or additional audio signals results in an
'Impossible' match.

Those are usually resolved by trying to replicate the plugin,
and the fallback is to "Replicate 1 time".

While this is effectively equivalent with ExactMatch (use
1 instance), it is semantically different: Audio sources
will be ignored and if there is no MIDI signal, the MIDI
input remains unconnected.

It is the opposite to "Hide" (plugin has more inputs
of a given type, which can be fed by silence), since it has
fewer inputs of a given type signals are "dropped".

Strictly speaking we should special case this "Replicate 1 time"
case to "Drop" [sic]. which only assert(!reconfigurable_io()).
2023-02-03 04:37:27 +01:00
Robin Gareus
2226da1385 VST3: retain I/O from older versions (bump session format)
A VST3 plugin can have additional busses which were not
available in older versions of Ardour. For compatibility
reasons those should remain unconnected. This is achieved
by using a custom I/O config  (same way a user would configure
this).
2023-01-17 22:02:10 +01:00
Robin Gareus
e87b989501 Inform plugins about connected input pins
When not using inplace processing (because I/O pins connections
are not an identity matrix), dedicated inplace-buffers are used.
Those buffers contain silence on unused ports, and hence always
valid to use. However it is still useful for plugins to know
if a plugin-port is actually used. VST3 can disable busses
for unconnected pins.
2023-01-17 22:02:10 +01:00
Robin Gareus
f6eac0f03a Clarify that plugin replication is exclusive to re-configurable I/O 2023-01-17 22:02:07 +01:00
Robin Gareus
376b50a6ae Fix concurrency issue when deactivating plugins
Processor::deactivate must not be called concurrently with
processing. e.g. Threading rules https://lv2plug.in/ns/lv2core

This fixes a potential crash when freezing tracks
2022-11-13 00:24:02 +01:00
Robin Gareus
bed2e23ff6 Fix memory leak when replicating plugins 2022-11-04 17:57:50 +01:00
Robin Gareus
619d523bbe Fix state version for copy-construction (1/2)
In some cases copying an instance requires an explicit
set_state() call (e.g. copy internal plugin state). This is
done by calling `set_state(other->get_state())`.

::get_state() produces XML as matching current_state_version.
(not loading_state_version).
2022-11-04 17:51:09 +01:00
Robin Gareus
fded5063d9 Yet another automation time-domain fix
This issue was fixed in 6a55146fd but resurfaced in 489c9ace9.
2022-10-31 16:23:20 +01:00
Robin Gareus
489c9ace9f Fix looping automation - see also 6a55146f 2022-10-26 21:03:08 +02:00
Robin Gareus
6a55146fdc Fix music-time parameter automation #9019
Music-time has a significantly reduced resolution.
When evaluating parameter automation using sample-time, different
samples can be mapped back to the same beat-tick. This can result in
endless loops.

The same automation event is found again:

```
start: 112640 next_event.when: b13334 -> dist a5892029@a662323200 in dist.samples: 1002
start: 113642 next_event.when: b13334 -> dist a269@a668214960 dist.samples: 0
```

Note this fix may not be correct, since time-domains are mixed.
"end" is using sample-time. Furthermore The loop is only entered
if there is an event found using  timepos_t(start).

Further work will be required (ideally use the same resolution for
all time-domains, or force everything that is evaluated in RT-context
to a single time-domain)
2022-10-21 12:40:30 +02:00
Robin Gareus
c991016021 Consolidate plugin API to access parent insert
Previously this was special cased only for VST for callbacks
from the plugin (e.g. check pin connections), but it is generally
useful.
2022-08-05 01:17:59 +02:00
Paul Davis
0d9656ef82 use new macros to cleanup #ifndef NDEBUG as much as possible (libs edition) 2022-06-22 13:31:08 -06:00
Paul Davis
311e36b28f fix optimized unused variable warnings 2022-06-22 13:31:08 -06:00
Robin Gareus
ac5fb9d1f9 Revert "Debug noseq's audition issue - silent plugin processing"
This reverts commit b3497b3f8f.
2022-06-04 01:40:38 +02:00
Robin Gareus
b3497b3f8f Debug noseq's audition issue - silent plugin processing
When auditioning, ardour's process_audition calls Route::silence
for all routes. PluginInsert::silence simply fed all [ports of all
[replicated] plugins with silence, regardless of port-mapping.
This can cause some VST2/3 plugins to change state, and enable ports
(e.g. stereo VST2 plugins on mono tracks), causing glitches.

This commit is mainly intended to investigate how significant
this glitch is when starting to audition.
2022-06-03 17:17:07 +02:00
Robin Gareus
972389e1bd Tweak PluginInsert::silence (used during audition, etc)
Actually run plugins (use _pending_active), and feed silence
to the plugin. Also update timing stats accordingly.
2022-06-03 01:30:02 +02:00
Robin Gareus
217f51e6fb Break out common plugin-insert state methods
This is in preparation for IO-Plug, and should also come
in handy later for per region plugins.
2022-04-14 20:08:22 +02:00
Robin Gareus
74a673ce17 Create a virtual base class for PluginInsert
This in in preparation for IO-Plug GUI support.
2022-04-14 16:35:03 +02:00
Paul Davis
7bf89ce109 Constification: make Stateful::get_state() const, with all other required const-ness added (libs) 2022-04-06 21:56:59 -06:00
Robin Gareus
e51e2c57c6 NO-OP: remove dead code 2022-03-06 17:13:35 +01:00
Robin Gareus
f9f3f598c4 Address rare race condition when creating sidechain inputs
Do not run the sidechaing processor before the processor
was configured. This ensure that Route::configure_processors()
has completed and ensure_buffers() was called.

Otherwise it may happen Sidechain::run could request a buffer
that is n/a (BufferSet::get_available assertion, see also 687149d8d2)
2022-01-22 19:26:27 +01:00
Paul Davis
7edbf06420 PluginInsert::silence() should never change the status of _active 2021-12-01 13:26:27 -07:00
Paul Davis
83c7ac4f38 libardour: use Processor::check_active() in all Processors instead of per-processor code
There are a few exceptions where the semantics make this too complex to be worth forcing check_active()
2021-11-29 21:50:29 -07:00
Paul Davis
d772ea3fdf manual post-conflict-resolution cleanups (library edition) 2021-08-13 12:51:36 -06:00
Paul Davis
3b06ce6e67 remove 3 nutempo #warnings - use plugin (processor) time_domain() when creating AutomationLists 2021-08-13 12:51:33 -06:00
Paul Davis
495cc1e4bc plugins use their route's automation time domain 2021-08-13 12:51:33 -06:00
Paul Davis
7c10cf1d54 Automatable now requires (and owns) a time domain to be used by automation data 2021-08-13 12:51:32 -06:00
Paul Davis
c76c61d202 manual fixups after rebase against master 2021-08-13 12:51:31 -06:00