X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Finternal_send.cc;h=5ba9954811844369d504138bdda5c4a8f3cb7472;hb=b88e7fdcca8ef8fa4c22f93c2934b30713ab4716;hp=ad56622fc78c9bd0ec8a61d2cac8ec8e6da2ffe9;hpb=d775781c2f9453d670612d96640240945b2b6881;p=ardour.git diff --git a/libs/ardour/internal_send.cc b/libs/ardour/internal_send.cc index ad56622fc7..5ba9954811 100644 --- a/libs/ardour/internal_send.cc +++ b/libs/ardour/internal_send.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2009 Paul Davis + Copyright (C) 2009 Paul Davis This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -42,14 +42,16 @@ InternalSend::InternalSend (Session& s, boost::shared_ptr mm, boost: } set_name (sendto->name()); - + _send_to->GoingAway.connect (mem_fun (*this, &InternalSend::send_to_going_away)); + _send_to->NameChanged.connect (mem_fun (*this, &InternalSend::send_to_name_changed)); } InternalSend::InternalSend (Session& s, boost::shared_ptr mm, const XMLNode& node) - : Send (s, mm, node, Delivery::Aux /* will be reset in set_state() */) + : Send (s, mm, node, Stateful::loading_state_version, Delivery::Aux /* will be reset in set_state() */) { - set_state (node); + /* Send constructor will set its state, so here we just need to set up our own */ + set_our_state (node, Stateful::loading_state_version); } InternalSend::~InternalSend () @@ -70,7 +72,7 @@ InternalSend::send_to_going_away () } void -InternalSend::run (BufferSet& bufs, sframes_t start_frame, sframes_t end_frame, nframes_t nframes) +InternalSend::run (BufferSet& bufs, sframes_t start_frame, sframes_t end_frame, nframes_t nframes, bool) { if ((!_active && !_pending_active) || !target || !_send_to) { _meter->reset (); @@ -79,16 +81,16 @@ InternalSend::run (BufferSet& bufs, sframes_t start_frame, sframes_t end_frame, // we have to copy the input, because we may alter the buffers with the amp // in-place, which a send must never do. - + assert(mixbufs.available() >= bufs.count()); mixbufs.read_from (bufs, nframes); - + /* gain control */ gain_t tgain = target_gain (); - + if (tgain != _current_gain) { - + /* target gain has changed */ Amp::apply_gain (mixbufs, nframes, _current_gain, tgain); @@ -109,22 +111,21 @@ InternalSend::run (BufferSet& bufs, sframes_t start_frame, sframes_t end_frame, Amp::apply_simple_gain (mixbufs, nframes, tgain); } - // 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 (mixbufs, start_frame, end_frame, nframes); + _amp->run (mixbufs, start_frame, end_frame, nframes, true); /* XXX NEED TO PAN */ /* consider metering */ - + if (_metering) { if (_amp->gain_control()->get_value() == 0) { _meter->reset(); } else { - _meter->run (mixbufs, start_frame, end_frame, nframes); + _meter->run (mixbufs, start_frame, end_frame, nframes, true); } } @@ -153,14 +154,14 @@ InternalSend::state (bool full) { XMLNode& node (Send::state (full)); - /* this replaces any existing property */ + /* this replaces any existing "type" property */ node.add_property ("type", "intsend"); if (_send_to) { node.add_property ("target", _send_to->id().to_s()); } - + return node; } @@ -171,12 +172,10 @@ InternalSend::get_state() } int -InternalSend::set_state (const XMLNode& node) +InternalSend::set_our_state (const XMLNode& node, int version) { const XMLProperty* prop; - Send::set_state (node); - if ((prop = node.property ("target")) != 0) { _send_to_id = prop->value(); @@ -192,10 +191,17 @@ InternalSend::set_state (const XMLNode& node) connect_when_legal (); } } - + return 0; } +int +InternalSend::set_state (const XMLNode& node, int version) +{ + Send::set_state (node, version); + return set_our_state (node, version); +} + int InternalSend::connect_when_legal () { @@ -209,8 +215,8 @@ InternalSend::connect_when_legal () if ((_send_to = _session.route_by_id (_send_to_id)) == 0) { error << X_("cannot find route to connect to") << endmsg; return -1; - } - + } + if ((target = _send_to->get_return_buffer ()) == 0) { error << X_("target for internal send has no return buffer") << endmsg; return -1; @@ -219,7 +225,7 @@ InternalSend::connect_when_legal () return 0; } -bool +bool InternalSend::can_support_io_configuration (const ChanCount& in, ChanCount& out) const { out = in; @@ -258,5 +264,11 @@ InternalSend::visible () const return true; } - return false; + return false; +} + +void +InternalSend::send_to_name_changed () +{ + set_name (_send_to->name ()); }