diff options
author | Robin Gareus <robin@gareus.org> | 2016-06-16 15:08:10 +0200 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2016-06-16 15:08:25 +0200 |
commit | a9c09af816b3d7da40221ac4a2bb4c6074708d89 (patch) | |
tree | 83335b2ddbb497bc48d85fd311cc090ba1d4fad0 | |
parent | 321615e8eabc9c0085979af8af842d16433b1d1c (diff) |
set latency of sidechain port
-rw-r--r-- | libs/ardour/ardour/plugin_insert.h | 3 | ||||
-rw-r--r-- | libs/ardour/plugin_insert.cc | 22 | ||||
-rw-r--r-- | libs/ardour/route.cc | 5 |
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()); |