From a9c09af816b3d7da40221ac4a2bb4c6074708d89 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Thu, 16 Jun 2016 15:08:10 +0200 Subject: [PATCH] set latency of sidechain port --- libs/ardour/ardour/plugin_insert.h | 3 +++ libs/ardour/plugin_insert.cc | 22 ++++++++++++++++++++++ libs/ardour/route.cc | 5 +++++ 3 files changed, 30 insertions(+) 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 () const { return _sidechain; } // end C++ class slavery! @@ -302,6 +303,8 @@ class LIBARDOUR_API PluginInsert : public Processor Plugins _plugins; boost::shared_ptr _sidechain; + uint32_t _sc_playback_latency; + uint32_t _sc_capture_latency; boost::weak_ptr _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 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,10 +217,30 @@ 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) { 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(*i) != 0) { boost::dynamic_pointer_cast(*i)->set_delay_in(_signal_latency - latency); } + if (boost::dynamic_pointer_cast(*i) != 0) { + const framecnt_t longest_session_latency = _initial_delay + _signal_latency; + boost::dynamic_pointer_cast(*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()); -- 2.30.2