diff options
-rw-r--r-- | libs/ardour/amp.cc | 9 | ||||
-rw-r--r-- | libs/ardour/ardour/automatable.h | 8 | ||||
-rw-r--r-- | libs/ardour/ardour/processor.h | 2 | ||||
-rw-r--r-- | libs/ardour/automatable.cc | 15 | ||||
-rw-r--r-- | libs/ardour/automation_control.cc | 1 | ||||
-rw-r--r-- | libs/ardour/plugin_insert.cc | 1 | ||||
-rw-r--r-- | libs/ardour/route.cc | 9 | ||||
-rw-r--r-- | libs/ardour/session_process.cc | 17 |
8 files changed, 55 insertions, 7 deletions
diff --git a/libs/ardour/amp.cc b/libs/ardour/amp.cc index 8760c2d426..705e79af73 100644 --- a/libs/ardour/amp.cc +++ b/libs/ardour/amp.cc @@ -90,6 +90,9 @@ Amp::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end_frame*/, gain_t* gab = _gain_automation_buffer; assert (gab); + /* see note in PluginInsert::connect_and_run -- emit Changed signal */ + _gain_control->set_value_unchecked (gab[0]); + if (_midi_amp) { for (BufferSet::midi_iterator i = bufs.midi_begin(); i != bufs.midi_end(); ++i) { MidiBuffer& mb (*i); @@ -130,6 +133,12 @@ Amp::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end_frame*/, _current_gain = Amp::apply_gain (bufs, _session.nominal_frame_rate(), nframes, _current_gain, dg, _midi_amp); + /* see note in PluginInsert::connect_and_run () + * set_value_unchecked() won't emit a signal since the value is effectively unchanged + */ + + _gain_control->Changed (false, PBD::Controllable::NoGroup); + } else if (_current_gain != GAIN_COEFF_UNITY) { /* gain has not changed, but its non-unity */ diff --git a/libs/ardour/ardour/automatable.h b/libs/ardour/ardour/automatable.h index 1acb8a60dc..bdc0edf4da 100644 --- a/libs/ardour/ardour/automatable.h +++ b/libs/ardour/ardour/automatable.h @@ -50,7 +50,7 @@ public: Automatable(Session&); Automatable (const Automatable& other); - virtual ~Automatable(); + virtual ~Automatable(); boost::shared_ptr<Evoral::Control> control_factory(const Evoral::Parameter& id); @@ -83,9 +83,11 @@ public: virtual bool find_next_event (double start, double end, Evoral::ControlEvent& ev, bool only_active = true) const; void clear_controls (); - virtual void transport_located (framepos_t now); + virtual void transport_located (framepos_t now); virtual void transport_stopped (framepos_t now); + virtual void automation_run (framepos_t, pframes_t); + virtual std::string describe_parameter(Evoral::Parameter param); AutoState get_parameter_automation_state (Evoral::Parameter param); @@ -103,7 +105,7 @@ public: PBD::Signal0<void> AutomationStateChanged; - protected: +protected: Session& _a_session; void can_automate(Evoral::Parameter); diff --git a/libs/ardour/ardour/processor.h b/libs/ardour/ardour/processor.h index 97dda32c29..9f25243327 100644 --- a/libs/ardour/ardour/processor.h +++ b/libs/ardour/ardour/processor.h @@ -77,7 +77,7 @@ class LIBARDOUR_API Processor : public SessionObject, public Automatable, public * if false, the method need not bother writing to @a bufs if it doesn't want to. */ virtual void run (BufferSet& /*bufs*/, framepos_t /*start_frame*/, framepos_t /*end_frame*/, double speed, pframes_t /*nframes*/, bool /*result_required*/) {} - virtual void silence (framecnt_t /*nframes*/, framepos_t /*start_frame*/) {} + virtual void silence (framecnt_t nframes, framepos_t start_frame) { automation_run (start_frame, nframes); } virtual void activate () { _pending_active = true; ActiveChanged(); } virtual void deactivate () { _pending_active = false; ActiveChanged(); } diff --git a/libs/ardour/automatable.cc b/libs/ardour/automatable.cc index 3045e8573c..908ca18137 100644 --- a/libs/ardour/automatable.cc +++ b/libs/ardour/automatable.cc @@ -345,7 +345,7 @@ Automatable::transport_located (framepos_t now) boost::shared_ptr<AutomationControl> c = boost::dynamic_pointer_cast<AutomationControl>(li->second); if (c) { - boost::shared_ptr<AutomationList> l + boost::shared_ptr<AutomationList> l = boost::dynamic_pointer_cast<AutomationList>(c->list()); if (l) { @@ -395,6 +395,19 @@ Automatable::transport_stopped (framepos_t now) } } +void +Automatable::automation_run (framepos_t start, pframes_t nframes) +{ + for (Controls::iterator li = controls().begin(); li != controls().end(); ++li) { + boost::shared_ptr<AutomationControl> c = + boost::dynamic_pointer_cast<AutomationControl>(li->second); + if (!c) { + continue; + } + c->automation_run (start, nframes); + } +} + boost::shared_ptr<Evoral::Control> Automatable::control_factory(const Evoral::Parameter& param) { diff --git a/libs/ardour/automation_control.cc b/libs/ardour/automation_control.cc index dbff577ead..c3ad2481d6 100644 --- a/libs/ardour/automation_control.cc +++ b/libs/ardour/automation_control.cc @@ -260,6 +260,7 @@ AutomationControl::set_automation_state (AutoState as) } } else { AutomationWatch::instance().remove_automation_watch (shared_from_this()); + Changed (false, Controllable::NoGroup); } } } diff --git a/libs/ardour/plugin_insert.cc b/libs/ardour/plugin_insert.cc index a29381e674..6b733ee1d1 100644 --- a/libs/ardour/plugin_insert.cc +++ b/libs/ardour/plugin_insert.cc @@ -1170,6 +1170,7 @@ PluginInsert::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame } else { bypass (bufs, nframes); + automation_run (start_frame, nframes); _delaybuffers.flush (); } diff --git a/libs/ardour/route.cc b/libs/ardour/route.cc index 34c2b2f823..9bd5c49cea 100644 --- a/libs/ardour/route.cc +++ b/libs/ardour/route.cc @@ -322,7 +322,7 @@ Route::process_output_buffers (BufferSet& bufs, return; } - _mute_control->automation_run (start_frame, nframes); + automation_run (start_frame, nframes); /* figure out if we're going to use gain automation */ if (gain_automation_ok) { @@ -2980,11 +2980,16 @@ Route::silence_unlocked (framecnt_t nframes) _output->silence (nframes); + // update owned automated controllables + automation_run (now, nframes); + for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) { boost::shared_ptr<PluginInsert> pi; if (!_active && (pi = boost::dynamic_pointer_cast<PluginInsert> (*i)) != 0) { - // skip plugins, they don't need anything when we're not active + /* evaluate automated automation controls */ + pi->automation_run (now, nframes); + /* skip plugins, they don't need anything when we're not active */ continue; } diff --git a/libs/ardour/session_process.cc b/libs/ardour/session_process.cc index fabf4d7d01..f74bfd2d73 100644 --- a/libs/ardour/session_process.cc +++ b/libs/ardour/session_process.cc @@ -40,6 +40,8 @@ #include "ardour/slave.h" #include "ardour/ticker.h" #include "ardour/types.h" +#include "ardour/vca.h" +#include "ardour/vca_manager.h" #include "midi++/mmc.h" @@ -142,6 +144,11 @@ Session::no_roll (pframes_t nframes) ltc_tx_send_time_code_for_cycle (_transport_frame, end_frame, _target_transport_speed, _transport_speed, nframes); + VCAList v = _vca_manager->vcas (); + for (VCAList::const_iterator i = v.begin(); i != v.end(); ++i) { + (*i)->automation_run (_transport_frame, nframes); + } + if (_process_graph) { DEBUG_TRACE(DEBUG::ProcessThreads,"calling graph/no-roll\n"); _process_graph->routes_no_roll( nframes, _transport_frame, end_frame, non_realtime_work_pending(), declick); @@ -180,6 +187,11 @@ Session::process_routes (pframes_t nframes, bool& need_butler) const framepos_t start_frame = _transport_frame; const framepos_t end_frame = _transport_frame + floor (nframes * _transport_speed); + VCAList v = _vca_manager->vcas (); + for (VCAList::const_iterator i = v.begin(); i != v.end(); ++i) { + (*i)->automation_run (start_frame, nframes); + } + if (_process_graph) { DEBUG_TRACE(DEBUG::ProcessThreads,"calling graph/process-routes\n"); if (_process_graph->process_routes (nframes, start_frame, end_frame, declick, need_butler) < 0) { @@ -225,6 +237,11 @@ Session::silent_process_routes (pframes_t nframes, bool& need_butler) const framepos_t start_frame = _transport_frame; const framepos_t end_frame = _transport_frame + lrintf(nframes * _transport_speed); + VCAList v = _vca_manager->vcas (); + for (VCAList::const_iterator i = v.begin(); i != v.end(); ++i) { + (*i)->automation_run (start_frame, nframes); + } + if (_process_graph) { _process_graph->silent_process_routes (nframes, start_frame, end_frame, need_butler); } else { |