diff options
Diffstat (limited to 'libs/ardour')
-rw-r--r-- | libs/ardour/amp.cc | 4 | ||||
-rw-r--r-- | libs/ardour/ardour/processor.h | 6 | ||||
-rw-r--r-- | libs/ardour/delivery.cc | 29 | ||||
-rw-r--r-- | libs/ardour/internal_return.cc | 7 | ||||
-rw-r--r-- | libs/ardour/internal_send.cc | 7 | ||||
-rw-r--r-- | libs/ardour/meter.cc | 4 | ||||
-rw-r--r-- | libs/ardour/plugin_insert.cc | 5 | ||||
-rw-r--r-- | libs/ardour/port_insert.cc | 7 | ||||
-rw-r--r-- | libs/ardour/processor.cc | 3 | ||||
-rw-r--r-- | libs/ardour/return.cc | 4 | ||||
-rw-r--r-- | libs/ardour/send.cc | 12 |
11 files changed, 68 insertions, 20 deletions
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& |