diff options
Diffstat (limited to 'libs/ardour/send.cc')
-rw-r--r-- | libs/ardour/send.cc | 87 |
1 files changed, 53 insertions, 34 deletions
diff --git a/libs/ardour/send.cc b/libs/ardour/send.cc index 5874b91cf6..61c235e60a 100644 --- a/libs/ardour/send.cc +++ b/libs/ardour/send.cc @@ -21,6 +21,7 @@ #include "pbd/xml++.h" +#include "ardour/amp.h" #include "ardour/send.h" #include "ardour/session.h" #include "ardour/port.h" @@ -35,15 +36,23 @@ using namespace ARDOUR; using namespace PBD; -Send::Send (Session& s) - : Delivery (s, string_compose (_("send %1"), (_bitslot = s.next_send_id()) + 1), Delivery::Send) +Send::Send (Session& s, boost::shared_ptr<MuteMaster> mm) + : Delivery (s, mm, string_compose (_("send %1"), (_bitslot = s.next_send_id()) + 1), Delivery::Send) + , _metering (false) { + _amp.reset (new Amp (_session, _mute_master)); + _meter.reset (new PeakMeter (_session)); + ProcessorCreated (this); /* EMIT SIGNAL */ } -Send::Send (Session& s, const XMLNode& node) - : Delivery (s, "send", Delivery::Send) +Send::Send (Session& s, boost::shared_ptr<MuteMaster> mm, const XMLNode& node) + : Delivery (s, mm, "send", Delivery::Send) + , _metering (false) { + _amp.reset (new Amp (_session, _mute_master)); + _meter.reset (new PeakMeter (_session)); + if (set_state (node)) { throw failed_constructor(); } @@ -56,6 +65,43 @@ Send::~Send () GoingAway (); } +void +Send::run_in_place (BufferSet& bufs, sframes_t start_frame, sframes_t end_frame, nframes_t nframes) +{ + if (!_active || _output->n_ports() == ChanCount::ZERO) { + _meter->reset (); + 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_in_place (sendbufs, start_frame, end_frame, nframes); + + /* deliver to outputs */ + + Delivery::run_in_place (sendbufs, start_frame, end_frame, nframes); + + /* consider metering */ + + if (_metering) { + if (_amp->gain_control()->get_value() == 0) { + _meter->reset(); + } else { + _meter->run_in_place (*_output_buffers, start_frame, end_frame, nframes); + } + } +} + XMLNode& Send::get_state(void) { @@ -90,17 +136,9 @@ Send::set_state(const XMLNode& node) const XMLNode* insert_node = &node; - /* Send has regular IO automation (gain, pan) */ - - for (niter = nlist.begin(); niter != nlist.end(); ++niter) { - if ((*niter)->name() == IOProcessor::state_node_name) { - insert_node = *niter; - } else if ((*niter)->name() == X_("Automation")) { - // _io->set_automation_state (*(*niter), Evoral::Parameter(GainAutomation)); - } - } + /* XXX need to load automation state & data for amp */ - IOProcessor::set_state (*insert_node); + Delivery::set_state (*insert_node); return 0; } @@ -108,7 +146,7 @@ Send::set_state(const XMLNode& node) bool Send::can_support_io_configuration (const ChanCount& in, ChanCount& out) const { - if (_io->n_inputs() == ChanCount::ZERO && _io->n_outputs() == ChanCount::ZERO) { + if (_output->n_ports() == ChanCount::ZERO) { /* not configured yet, we can support anything */ @@ -126,25 +164,6 @@ Send::can_support_io_configuration (const ChanCount& in, ChanCount& out) const return false; } -bool -Send::configure_io (ChanCount in, ChanCount out) -{ - /* we're transparent no matter what. fight the power. */ - - if (out != in) { - return false; - } - - if (_io->ensure_io (ChanCount::ZERO, in, false, this) != 0) { - return false; - } - - Processor::configure_io(in, out); - _io->reset_panner(); - - return true; -} - /** Set up the XML description of a send so that its name is unique. * @param state XML send state. * @param session Session. |