From 15c7603fdd4b68a04331336870264742f005b0bb Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Thu, 15 Aug 2024 01:42:27 +0200 Subject: [PATCH] Add API to query plugin tail duration So far only VST3 plugins have an actual implementation. --- libs/ardour/ardour/plugin.h | 8 ++++++++ libs/ardour/ardour/rc_configuration_vars.h | 3 +++ libs/ardour/ardour/vst3_plugin.h | 3 +++ libs/ardour/plugin.cc | 13 +++++++++++++ libs/ardour/vst3_plugin.cc | 15 +++++++++++++++ 5 files changed, 42 insertions(+) diff --git a/libs/ardour/ardour/plugin.h b/libs/ardour/ardour/plugin.h index de99dddb2f..b8510bbc35 100644 --- a/libs/ardour/ardour/plugin.h +++ b/libs/ardour/ardour/plugin.h @@ -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 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; diff --git a/libs/ardour/ardour/rc_configuration_vars.h b/libs/ardour/ardour/rc_configuration_vars.h index 06f35680fd..f58ae85bba 100644 --- a/libs/ardour/ardour/rc_configuration_vars.h +++ b/libs/ardour/ardour/rc_configuration_vars.h @@ -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@") diff --git a/libs/ardour/ardour/vst3_plugin.h b/libs/ardour/ardour/vst3_plugin.h index fa8dfb6cbc..aaa94f7b9c 100644 --- a/libs/ardour/ardour/vst3_plugin.h +++ b/libs/ardour/ardour/vst3_plugin.h @@ -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 _plugin_latency; + boost::optional _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); diff --git a/libs/ardour/plugin.cc b/libs/ardour/plugin.cc index 0fe0c42cff..6c4d0fe378 100644 --- a/libs/ardour/plugin.cc +++ b/libs/ardour/plugin.cc @@ -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 (0, min (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 { diff --git a/libs/ardour/vst3_plugin.cc b/libs/ardour/vst3_plugin.cc index 7912c0f808..a7823a7d14 100644 --- a/libs/ardour/vst3_plugin.cc +++ b/libs/ardour/vst3_plugin.cc @@ -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) {