set latency of sidechain port
authorRobin Gareus <robin@gareus.org>
Thu, 16 Jun 2016 13:08:10 +0000 (15:08 +0200)
committerRobin Gareus <robin@gareus.org>
Thu, 16 Jun 2016 13:08:25 +0000 (15:08 +0200)
libs/ardour/ardour/plugin_insert.h
libs/ardour/plugin_insert.cc
libs/ardour/route.cc

index 70bbd76a714fce8c69fe0de33bd965f9129db6e4..2905f012bfd2b95a0ebd70d1b081f958301c8210 100644 (file)
@@ -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;
 
index 291ccbfc54d0c3302614a92b781846292154f559..38c3b684eda9e898ac2f92eac28025f019959a90 100644 (file)
@@ -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,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)
 {
index 988f3251ef965f2abb88647fdb4fa3bf47f58c32..6209b9f91159a11507e14b31c7dfeee9a1109fcd 100644 (file)
@@ -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());