summaryrefslogtreecommitdiff
path: root/libs
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2016-07-09 04:42:21 +0200
committerRobin Gareus <robin@gareus.org>2016-07-09 04:42:21 +0200
commit56c4eebfdd1033b9dd92ddcdf8698dda38545997 (patch)
tree03a41abf570ad6805fa6a5e8db038e3aa8b3d5a8 /libs
parent49c9569039f9c7d51e969affa447b270de9e60da (diff)
move LatencyChanged detection from Plugin to Processor (plugin-insert)
* support all Plugin APIs (not implementation specific) * also check for latency changes when plugins are hard en/disabled
Diffstat (limited to 'libs')
-rw-r--r--libs/ardour/ardour/plugin.h17
-rw-r--r--libs/ardour/ardour/plugin_insert.h3
-rw-r--r--libs/ardour/lv2_plugin.cc3
-rw-r--r--libs/ardour/plugin_insert.cc24
4 files changed, 24 insertions, 23 deletions
diff --git a/libs/ardour/ardour/plugin.h b/libs/ardour/ardour/plugin.h
index bc32d7c3e6..df4b512ef7 100644
--- a/libs/ardour/ardour/plugin.h
+++ b/libs/ardour/ardour/plugin.h
@@ -225,23 +225,6 @@ 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
diff --git a/libs/ardour/ardour/plugin_insert.h b/libs/ardour/ardour/plugin_insert.h
index 6f7b10cd46..564feb0c63 100644
--- a/libs/ardour/ardour/plugin_insert.h
+++ b/libs/ardour/ardour/plugin_insert.h
@@ -310,6 +310,7 @@ class LIBARDOUR_API PluginInsert : public Processor
boost::shared_ptr<SideChain> _sidechain;
uint32_t _sc_playback_latency;
uint32_t _sc_capture_latency;
+ uint32_t _plugin_signal_latency;
boost::weak_ptr<Plugin> _impulseAnalysisPlugin;
@@ -368,7 +369,7 @@ class LIBARDOUR_API PluginInsert : public Processor
void start_touch (uint32_t param_id);
void end_touch (uint32_t param_id);
- void latency_changed (framecnt_t, framecnt_t);
+ void latency_changed ();
bool _latency_changed;
uint32_t _bypass_port;
};
diff --git a/libs/ardour/lv2_plugin.cc b/libs/ardour/lv2_plugin.cc
index d27c045750..c6c2a6b127 100644
--- a/libs/ardour/lv2_plugin.cc
+++ b/libs/ardour/lv2_plugin.cc
@@ -2707,9 +2707,6 @@ LV2Plugin::connect_and_run(BufferSet& bufs,
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;
diff --git a/libs/ardour/plugin_insert.cc b/libs/ardour/plugin_insert.cc
index a8757fc97e..eaeb6d89af 100644
--- a/libs/ardour/plugin_insert.cc
+++ b/libs/ardour/plugin_insert.cc
@@ -69,6 +69,7 @@ PluginInsert::PluginInsert (Session& s, boost::shared_ptr<Plugin> plug)
: Processor (s, (plug ? plug->name() : string ("toBeRenamed")))
, _sc_playback_latency (0)
, _sc_capture_latency (0)
+ , _plugin_signal_latency (0)
, _signal_analysis_collected_nframes(0)
, _signal_analysis_collect_nframes_max(0)
, _configured (false)
@@ -551,6 +552,10 @@ PluginInsert::activate ()
}
Processor::activate ();
+ if (_plugin_signal_latency != signal_latency ()) {
+ _plugin_signal_latency = signal_latency ();
+ latency_changed ();
+ }
}
void
@@ -561,6 +566,10 @@ PluginInsert::deactivate ()
for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
(*i)->deactivate ();
}
+ if (_plugin_signal_latency != signal_latency ()) {
+ _plugin_signal_latency = signal_latency ();
+ latency_changed ();
+ }
}
void
@@ -914,6 +923,11 @@ PluginInsert::connect_and_run (BufferSet& bufs, framepos_t start, framepos_t end
&_signal_analysis_outputs);
}
}
+
+ if (_plugin_signal_latency != signal_latency ()) {
+ _plugin_signal_latency = signal_latency ();
+ latency_changed ();
+ }
}
void
@@ -2699,6 +2713,9 @@ PluginInsert::describe_parameter (Evoral::Parameter param)
ARDOUR::framecnt_t
PluginInsert::signal_latency() const
{
+ if (!_pending_active) {
+ return 0;
+ }
if (_user_latency) {
return _user_latency;
}
@@ -2878,7 +2895,6 @@ PluginInsert::add_plugin (boost::shared_ptr<Plugin> plugin)
plugin->ParameterChangedExternally.connect_same_thread (*this, boost::bind (&PluginInsert::parameter_changed_externally, this, _1, _2));
plugin->StartTouch.connect_same_thread (*this, boost::bind (&PluginInsert::start_touch, this, _1));
plugin->EndTouch.connect_same_thread (*this, boost::bind (&PluginInsert::end_touch, this, _1));
- plugin->LatencyChanged.connect_same_thread (*this, boost::bind (&PluginInsert::latency_changed, this, _1, _2));
_custom_sinks = plugin->get_info()->n_inputs;
// cache sidechain port count
_cached_sidechain_pins.reset ();
@@ -2939,10 +2955,14 @@ PluginInsert::monitoring_changed ()
}
void
-PluginInsert::latency_changed (framecnt_t, framecnt_t)
+PluginInsert::latency_changed ()
{
// this is called in RT context, LatencyChanged is emitted after run()
_latency_changed = true;
+#if 0 // TODO check possible deadlock in RT-context
+ // XXX This also needs a proper API not an owner() hack.
+ static_cast<Route*>(owner ())->processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
+#endif
}
void