From f41149628955fc8145bef6db0c110b71664c0a3a Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Tue, 21 Jul 2009 14:39:21 +0000 Subject: [PATCH] fix clicking when processors become active/inactive; reduce crazy 2.5sec delay for quit dialog git-svn-id: svn://localhost/ardour2/branches/3.0@5402 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/ardour_ui.cc | 2 +- gtk2_ardour/gain_meter.cc | 67 ++++++++++++++++++++-------------- gtk2_ardour/gain_meter.h | 9 ++--- gtk2_ardour/mixer_strip.cc | 8 ++-- gtk2_ardour/processor_box.cc | 2 +- gtk2_ardour/return_ui.cc | 2 +- gtk2_ardour/route_time_axis.cc | 2 +- gtk2_ardour/send_ui.cc | 2 +- gtk2_ardour/sfdb_ui.cc | 2 +- libs/ardour/amp.cc | 4 +- libs/ardour/ardour/processor.h | 6 +-- libs/ardour/delivery.cc | 29 +++++++++++---- libs/ardour/internal_return.cc | 7 +++- libs/ardour/internal_send.cc | 7 +++- libs/ardour/meter.cc | 4 +- libs/ardour/plugin_insert.cc | 5 ++- libs/ardour/port_insert.cc | 7 +++- libs/ardour/processor.cc | 3 ++ libs/ardour/return.cc | 4 +- libs/ardour/send.cc | 12 +++++- 20 files changed, 121 insertions(+), 63 deletions(-) diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index 1335dce36f..2a2b3cc10b 100644 --- a/gtk2_ardour/ardour_ui.cc +++ b/gtk2_ardour/ardour_ui.cc @@ -733,7 +733,7 @@ ARDOUR_UI::finish() if (session->transport_rolling()) { session->request_stop (); - usleep (2500000); + usleep (250000); } if (session->dirty()) { diff --git a/gtk2_ardour/gain_meter.cc b/gtk2_ardour/gain_meter.cc index 6ed8893752..e6f0c74042 100644 --- a/gtk2_ardour/gain_meter.cc +++ b/gtk2_ardour/gain_meter.cc @@ -19,6 +19,7 @@ #include +#include "ardour/amp.h" #include "ardour/io.h" #include "ardour/route.h" #include "ardour/route_group.h" @@ -162,27 +163,26 @@ GainMeterBase::~GainMeterBase () void GainMeterBase::set_controls (boost::shared_ptr r, boost::shared_ptr pm, - boost::shared_ptr gc, - boost::shared_ptr gc_owner) + boost::shared_ptr amp) { connections.clear (); - if (!pm && !gc) { + if (!pm && !amp) { level_meter->set_meter (0); gain_slider->set_controllable (boost::shared_ptr()); _meter.reset (); - _gain_control.reset (); + _amp.reset (); _route.reset (); return; } _meter = pm; - _gain_control = gc; + _amp = amp; _route = r; level_meter->set_meter (pm.get()); - gain_slider->set_controllable (gc); - + gain_slider->set_controllable (amp->gain_control()); + if (!_route || !_route->is_hidden()) { using namespace Menu_Helpers; @@ -190,28 +190,30 @@ GainMeterBase::set_controls (boost::shared_ptr r, gain_astate_menu.items().clear (); gain_astate_menu.items().push_back (MenuElem (_("Manual"), - bind (mem_fun (*(gc_owner.get()), &Automatable::set_parameter_automation_state), + bind (mem_fun (*(amp.get()), &Automatable::set_parameter_automation_state), Evoral::Parameter(GainAutomation), (AutoState) Off))); gain_astate_menu.items().push_back (MenuElem (_("Play"), - bind (mem_fun (*(gc_owner.get()), &Automatable::set_parameter_automation_state), + bind (mem_fun (*(amp.get()), &Automatable::set_parameter_automation_state), Evoral::Parameter(GainAutomation), (AutoState) Play))); gain_astate_menu.items().push_back (MenuElem (_("Write"), - bind (mem_fun (*(gc_owner.get()), &Automatable::set_parameter_automation_state), + bind (mem_fun (*(amp.get()), &Automatable::set_parameter_automation_state), Evoral::Parameter(GainAutomation), (AutoState) Write))); gain_astate_menu.items().push_back (MenuElem (_("Touch"), - bind (mem_fun (*(gc_owner.get()), &Automatable::set_parameter_automation_state), + bind (mem_fun (*(amp.get()), &Automatable::set_parameter_automation_state), Evoral::Parameter(GainAutomation), (AutoState) Touch))); connections.push_back (gain_automation_style_button.signal_button_press_event().connect (mem_fun(*this, &GainMeterBase::gain_automation_style_button_event), false)); connections.push_back (gain_automation_state_button.signal_button_press_event().connect (mem_fun(*this, &GainMeterBase::gain_automation_state_button_event), false)); - + + boost::shared_ptr gc = amp->gain_control(); + connections.push_back (gc->alist()->automation_state_changed.connect (mem_fun(*this, &GainMeter::gain_automation_state_changed))); connections.push_back (gc->alist()->automation_style_changed.connect (mem_fun(*this, &GainMeter::gain_automation_style_changed))); gain_automation_state_changed (); } - connections.push_back (gc->Changed.connect (mem_fun (*this, &GainMeterBase::gain_changed))); + connections.push_back (amp->gain_control()->Changed.connect (mem_fun (*this, &GainMeterBase::gain_changed))); gain_changed (); show_gain (); @@ -344,7 +346,7 @@ GainMeterBase::gain_activated () f = min (f, 6.0f); - _gain_control->set_value (dB_to_coefficient(f)); + _amp->set_gain (dB_to_coefficient(f), this); if (gain_display.has_focus()) { PublicEditor::instance().reset_focus(); @@ -372,7 +374,13 @@ void GainMeterBase::gain_adjusted () { if (!ignore_toggle) { - _gain_control->set_value (slider_position_to_gain (gain_adjustment.get_value())); + if (_route) { + if (_route->amp() == _amp) { + _route->set_gain (slider_position_to_gain (gain_adjustment.get_value()), this); + } else { + _amp->set_gain (slider_position_to_gain (gain_adjustment.get_value()), this); + } + } } show_gain (); @@ -381,7 +389,7 @@ GainMeterBase::gain_adjusted () void GainMeterBase::effective_gain_display () { - gfloat value = gain_to_slider_position (_gain_control->get_value()); + gfloat value = gain_to_slider_position (_amp->gain()); //cerr << this << " for " << _io->name() << " EGAIN = " << value // << " AGAIN = " << gain_adjustment.get_value () << endl; @@ -415,7 +423,7 @@ GainMeterBase::set_fader_name (const char * name) void GainMeterBase::update_gain_sensitive () { - bool x = !(_gain_control->alist()->automation_state() & Play); + bool x = !(_amp->gain_control()->alist()->automation_state() & Play); static_cast(gain_slider)->set_sensitive (x); } @@ -557,14 +565,14 @@ GainMeterBase::meter_point_clicked () gint GainMeterBase::start_gain_touch (GdkEventButton* ev) { - _gain_control->start_touch (); + _amp->gain_control()->start_touch (); return FALSE; } gint GainMeterBase::end_gain_touch (GdkEventButton* ev) { - _gain_control->stop_touch (); + _amp->gain_control()->stop_touch (); return FALSE; } @@ -667,10 +675,10 @@ GainMeterBase::gain_automation_style_changed () { switch (_width) { case Wide: - gain_automation_style_button.set_label (astyle_string(_gain_control->alist()->automation_style())); + gain_automation_style_button.set_label (astyle_string(_amp->gain_control()->alist()->automation_style())); break; case Narrow: - gain_automation_style_button.set_label (short_astyle_string(_gain_control->alist()->automation_style())); + gain_automation_style_button.set_label (short_astyle_string(_amp->gain_control()->alist()->automation_style())); break; } } @@ -684,14 +692,14 @@ GainMeterBase::gain_automation_state_changed () switch (_width) { case Wide: - gain_automation_state_button.set_label (astate_string(_gain_control->alist()->automation_state())); + gain_automation_state_button.set_label (astate_string(_amp->gain_control()->alist()->automation_state())); break; case Narrow: - gain_automation_state_button.set_label (short_astate_string(_gain_control->alist()->automation_state())); + gain_automation_state_button.set_label (short_astate_string(_amp->gain_control()->alist()->automation_state())); break; } - x = (_gain_control->alist()->automation_state() != Off); + x = (_amp->gain_control()->alist()->automation_state() != Off); if (gain_automation_state_button.get_active() != x) { ignore_toggle = true; @@ -795,8 +803,7 @@ GainMeter::GainMeter (Session& s) void GainMeter::set_controls (boost::shared_ptr r, boost::shared_ptr meter, - boost::shared_ptr gain_control, - boost::shared_ptr gc_owner) + boost::shared_ptr amp) { if (level_meter->get_parent()) { hbox.remove (*level_meter); @@ -810,7 +817,7 @@ GainMeter::set_controls (boost::shared_ptr r, fader_vbox->remove (gain_automation_state_button); } - GainMeterBase::set_controls (r, meter, gain_control, gc_owner); + GainMeterBase::set_controls (r, meter, amp); /* if we have a non-hidden route (ie. we're not the click or the auditioner), @@ -915,7 +922,11 @@ GainMeter::meter_metrics_expose (GdkEventExpose *ev) boost::shared_ptr GainMeterBase::get_controllable() { - return _gain_control; + if (_amp) { + return _amp->gain_control(); + } else { + return boost::shared_ptr(); + } } diff --git a/gtk2_ardour/gain_meter.h b/gtk2_ardour/gain_meter.h index 7feaf5c0e4..4ce13af0d6 100644 --- a/gtk2_ardour/gain_meter.h +++ b/gtk2_ardour/gain_meter.h @@ -47,6 +47,7 @@ namespace ARDOUR { class Route; class RouteGroup; class PeakMeter; + class Amp; class Automatable; } namespace Gtkmm2ext { @@ -66,8 +67,7 @@ class GainMeterBase : virtual public sigc::trackable virtual void set_controls (boost::shared_ptr route, boost::shared_ptr meter, - boost::shared_ptr gain_control, - boost::shared_ptr gc_owner); + boost::shared_ptr amp); void update_gain_sensitive (); void update_meters (); @@ -89,7 +89,7 @@ class GainMeterBase : virtual public sigc::trackable friend class MixerStrip; boost::shared_ptr _route; boost::shared_ptr _meter; - boost::shared_ptr _gain_control; + boost::shared_ptr _amp; ARDOUR::Session& _session; std::vector connections; @@ -184,8 +184,7 @@ class GainMeter : public GainMeterBase, public Gtk::VBox virtual void set_controls (boost::shared_ptr route, boost::shared_ptr meter, - boost::shared_ptr gain_control, - boost::shared_ptr gc_owner); + boost::shared_ptr amp); int get_gm_width (); void setup_meters (int len=0); diff --git a/gtk2_ardour/mixer_strip.cc b/gtk2_ardour/mixer_strip.cc index b18e1699b2..7d6257bbd0 100644 --- a/gtk2_ardour/mixer_strip.cc +++ b/gtk2_ardour/mixer_strip.cc @@ -343,7 +343,7 @@ MixerStrip::set_route (boost::shared_ptr rt) _current_delivery = _route->main_outs (); panners.set_panner (rt->main_outs()->panner()); - gpm.set_controls (rt, rt->shared_peak_meter(), rt->gain_control(), rt->amp()); + gpm.set_controls (rt, rt->shared_peak_meter(), rt->amp()); processor_box.set_route (rt); if (set_color_from_route()) { @@ -1419,12 +1419,12 @@ MixerStrip::switch_io (boost::shared_ptr target) send = boost::dynamic_pointer_cast(_current_delivery); send->set_metering (true); _current_delivery->GoingAway.connect (mem_fun (*this, &MixerStrip::revert_to_default_display)); - gain_meter().set_controls (_route, send->meter(), send->amp()->gain_control(), send->amp()); + gain_meter().set_controls (_route, send->meter(), send->amp()); panner_ui().set_panner (_current_delivery->panner()); } else { _current_delivery = _route->main_outs (); - gain_meter().set_controls (_route, _route->shared_peak_meter(), _route->gain_control(), _route->amp()); + gain_meter().set_controls (_route, _route->shared_peak_meter(), _route->amp()); panner_ui().set_panner (_route->main_outs()->panner()); } @@ -1446,7 +1446,7 @@ MixerStrip::revert_to_default_display () _current_delivery = _route->main_outs(); - gain_meter().set_controls (_route, _route->shared_peak_meter(), _route->gain_control(), _route->amp()); + gain_meter().set_controls (_route, _route->shared_peak_meter(), _route->amp()); gain_meter().setup_meters (); panner_ui().set_panner (_route->main_outs()->panner()); panner_ui().setup_pan (); diff --git a/gtk2_ardour/processor_box.cc b/gtk2_ardour/processor_box.cc index 7b7d18f7e7..5f4762c18c 100644 --- a/gtk2_ardour/processor_box.cc +++ b/gtk2_ardour/processor_box.cc @@ -1383,7 +1383,7 @@ ProcessorBox::edit_processor (boost::shared_ptr processor) gidget = send_ui; #else if (_parent_strip) { - _parent_strip->gain_meter().set_controls (_route, send->meter(), send->amp()->gain_control(), send->amp()); + _parent_strip->gain_meter().set_controls (_route, send->meter(), send->amp()); _parent_strip->panner_ui().set_panner (send->panner()); } #endif diff --git a/gtk2_ardour/return_ui.cc b/gtk2_ardour/return_ui.cc index 155a1095c1..5d2e2d9826 100644 --- a/gtk2_ardour/return_ui.cc +++ b/gtk2_ardour/return_ui.cc @@ -38,7 +38,7 @@ ReturnUI::ReturnUI (boost::shared_ptr r, Session& se) , _session (se) , _gpm (se) { - _gpm.set_controls (boost::shared_ptr(), r->meter(), r->amp()->gain_control(), r->amp()); + _gpm.set_controls (boost::shared_ptr(), r->meter(), r->amp()); _hbox.pack_start (_gpm, true, true); set_name ("ReturnUIFrame"); diff --git a/gtk2_ardour/route_time_axis.cc b/gtk2_ardour/route_time_axis.cc index 87ba46ffb6..11be3086e5 100644 --- a/gtk2_ardour/route_time_axis.cc +++ b/gtk2_ardour/route_time_axis.cc @@ -114,7 +114,7 @@ RouteTimeAxisView::RouteTimeAxisView (PublicEditor& ed, Session& sess, boost::sh { set_button_names (); - gm.set_controls (_route, _route->shared_peak_meter(), _route->gain_control(), _route->amp()); + gm.set_controls (_route, _route->shared_peak_meter(), _route->amp()); gm.get_level_meter().set_no_show_all(); gm.get_level_meter().setup_meters(50); diff --git a/gtk2_ardour/send_ui.cc b/gtk2_ardour/send_ui.cc index 19baaa7f93..9192765999 100644 --- a/gtk2_ardour/send_ui.cc +++ b/gtk2_ardour/send_ui.cc @@ -40,7 +40,7 @@ SendUI::SendUI (boost::shared_ptr s, Session& se) , _panners (se) { _panners.set_panner (s->panner()); - _gpm.set_controls (boost::shared_ptr(), s->meter(), s->amp()->gain_control(), s->amp()); + _gpm.set_controls (boost::shared_ptr(), s->meter(), s->amp()); _hbox.pack_start (_gpm, true, true); set_name ("SendUIFrame"); diff --git a/gtk2_ardour/sfdb_ui.cc b/gtk2_ardour/sfdb_ui.cc index 817c710fd8..e0caced97a 100644 --- a/gtk2_ardour/sfdb_ui.cc +++ b/gtk2_ardour/sfdb_ui.cc @@ -598,7 +598,7 @@ SoundFileBrowser::add_gain_meter () boost::shared_ptr r = session->the_auditioner (); - gm->set_controls (r, r->shared_peak_meter(), r->gain_control(), r->amp()); + gm->set_controls (r, r->shared_peak_meter(), r->amp()); meter_packer.set_border_width (12); meter_packer.pack_start (*gm, false, true); diff --git a/libs/ardour/amp.cc b/libs/ardour/amp.cc index 9aa88068a9..cc63353886 100644 --- a/libs/ardour/amp.cc +++ b/libs/ardour/amp.cc @@ -75,7 +75,7 @@ Amp::run (BufferSet& bufs, sframes_t start_frame, sframes_t end_frame, nframes_t { gain_t mute_gain; - if (!_active) { + if (!_active && !_pending_active) { return; } @@ -159,6 +159,8 @@ Amp::run (BufferSet& bufs, sframes_t start_frame, sframes_t end_frame, nframes_t } } } + + _active = _pending_active; } void diff --git a/libs/ardour/ardour/processor.h b/libs/ardour/ardour/processor.h index 2df10e9c69..a97dcc4cf7 100644 --- a/libs/ardour/ardour/processor.h +++ b/libs/ardour/ardour/processor.h @@ -59,7 +59,7 @@ class Processor : public SessionObject, public AutomatableControls, public Laten virtual bool visible() const { return true; } virtual void set_visible (bool) {} - bool active () const { return _active; } + bool active () const { return _pending_active; } bool get_next_ab_is_active () const { return _next_ab_is_active; } void set_next_ab_is_active (bool yn) { _next_ab_is_active = yn; } @@ -73,8 +73,8 @@ class Processor : public SessionObject, public AutomatableControls, public Laten virtual void run (BufferSet& bufs, sframes_t start_frame, sframes_t end_frame, nframes_t nframes) {} virtual void silence (nframes_t nframes) {} - virtual void activate () { _active = true; ActiveChanged(); } - virtual void deactivate () { _active = false; ActiveChanged(); } + virtual void activate () { _pending_active = true; ActiveChanged(); } + virtual void deactivate () { _pending_active = false; ActiveChanged(); } virtual bool configure_io (ChanCount in, ChanCount out); diff --git a/libs/ardour/delivery.cc b/libs/ardour/delivery.cc index efe123c059..aff082f096 100644 --- a/libs/ardour/delivery.cc +++ b/libs/ardour/delivery.cc @@ -280,15 +280,22 @@ Delivery::run (BufferSet& bufs, sframes_t start_frame, sframes_t end_frame, nfra { assert (_output); - if (!_active || _output->n_ports ().get (_output->default_type()) == 0) { - return; + PortSet& ports (_output->ports()); + gain_t tgain; + + if (_output->n_ports ().get (_output->default_type()) == 0) { + goto out; + } + + if (!_active && !_pending_active) { + _output->silence (nframes); + goto out; } /* this setup is not just for our purposes, but for anything that comes after us in the processing pathway that wants to use this->output_buffers() for some reason. */ - PortSet& ports (_output->ports()); output_buffers().attach_buffers (ports, nframes, _output_offset); // this Delivery processor is not a derived type, and thus we assume @@ -296,7 +303,7 @@ Delivery::run (BufferSet& bufs, sframes_t start_frame, sframes_t end_frame, nfra // the main output stage of a Route). Contrast with Send::run() // which cannot do this. - gain_t tgain = target_gain (); + tgain = target_gain (); if (tgain != _current_gain) { @@ -310,11 +317,10 @@ Delivery::run (BufferSet& bufs, sframes_t start_frame, sframes_t end_frame, nfra /* we were quiet last time, and we're still supposed to be quiet. Silence the outputs, and make sure the buffers are quiet too, */ - + _output->silence (nframes); Amp::apply_simple_gain (bufs, nframes, 0.0); - - return; + goto out; } else if (tgain != 1.0) { @@ -341,6 +347,9 @@ Delivery::run (BufferSet& bufs, sframes_t start_frame, sframes_t end_frame, nfra _output->copy_to_outputs (bufs, DataType::MIDI, nframes, _output_offset); } } + + out: + _active = _pending_active; } XMLNode& @@ -495,6 +504,12 @@ Delivery::flush (nframes_t nframes) gain_t Delivery::target_gain () { + /* if we've been requested to deactivate, our target gain is zero */ + + if (!_pending_active) { + return 0.0; + } + /* if we've been told not to output because its a monitoring situation and we're not monitoring, then be quiet. */ diff --git a/libs/ardour/internal_return.cc b/libs/ardour/internal_return.cc index 37a559649c..f6c99d8518 100644 --- a/libs/ardour/internal_return.cc +++ b/libs/ardour/internal_return.cc @@ -46,7 +46,11 @@ InternalReturn::InternalReturn (Session& s, const XMLNode& node) void InternalReturn::run (BufferSet& bufs, sframes_t start_frame, sframes_t end_frame, nframes_t nframes) { - /* XXX no lock here, just atomic fetch */ + if (!_active && !_pending_active) { + return; + } + + /* no lock here, just atomic fetch */ if (g_atomic_int_get(&user_count) == 0) { /* nothing to do - nobody is feeding us anything */ @@ -54,6 +58,7 @@ InternalReturn::run (BufferSet& bufs, sframes_t start_frame, sframes_t end_frame } bufs.merge_from (buffers, nframes); + _active = _pending_active; } bool diff --git a/libs/ardour/internal_send.cc b/libs/ardour/internal_send.cc index 7ca9319a1e..7c2c384276 100644 --- a/libs/ardour/internal_send.cc +++ b/libs/ardour/internal_send.cc @@ -72,7 +72,7 @@ InternalSend::send_to_going_away () void InternalSend::run (BufferSet& bufs, sframes_t start_frame, sframes_t end_frame, nframes_t nframes) { - if (!_active || !target || !_send_to) { + if ((!_active && !_pending_active) || !target || !_send_to) { _meter->reset (); return; } @@ -102,7 +102,7 @@ InternalSend::run (BufferSet& bufs, sframes_t start_frame, sframes_t end_frame, _meter->reset (); Amp::apply_simple_gain (sendbufs, nframes, 0.0); - return; + goto out; } else if (tgain != 1.0) { @@ -130,6 +130,9 @@ InternalSend::run (BufferSet& bufs, sframes_t start_frame, sframes_t end_frame, /* deliver to target */ target->merge_from (sendbufs, nframes); + + out: + _active = _pending_active; } bool diff --git a/libs/ardour/meter.cc b/libs/ardour/meter.cc index ba5ccf1501..e8512aa593 100644 --- a/libs/ardour/meter.cc +++ b/libs/ardour/meter.cc @@ -73,7 +73,7 @@ Metering::update_meters() void PeakMeter::run (BufferSet& bufs, sframes_t start_frame, sframes_t end_frame, nframes_t nframes) { - if (!_active) { + if (!_active && !_pending_active) { return; } @@ -111,6 +111,8 @@ PeakMeter::run (BufferSet& bufs, sframes_t start_frame, sframes_t end_frame, nfr for (uint32_t i = n; i < _peak_power.size(); ++i) { _peak_power[i] = 0.0f; } + + _active = _pending_active; } PeakMeter::PeakMeter (Session& s, const XMLNode& node) diff --git a/libs/ardour/plugin_insert.cc b/libs/ardour/plugin_insert.cc index 461a3f0685..8f7eae5849 100644 --- a/libs/ardour/plugin_insert.cc +++ b/libs/ardour/plugin_insert.cc @@ -377,13 +377,14 @@ PluginInsert::silence (nframes_t nframes) void PluginInsert::run (BufferSet& bufs, sframes_t start_frame, sframes_t end_frame, nframes_t nframes) { - if (active()) { + if (_active || _pending_active) { if (_session.transport_rolling()) { automation_run (bufs, nframes); } else { connect_and_run (bufs, nframes, 0, false); } + } else { /* FIXME: type, audio only */ @@ -402,6 +403,8 @@ PluginInsert::run (BufferSet& bufs, sframes_t start_frame, sframes_t end_frame, bufs.count().set_audio(out); } + + _active = _pending_active; } void diff --git a/libs/ardour/port_insert.cc b/libs/ardour/port_insert.cc index ffddc681c7..a46f7a7da3 100644 --- a/libs/ardour/port_insert.cc +++ b/libs/ardour/port_insert.cc @@ -72,14 +72,17 @@ PortInsert::run (BufferSet& bufs, sframes_t start_frame, sframes_t end_frame, nf return; } - if (!active()) { + if (!_active && !_pending_active) { /* deliver silence */ silence (nframes); - return; + goto out; } _out->run (bufs, start_frame, end_frame, nframes); _input->collect_input (bufs, nframes, ChanCount::ZERO); + + out: + _active = _pending_active; } XMLNode& diff --git a/libs/ardour/processor.cc b/libs/ardour/processor.cc index e3a2b0b15e..04706c0c2d 100644 --- a/libs/ardour/processor.cc +++ b/libs/ardour/processor.cc @@ -65,6 +65,7 @@ const string Processor::state_node_name = "Processor"; Processor::Processor(Session& session, const string& name) : SessionObject(session, name) , AutomatableControls(session) + , _pending_active(false) , _active(false) , _next_ab_is_active(false) , _configured(false) @@ -75,12 +76,14 @@ Processor::Processor(Session& session, const string& name) Processor::Processor (Session& session, const XMLNode& node) : SessionObject(session, "renameMe") , AutomatableControls(session) + , _pending_active(false) , _active(false) , _next_ab_is_active(false) , _configured(false) , _gui(0) { set_state (node); + _pending_active = _active; } XMLNode& diff --git a/libs/ardour/return.cc b/libs/ardour/return.cc index 5a44d3f6e6..e5af719afd 100644 --- a/libs/ardour/return.cc +++ b/libs/ardour/return.cc @@ -122,7 +122,7 @@ Return::set_state(const XMLNode& node) void Return::run (BufferSet& bufs, sframes_t start_frame, sframes_t end_frame, nframes_t nframes) { - if (!active() || _input->n_ports() == ChanCount::ZERO) { + if ((!_active && !_pending_active) || _input->n_ports() == ChanCount::ZERO) { return; } @@ -141,6 +141,8 @@ Return::run (BufferSet& bufs, sframes_t start_frame, sframes_t end_frame, nframe _meter->run (bufs, start_frame, end_frame, nframes); } } + + _active = _pending_active; } bool diff --git a/libs/ardour/send.cc b/libs/ardour/send.cc index ea4c16a416..1728dc52d9 100644 --- a/libs/ardour/send.cc +++ b/libs/ardour/send.cc @@ -86,8 +86,16 @@ Send::deactivate () void Send::run (BufferSet& bufs, sframes_t start_frame, sframes_t end_frame, nframes_t nframes) { - if (!_active || _output->n_ports() == ChanCount::ZERO) { + if (_output->n_ports() == ChanCount::ZERO) { _meter->reset (); + _active = _pending_active; + return; + } + + if (!_active && !_pending_active) { + _meter->reset (); + _output->silence (nframes); + _active = _pending_active; return; } @@ -118,6 +126,8 @@ Send::run (BufferSet& bufs, sframes_t start_frame, sframes_t end_frame, nframes_ _meter->run (*_output_buffers, start_frame, end_frame, nframes); } } + + /* _active was set to _pending_active by Delivery::run() */ } XMLNode& -- 2.30.2