summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gtk2_ardour/ardour_ui.cc2
-rw-r--r--gtk2_ardour/gain_meter.cc67
-rw-r--r--gtk2_ardour/gain_meter.h9
-rw-r--r--gtk2_ardour/mixer_strip.cc8
-rw-r--r--gtk2_ardour/processor_box.cc2
-rw-r--r--gtk2_ardour/return_ui.cc2
-rw-r--r--gtk2_ardour/route_time_axis.cc2
-rw-r--r--gtk2_ardour/send_ui.cc2
-rw-r--r--gtk2_ardour/sfdb_ui.cc2
-rw-r--r--libs/ardour/amp.cc4
-rw-r--r--libs/ardour/ardour/processor.h6
-rw-r--r--libs/ardour/delivery.cc29
-rw-r--r--libs/ardour/internal_return.cc7
-rw-r--r--libs/ardour/internal_send.cc7
-rw-r--r--libs/ardour/meter.cc4
-rw-r--r--libs/ardour/plugin_insert.cc5
-rw-r--r--libs/ardour/port_insert.cc7
-rw-r--r--libs/ardour/processor.cc3
-rw-r--r--libs/ardour/return.cc4
-rw-r--r--libs/ardour/send.cc12
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 <limits.h>
+#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<Route> r,
boost::shared_ptr<PeakMeter> pm,
- boost::shared_ptr<AutomationControl> gc,
- boost::shared_ptr<Automatable> gc_owner)
+ boost::shared_ptr<Amp> amp)
{
connections.clear ();
- if (!pm && !gc) {
+ if (!pm && !amp) {
level_meter->set_meter (0);
gain_slider->set_controllable (boost::shared_ptr<PBD::Controllable>());
_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<Route> 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<AutomationControl> 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<Gtkmm2ext::SliderController*>(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<Route> r,
boost::shared_ptr<PeakMeter> meter,
- boost::shared_ptr<AutomationControl> gain_control,
- boost::shared_ptr<Automatable> gc_owner)
+ boost::shared_ptr<Amp> amp)
{
if (level_meter->get_parent()) {
hbox.remove (*level_meter);
@@ -810,7 +817,7 @@ GainMeter::set_controls (boost::shared_ptr<Route> 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<PBD::Controllable>
GainMeterBase::get_controllable()
{
- return _gain_control;
+ if (_amp) {
+ return _amp->gain_control();
+ } else {
+ return boost::shared_ptr<PBD::Controllable>();
+ }
}
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<ARDOUR::Route> route,
boost::shared_ptr<ARDOUR::PeakMeter> meter,
- boost::shared_ptr<ARDOUR::AutomationControl> gain_control,
- boost::shared_ptr<ARDOUR::Automatable> gc_owner);
+ boost::shared_ptr<ARDOUR::Amp> amp);
void update_gain_sensitive ();
void update_meters ();
@@ -89,7 +89,7 @@ class GainMeterBase : virtual public sigc::trackable
friend class MixerStrip;
boost::shared_ptr<ARDOUR::Route> _route;
boost::shared_ptr<ARDOUR::PeakMeter> _meter;
- boost::shared_ptr<ARDOUR::AutomationControl> _gain_control;
+ boost::shared_ptr<ARDOUR::Amp> _amp;
ARDOUR::Session& _session;
std::vector<sigc::connection> connections;
@@ -184,8 +184,7 @@ class GainMeter : public GainMeterBase, public Gtk::VBox
virtual void set_controls (boost::shared_ptr<ARDOUR::Route> route,
boost::shared_ptr<ARDOUR::PeakMeter> meter,
- boost::shared_ptr<ARDOUR::AutomationControl> gain_control,
- boost::shared_ptr<ARDOUR::Automatable> gc_owner);
+ boost::shared_ptr<ARDOUR::Amp> 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<Route> 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<Route> target)
send = boost::dynamic_pointer_cast<Send>(_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> 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<Return> r, Session& se)
, _session (se)
, _gpm (se)
{
- _gpm.set_controls (boost::shared_ptr<Route>(), r->meter(), r->amp()->gain_control(), r->amp());
+ _gpm.set_controls (boost::shared_ptr<Route>(), 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<Send> s, Session& se)
, _panners (se)
{
_panners.set_panner (s->panner());
- _gpm.set_controls (boost::shared_ptr<Route>(), s->meter(), s->amp()->gain_control(), s->amp());
+ _gpm.set_controls (boost::shared_ptr<Route>(), 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<Route> 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&