+ _amp->activate ();
+ _meter->activate ();
+
+ Processor::activate ();
+}
+
+void
+Send::deactivate ()
+{
+ _amp->deactivate ();
+ _meter->deactivate ();
+ _meter->reset ();
+
+ Processor::deactivate ();
+}
+
+void
+Send::run (BufferSet& bufs, sframes_t start_frame, sframes_t end_frame, nframes_t nframes, bool)
+{
+ 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;
+ }
+
+ // we have to copy the input, because deliver_output() may alter the buffers
+ // in-place, which a send must never do.
+
+ BufferSet& sendbufs = _session.get_mix_buffers (bufs.count());
+ sendbufs.read_from (bufs, nframes);
+ assert(sendbufs.count() == bufs.count());
+
+ /* gain control */
+
+ // Can't automate gain for sends or returns yet because we need different buffers
+ // so that we don't overwrite the main automation data for the route amp
+ // _amp->setup_gain_automation (start_frame, end_frame, nframes);
+ _amp->run (sendbufs, start_frame, end_frame, nframes, true);
+
+ /* deliver to outputs */
+
+ Delivery::run (sendbufs, start_frame, end_frame, nframes, true);
+
+ /* consider metering */
+
+ if (_metering) {
+ if (_amp->gain_control()->get_value() == 0) {
+ _meter->reset();
+ } else {
+ _meter->run (*_output_buffers, start_frame, end_frame, nframes, true);
+ }
+ }
+
+ /* _active was set to _pending_active by Delivery::run() */