#include "ardour/utils.h"
#include "ardour/vca.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
_monitor_control->activate ();
}
- if (is_master() || is_monitor() || is_auditioner()) {
- _mute_master->set_solo_ignore (true);
- }
-
/* now that we have _meter, its safe to connect to this */
{
}
}
+ if (pi && pi->has_sidechain ()) {
+ pi->sidechain_input ()->changed.connect_same_thread (*this, boost::bind (&Route::sidechain_change_handler, this, _1, _2));
+ }
+
if ((*i)->active()) {
// why? emit ActiveChanged() ??
(*i)->activate ();
_strict_io = string_is_affirmative (prop->value());
}
- if (!can_solo()) {
- _mute_master->set_solo_ignore (true);
- }
-
if (is_monitor()) {
/* monitor bus does not get a panner, but if (re)created
via XML, it will already have one by the time we
} else {
warning << string_compose (_("Pannable state found for route (%1) without a panner!"), name()) << endmsg;
}
- } else if (child->name() == Controllable::xml_node_name) {
- if ((prop = child->property (X_("name"))) == 0) {
- continue;
- }
-
- if (prop->value() == _gain_control->name()) {
- _gain_control->set_state (*child, version);
- } else if (prop->value() == _solo_control->name()) {
- _solo_control->set_state (*child, version);
- } else if (prop->value() == _solo_safe_control->name()) {
- _solo_safe_control->set_state (*child, version);
- } else if (prop->value() == _solo_isolate_control->name()) {
- _solo_isolate_control->set_state (*child, version);
- } else if (prop->value() == _solo_control->name()) {
- _mute_control->set_state (*child, version);
- }
} else if (child->name() == Slavable::xml_node_name) {
Slavable::set_state (*child, version);
}
XMLNode *cmt = *(child->children().begin());
_comment = cmt->content();
- } else if (child->name() == Controllable::xml_node_name && (prop = child->property("name")) != 0) {
- if (prop->value() == "solo") {
+ } else if (child->name() == Controllable::xml_node_name) {
+ if ((prop = child->property (X_("name"))) == 0) {
+ continue;
+ }
+
+ if (prop->value() == _gain_control->name()) {
+ _gain_control->set_state (*child, version);
+ } else if (prop->value() == _solo_control->name()) {
_solo_control->set_state (*child, version);
- } else if (prop->value() == "mute") {
+ } else if (prop->value() == _solo_safe_control->name()) {
+ _solo_safe_control->set_state (*child, version);
+ } else if (prop->value() == _solo_isolate_control->name()) {
+ _solo_isolate_control->set_state (*child, version);
+ } else if (prop->value() == _solo_control->name()) {
_mute_control->set_state (*child, version);
+ } else if (prop->value() == _phase_control->name()) {
+ _phase_control->set_state (*child, version);
}
-
} else if (child->name() == MuteMaster::xml_node_name) {
_mute_master->set_state (*child, version);
Stripable::set_state (node, version);
- if (is_master() || is_monitor() || is_auditioner()) {
- _mute_master->set_solo_ignore (true);
- }
-
if ((prop = node.property (X_("denormal-protection"))) != 0) {
set_denormal_protection (string_is_affirmative (prop->value()));
}
if (iop != 0) {
boost::shared_ptr<const IO> iop_out = iop->output();
+ if (other.get() == this && iop_out && iop->input() && iop_out->connected_to (iop->input())) {
+ // TODO this needs a delaylines in the Insert to align connections (!)
+ DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does feed its own return (%2)\n", iop->name(), other->name()));
+ continue;
+ }
if ((iop_out && other->all_inputs().fed_by (iop_out)) || iop->feeds (other)) {
DEBUG_TRACE (DEBUG::Graph, string_compose ("\tIOP %1 does feed %2\n", iop->name(), other->name()));
if (via_send_only) {
return max (n_inputs ().n_audio(), processor_max_streams.n_audio());
}
+void
+Route::flush_processor_buffers_locked (framecnt_t nframes)
+{
+ for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
+ boost::shared_ptr<Delivery> d = boost::dynamic_pointer_cast<Delivery> (*i);
+ if (d) {
+ d->flush_buffers (nframes);
+ } else {
+ boost::shared_ptr<PortInsert> p = boost::dynamic_pointer_cast<PortInsert> (*i);
+ if (p) {
+ p->flush_buffers (nframes);
+ }
+ }
+ }
+}
+
int
Route::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, bool session_state_changing)
{
_trim->apply_gain_automation (false);
passthru (bufs, start_frame, end_frame, nframes, 0);
- for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
- boost::shared_ptr<Delivery> d = boost::dynamic_pointer_cast<Delivery> (*i);
- if (d) {
- d->flush_buffers (nframes);
- }
- }
+ flush_processor_buffers_locked (nframes);
+
return 0;
}
passthru (bufs, start_frame, end_frame, nframes, declick);
- for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
- boost::shared_ptr<Delivery> d = boost::dynamic_pointer_cast<Delivery> (*i);
- if (d) {
- d->flush_buffers (nframes);
- }
- }
+ flush_processor_buffers_locked (nframes);
+
return 0;
}
Route::silent_roll (pframes_t nframes, framepos_t /*start_frame*/, framepos_t /*end_frame*/, bool& /* need_butler */)
{
silence (nframes);
+ flush_processor_buffers_locked (nframes);
return 0;
}
Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
Glib::Threads::RWLock::WriterLock lw (_processor_lock);
- _capturing_processor.reset (new CapturingProcessor (_session));
+ // this aligns all tracks; but not tracks + busses
+ assert (_session.worst_track_latency () >= _initial_delay);
+ _capturing_processor.reset (new CapturingProcessor (_session, _session.worst_track_latency () - _initial_delay));
_capturing_processor->activate ();
configure_processors_unlocked (0, &lw);
new_processors.insert (amp, _monitor_control);
}
+ /* TRIM CONTROL */
+
+ if (_trim && _trim->active()) {
+ assert (!_trim->display_to_user ());
+ new_processors.push_front (_trim);
+ }
+
/* INTERNAL RETURN */
- /* doing this here means that any monitor control will come just after
- the return.
+ /* doing this here means that any monitor control will come after
+ the return and trim.
*/
if (_intreturn) {
new_processors.push_front (_intreturn);
}
- if (_trim && _trim->active()) {
- assert (!_trim->display_to_user ());
- new_processors.push_front (_trim);
- }
/* EXPORT PROCESSOR */
if (_capturing_processor) {
return false;
}
- return _session.soloing() && !_solo_control->soloed() && !_solo_isolate_control->solo_isolated();
+ return _session.soloing() && !_solo_control->soloed() && !_solo_isolate_control->solo_isolated();
}
void