diff options
author | Robin Gareus <robin@gareus.org> | 2016-04-08 18:16:01 +0200 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2016-04-08 18:16:01 +0200 |
commit | 752662051a1d7217ce842ded78d1ee8e041a112f (patch) | |
tree | 019ab4d6d311648969f193992fccd1bc97502249 /libs/ardour | |
parent | 75273762976933841b5c0b244c4e8f29158e5519 (diff) |
add Plugin LatencyChanged() signal and max latency report
Diffstat (limited to 'libs/ardour')
-rw-r--r-- | libs/ardour/ardour/lv2_plugin.h | 3 | ||||
-rw-r--r-- | libs/ardour/ardour/plugin.h | 20 | ||||
-rw-r--r-- | libs/ardour/lv2_plugin.cc | 18 |
3 files changed, 41 insertions, 0 deletions
diff --git a/libs/ardour/ardour/lv2_plugin.h b/libs/ardour/ardour/lv2_plugin.h index c93c159a78..f1907e80ae 100644 --- a/libs/ardour/ardour/lv2_plugin.h +++ b/libs/ardour/ardour/lv2_plugin.h @@ -71,6 +71,7 @@ class LIBARDOUR_API LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee uint32_t num_ports () const; uint32_t parameter_count () const; float default_value (uint32_t port); + framecnt_t max_latency () const; framecnt_t signal_latency () const; void set_parameter (uint32_t port, float val); float get_parameter (uint32_t port) const; @@ -190,6 +191,8 @@ class LIBARDOUR_API LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee URIMap& _uri_map; bool _no_sample_accurate_ctrl; bool _can_write_automation; + framecnt_t _max_latency; + framecnt_t _current_latency; friend const void* lv2plugin_get_port_value(const char* port_symbol, void* user_data, diff --git a/libs/ardour/ardour/plugin.h b/libs/ardour/ardour/plugin.h index e219ec5bdd..087f5968bd 100644 --- a/libs/ardour/ardour/plugin.h +++ b/libs/ardour/ardour/plugin.h @@ -199,6 +199,26 @@ class LIBARDOUR_API Plugin : public PBD::StatefulDestructible, public Latent return 0; } + /** Emitted when a Latency Changes + * + * (this cannot be part of ARDOUR::Latent because + * signals cannot be copy-constructed). + */ + PBD::Signal2<void,framecnt_t, framecnt_t> LatencyChanged; + + /* overload Latent::set_user_latency w/signal emission */ + virtual void set_user_latency (framecnt_t val) { + bool changed = val != _user_latency; + framecnt_t old = effective_latency (); + _user_latency = val; + if (changed) { + LatencyChanged (old, effective_latency ()); /* EMIT SIGNAL */ + } + } + + /** the max possible latency a plugin will have */ + virtual framecnt_t max_latency () const { return 0; } // TODO = 0, require implementation + /** Emitted when a preset is added or removed, respectively */ PBD::Signal0<void> PresetAdded; PBD::Signal0<void> PresetRemoved; diff --git a/libs/ardour/lv2_plugin.cc b/libs/ardour/lv2_plugin.cc index 46582a5fcf..e13328b97b 100644 --- a/libs/ardour/lv2_plugin.cc +++ b/libs/ardour/lv2_plugin.cc @@ -365,6 +365,8 @@ LV2Plugin::init(const void* c_plugin, framecnt_t rate) _was_activated = false; _has_state_interface = false; _can_write_automation = false; + _max_latency = 0; + _current_latency = 0; _impl->block_length = _session.get_block_size(); _instance_access_feature.URI = "http://lv2plug.in/ns/ext/instance-access"; @@ -673,6 +675,9 @@ LV2Plugin::init(const void* c_plugin, framecnt_t rate) lilv_instance_connect_port(_impl->instance, i, &_control_data[i]); if (latent && i == latency_index) { + LilvNode *max; + lilv_port_get_range(_impl->plugin, port, NULL, NULL, &max); + _max_latency = max ? lilv_node_as_float(max) : .02 * _sample_rate; _latency_control_port = &_control_data[i]; *_latency_control_port = 0; } @@ -2009,6 +2014,12 @@ LV2Plugin::describe_parameter(Evoral::Parameter which) } framecnt_t +LV2Plugin::max_latency () const +{ + return _max_latency; +} + +framecnt_t LV2Plugin::signal_latency() const { if (_latency_control_port) { @@ -2546,6 +2557,13 @@ LV2Plugin::connect_and_run(BufferSet& bufs, _next_cycle_speed = _session.transport_speed(); _next_cycle_start = _session.transport_frame() + (nframes * _next_cycle_speed); + if (_latency_control_port) { + framecnt_t new_latency = signal_latency (); + if (_current_latency != new_latency) { + LatencyChanged (_current_latency, new_latency); /* EMIT SIGNAL */ + } + _current_latency = new_latency; + } return 0; } |