diff --git a/libs/ardour/ardour/send.h b/libs/ardour/ardour/send.h index 9423791d82..850be65cba 100644 --- a/libs/ardour/ardour/send.h +++ b/libs/ardour/ardour/send.h @@ -48,6 +48,7 @@ public: boost::shared_ptr amp() const { return _amp; } boost::shared_ptr meter() const { return _meter; } boost::shared_ptr gain_control() const { return _gain_control; } + boost::shared_ptr delay_control() const { return _delay_control; } bool metering() const { return _metering; } void set_metering (bool yn) { _metering = yn; } @@ -72,6 +73,10 @@ public: samplecnt_t get_delay_out () const { return _delay_out; } samplecnt_t signal_latency () const; + /* custom user-set delay */ + samplecnt_t get_delay_extra () const { return _delay_extra; } + void set_delay_extra (samplecnt_t); + static PBD::Signal0 ChangedLatency; void activate (); @@ -87,6 +92,7 @@ protected: bool _metering; boost::shared_ptr _gain_control; + boost::shared_ptr _delay_control; boost::shared_ptr _amp; boost::shared_ptr _meter; boost::shared_ptr _send_delay; @@ -107,6 +113,7 @@ private: samplecnt_t _delay_in; samplecnt_t _delay_out; + samplecnt_t _delay_extra; bool _remove_on_disconnect; }; diff --git a/libs/ardour/internal_send.cc b/libs/ardour/internal_send.cc index e7b824f1b0..6cb1d12f55 100644 --- a/libs/ardour/internal_send.cc +++ b/libs/ardour/internal_send.cc @@ -250,6 +250,8 @@ InternalSend::run (BufferSet& bufs, samplepos_t start_sample, samplepos_t end_sa _amp->setup_gain_automation (start_sample, end_sample, nframes); _amp->run (mixbufs, start_sample, end_sample, speed, nframes, true); + set_delay_extra (_delay_control->get_value ()); + _send_delay->run (mixbufs, start_sample, end_sample, speed, nframes, true); /* consider metering */ diff --git a/libs/ardour/luabindings.cc b/libs/ardour/luabindings.cc index 4d4b5f8ee2..872a815a94 100644 --- a/libs/ardour/luabindings.cc +++ b/libs/ardour/luabindings.cc @@ -1398,6 +1398,8 @@ LuaBindings::common (lua_State* L) .deriveWSPtrClass ("Send") .addFunction ("get_delay_in", &Send::get_delay_in) .addFunction ("get_delay_out", &Send::get_delay_out) + .addFunction ("get_delay_extra", &Send::get_delay_extra) + .addFunction ("set_delay_extra", &Send::set_delay_extra) .endClass () .deriveWSPtrClass ("InternalSend") diff --git a/libs/ardour/send.cc b/libs/ardour/send.cc index 1bf1dadf4b..e2b5290cca 100644 --- a/libs/ardour/send.cc +++ b/libs/ardour/send.cc @@ -82,6 +82,7 @@ Send::Send (Session& s, boost::shared_ptr p, boost::shared_ptr p, boost::shared_ptr (new GainControl (_session, Evoral::Parameter(GainAutomation), gl)); add_control (_gain_control); + ParameterDescriptor dd; + dd.normal = 0; + dd.lower = 0; + dd.upper = _session.nominal_sample_rate () / 10; // max: 100ms + + boost::shared_ptr dl (new AutomationList (Evoral::Parameter (PluginAutomation))); + _delay_control = boost::shared_ptr (new AutomationControl (_session, Evoral::Parameter(PluginAutomation), dd, dl, "Delay")); + add_control (_delay_control); + _amp.reset (new Amp (_session, _("Fader"), _gain_control, true)); _meter.reset (new PeakMeter (_session, name())); @@ -168,10 +178,10 @@ Send::update_delaylines () bool changed; if (_delay_out > _delay_in) { changed = _thru_delay->set_delay(_delay_out - _delay_in); - _send_delay->set_delay(0); + _send_delay->set_delay(_delay_extra); } else { changed = _thru_delay->set_delay(0); - _send_delay->set_delay(_delay_in - _delay_out); + _send_delay->set_delay(_delay_extra + _delay_in - _delay_out); } if (changed) { @@ -211,6 +221,17 @@ Send::set_delay_out (samplecnt_t delay) update_delaylines (); } +void +Send::set_delay_extra (samplecnt_t delay) +{ + if (_delay_extra == delay) { + return; + } + _delay_extra = delay; + printf ("SET EXTRA DELAT %d\n", _delay_extra); + update_delaylines (); +} + void Send::run (BufferSet& bufs, samplepos_t start_sample, samplepos_t end_sample, double speed, pframes_t nframes, bool) { @@ -240,6 +261,8 @@ Send::run (BufferSet& bufs, samplepos_t start_sample, samplepos_t end_sample, do _amp->setup_gain_automation (start_sample, end_sample, nframes); _amp->run (sendbufs, start_sample, end_sample, speed, nframes, true); + set_delay_extra (_delay_control->get_value ()); + _send_delay->run (sendbufs, start_sample, end_sample, speed, nframes, true); /* deliver to outputs */ diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc index da4421d4a2..96297a9241 100644 --- a/libs/ardour/session.cc +++ b/libs/ardour/session.cc @@ -5639,6 +5639,7 @@ Session::graph_reordered () /* force all diskstreams to update their capture offset values to * reflect any changes in latencies within the graph. */ + Glib::Threads::Mutex::Lock lm (_engine.process_lock()); update_route_latency (false, true); }