Add API to query plugin tail duration

So far only VST3 plugins have an actual implementation.
This commit is contained in:
Robin Gareus 2024-08-15 01:42:27 +02:00
parent b4fca7bc1c
commit 15c7603fdd
No known key found for this signature in database
GPG key ID: A090BCE02CF57F04
5 changed files with 42 additions and 0 deletions

View file

@ -175,6 +175,9 @@ public:
/** the max possible latency a plugin will have */
virtual samplecnt_t max_latency () const { return 0; }
samplecnt_t effective_tail() const;
PBD::Signal0<void> TailChanged;
virtual int set_block_size (pframes_t nframes) = 0;
virtual bool requires_fixed_sized_buffers () const { return false; }
virtual bool inplace_broken () const { return false; }
@ -423,6 +426,11 @@ protected:
private:
virtual samplecnt_t plugin_latency () const = 0;
/** tail duration in samples. e.g. for reverb or delay plugins.
*
* The default when unknown is 2 sec */
virtual samplecnt_t plugin_tail () const;
/** Fill _presets with our presets */
virtual void find_presets () = 0;

View file

@ -256,6 +256,9 @@ CONFIG_VARIABLE (uint32_t, plugin_scan_timeout, "plugin-scan-timeout", 150) /* d
CONFIG_VARIABLE (uint32_t, limit_n_automatables, "limit-n-automatables", 512)
CONFIG_VARIABLE (uint32_t, plugin_cache_version, "plugin-cache-version", 0)
CONFIG_VARIABLE (float, tail_duration_sec, "tail-duration-sec", 2.0)
CONFIG_VARIABLE (uint32_t, max_tail_samples, "max-tail-samples", 0xffffffff) // aka kInfiniteTail
/* custom user plugin paths */
CONFIG_VARIABLE (std::string, plugin_path_vst, "plugin-path-vst", "@default@")
CONFIG_VARIABLE (std::string, plugin_path_lxvst, "plugin-path-lxvst", "@default@")

View file

@ -180,6 +180,7 @@ public:
/* API for Ardour -- Setup/Processing */
uint32_t plugin_latency ();
uint32_t plugin_tail ();
bool set_block_size (int32_t);
bool activate ();
bool deactivate ();
@ -326,6 +327,7 @@ private:
bool _add_to_selection;
boost::optional<uint32_t> _plugin_latency;
boost::optional<uint32_t> _plugin_tail;
int _n_bus_in;
int _n_bus_out;
@ -440,6 +442,7 @@ public:
private:
samplecnt_t plugin_latency () const;
samplecnt_t plugin_tail () const;
void init ();
void find_presets ();
void forward_resize_view (int w, int h);

View file

@ -317,6 +317,19 @@ Plugin::input_streams () const
return ChanCount::ZERO;
}
samplecnt_t
Plugin::effective_tail () const
{
/* consider adding a user-override per plugin; compare to HasLatency, Latent */
return max<samplecnt_t> (0, min<samplecnt_t> (plugin_tail (), Config->get_max_tail_samples ()));
}
samplecnt_t
Plugin::plugin_tail () const
{
return _session.sample_rate () * Config->get_tail_duration_sec ();
}
Plugin::IOPortDescription
Plugin::describe_io_port (ARDOUR::DataType dt, bool input, uint32_t id) const
{

View file

@ -819,6 +819,12 @@ VST3Plugin::set_block_size (pframes_t n_samples)
return 0;
}
samplecnt_t
VST3Plugin::plugin_tail () const
{
return _plug->plugin_tail ();
}
samplecnt_t
VST3Plugin::plugin_latency () const
{
@ -1951,6 +1957,15 @@ VST3PI::plugin_latency ()
return _plugin_latency.value ();
}
uint32_t
VST3PI::plugin_tail ()
{
if (!_plugin_tail) { // XXX this is currently never reset
_plugin_tail = _processor->getTailSamples ();
}
return _plugin_tail.value ();
}
void
VST3PI::set_owner (SessionObject* o)
{