summaryrefslogtreecommitdiff
path: root/libs/ardour
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2016-04-08 18:16:01 +0200
committerRobin Gareus <robin@gareus.org>2016-04-08 18:16:01 +0200
commit752662051a1d7217ce842ded78d1ee8e041a112f (patch)
tree019ab4d6d311648969f193992fccd1bc97502249 /libs/ardour
parent75273762976933841b5c0b244c4e8f29158e5519 (diff)
add Plugin LatencyChanged() signal and max latency report
Diffstat (limited to 'libs/ardour')
-rw-r--r--libs/ardour/ardour/lv2_plugin.h3
-rw-r--r--libs/ardour/ardour/plugin.h20
-rw-r--r--libs/ardour/lv2_plugin.cc18
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;
}