summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libs/ardour/ardour/plugin_insert.h3
-rw-r--r--libs/ardour/plugin_insert.cc22
-rw-r--r--libs/ardour/route.cc5
3 files changed, 30 insertions, 0 deletions
diff --git a/libs/ardour/ardour/plugin_insert.h b/libs/ardour/ardour/plugin_insert.h
index 70bbd76a71..2905f012bf 100644
--- a/libs/ardour/ardour/plugin_insert.h
+++ b/libs/ardour/ardour/plugin_insert.h
@@ -153,6 +153,7 @@ class LIBARDOUR_API PluginInsert : public Processor
bool set_preset_out (const ChanCount&);
bool add_sidechain (uint32_t n_audio = 1);
bool del_sidechain ();
+ void set_sidechain_latency (uint32_t, uint32_t);
boost::shared_ptr<SideChain> sidechain () const { return _sidechain; }
// end C++ class slavery!
@@ -302,6 +303,8 @@ class LIBARDOUR_API PluginInsert : public Processor
Plugins _plugins;
boost::shared_ptr<SideChain> _sidechain;
+ uint32_t _sc_playback_latency;
+ uint32_t _sc_capture_latency;
boost::weak_ptr<Plugin> _impulseAnalysisPlugin;
diff --git a/libs/ardour/plugin_insert.cc b/libs/ardour/plugin_insert.cc
index 291ccbfc54..38c3b684ed 100644
--- a/libs/ardour/plugin_insert.cc
+++ b/libs/ardour/plugin_insert.cc
@@ -67,6 +67,8 @@ const string PluginInsert::port_automation_node_name = "PortAutomation";
PluginInsert::PluginInsert (Session& s, boost::shared_ptr<Plugin> plug)
: Processor (s, (plug ? plug->name() : string ("toBeRenamed")))
+ , _sc_playback_latency (0)
+ , _sc_capture_latency (0)
, _signal_analysis_collected_nframes(0)
, _signal_analysis_collect_nframes_max(0)
, _configured (false)
@@ -215,11 +217,31 @@ PluginInsert::del_sidechain ()
return false;
}
_sidechain.reset ();
+ _sc_playback_latency = 0;
+ _sc_capture_latency = 0;
PluginConfigChanged (); /* EMIT SIGNAL */
return true;
}
void
+PluginInsert::set_sidechain_latency (uint32_t capture, uint32_t playback)
+{
+ if (_sidechain &&
+ (_sc_playback_latency != playback || _sc_capture_latency != capture)) {
+ _sc_capture_latency = capture;
+ _sc_playback_latency = playback;
+ LatencyRange pl; pl.min = pl.max = playback;
+ LatencyRange cl; cl.min = cl.max = capture;
+ DEBUG_TRACE (DEBUG::Latency, string_compose ("%1: capture %2 playback; %3\n", _sidechain->name (), capture, playback));
+ PortSet& ps (_sidechain->input ()->ports ());
+ for (PortSet::iterator p = ps.begin(); p != ps.end(); ++p) {
+ p->set_private_latency_range (pl, true);
+ p->set_private_latency_range (cl, false);
+ }
+ }
+}
+
+void
PluginInsert::control_list_automation_state_changed (Evoral::Parameter which, AutoState s)
{
if (which.type() != PluginAutomation)
diff --git a/libs/ardour/route.cc b/libs/ardour/route.cc
index 988f3251ef..6209b9f911 100644
--- a/libs/ardour/route.cc
+++ b/libs/ardour/route.cc
@@ -444,6 +444,11 @@ Route::process_output_buffers (BufferSet& bufs,
if (boost::dynamic_pointer_cast<Send>(*i) != 0) {
boost::dynamic_pointer_cast<Send>(*i)->set_delay_in(_signal_latency - latency);
}
+ if (boost::dynamic_pointer_cast<PluginInsert>(*i) != 0) {
+ const framecnt_t longest_session_latency = _initial_delay + _signal_latency;
+ boost::dynamic_pointer_cast<PluginInsert>(*i)->set_sidechain_latency (
+ _initial_delay + latency, longest_session_latency - latency);
+ }
(*i)->run (bufs, start_frame - latency, end_frame - latency, nframes, *i != _processors.back());
bufs.set_count ((*i)->output_streams());