X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Ftrack.cc;h=6304235a650b78db9783d81df18fc3a7dda1ba8a;hb=8a6d303778493fce6aaed62fa1cea47bf8075bf7;hp=0c586e4a0e0603c4c5a3000d586a5d36233dc808;hpb=e9a8ccc7e2826d8fe91eff34ee8a0683a7f7aac6;p=ardour.git diff --git a/libs/ardour/track.cc b/libs/ardour/track.cc index 0c586e4a0e..6304235a65 100644 --- a/libs/ardour/track.cc +++ b/libs/ardour/track.cc @@ -21,21 +21,24 @@ #include "ardour/debug.h" #include "ardour/delivery.h" #include "ardour/diskstream.h" +#include "ardour/event_type_map.h" #include "ardour/io_processor.h" #include "ardour/meter.h" #include "ardour/monitor_control.h" #include "ardour/playlist.h" #include "ardour/port.h" #include "ardour/processor.h" +#include "ardour/profile.h" #include "ardour/record_enable_control.h" #include "ardour/record_safe_control.h" #include "ardour/route_group_specialized.h" #include "ardour/session.h" #include "ardour/session_playlists.h" #include "ardour/track.h" +#include "ardour/types_convert.h" #include "ardour/utils.h" -#include "i18n.h" +#include "pbd/i18n.h" using namespace std; using namespace ARDOUR; @@ -65,13 +68,13 @@ Track::init () boost::shared_ptr rp (shared_from_this()); boost::shared_ptr rt = boost::dynamic_pointer_cast (rp); - _record_enable_control.reset (new RecordEnableControl (_session, X_("recenable"), *this)); + _record_enable_control.reset (new RecordEnableControl (_session, EventTypeMap::instance().to_symbol (RecEnableAutomation), *this)); add_control (_record_enable_control); - _record_safe_control.reset (new RecordSafeControl (_session, X_("recsafe"), *this)); + _record_safe_control.reset (new RecordSafeControl (_session, EventTypeMap::instance().to_symbol (RecSafeAutomation), *this)); add_control (_record_safe_control); - _monitoring_control.reset (new MonitorControl (_session, X_("monitoring"), *this)); + _monitoring_control.reset (new MonitorControl (_session, EventTypeMap::instance().to_symbol (MonitoringAutomation), *this)); add_control (_monitoring_control); _session.config.ParameterChanged.connect_same_thread (*this, boost::bind (&Track::parameter_changed, this, _1)); @@ -105,7 +108,12 @@ XMLNode& Track::state (bool full) { XMLNode& root (Route::state (full)); - root.add_property (X_("saved-meter-point"), enum_2_string (_saved_meter_point)); + + root.add_child_nocopy (_monitoring_control->get_state ()); + root.add_child_nocopy (_record_safe_control->get_state ()); + root.add_child_nocopy (_record_enable_control->get_state ()); + + root.set_property (X_("saved-meter-point"), _saved_meter_point); root.add_child_nocopy (_diskstream->get_state ()); return root; @@ -140,19 +148,31 @@ Track::set_state (const XMLNode& node, int version) for (XMLNodeConstIterator niter = nlist.begin(); niter != nlist.end(); ++niter) { child = *niter; - XMLProperty const * prop; - if (child->name() == Controllable::xml_node_name && (prop = child->property ("name")) != 0) { - if (prop->value() == X_("recenable")) { + if (child->name() == Controllable::xml_node_name) { + std::string name; + if (!child->get_property ("name", name)) { + continue; + } + + if (name == _record_enable_control->name()) { _record_enable_control->set_state (*child, version); + } else if (name == _record_safe_control->name()) { + _record_safe_control->set_state (*child, version); + } else if (name == _monitoring_control->name()) { + _monitoring_control->set_state (*child, version); } } } - XMLProperty const * prop; + /* convert old 3001 state */ + std::string monitoring; + if (node.get_property (X_("monitoring"), monitoring)) { + XMLNode mon_node ("backwardscompat"); + mon_node.set_property (X_("monitoring"), monitoring); + _monitoring_control->set_state (mon_node, version); + } - if ((prop = node.property (X_("saved-meter-point"))) != 0) { - _saved_meter_point = MeterPoint (string_2_enum (prop->value(), _saved_meter_point)); - } else { + if (!node.get_property (X_("saved-meter-point"), _saved_meter_point)) { _saved_meter_point = _meter_point; } @@ -278,8 +298,12 @@ Track::set_name (const string& str) { bool ret; - if (_record_enable_control->get_value() && _session.actively_recording()) { - /* this messes things up if done while recording */ + if (str.empty ()) { + return false; + } + + if (_record_enable_control->get_value()) { + /* when re-arm'ed the file (named after the track) is already ready to rolll */ return false; } @@ -351,7 +375,8 @@ Track::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, /* no outputs? nothing to do ... what happens if we have sends etc. ? */ - if (n_outputs().n_total() == 0) { + if (n_outputs().n_total() == 0 && !ARDOUR::Profile->get_mixbus()) { + //Note: Mixbus has its own output mechanism, so we should operate even if no explicit outputs are assigned return 0; } @@ -466,12 +491,7 @@ Track::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, passthru (bufs, start_frame, end_frame, nframes, false); } - for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) { - boost::shared_ptr d = boost::dynamic_pointer_cast (*i); - if (d) { - d->flush_buffers (nframes); - } - } + flush_processor_buffers_locked (nframes); return 0; } @@ -501,6 +521,7 @@ Track::silent_roll (pframes_t nframes, framepos_t /*start_frame*/, framepos_t /* _amp->apply_gain_automation(false); silence (nframes); + flush_processor_buffers_locked (nframes); framecnt_t playback_distance; @@ -917,6 +938,17 @@ Track::monitoring_state () const return MonitoringDisk; } + switch (_session.config.get_session_monitoring ()) { + case MonitorDisk: + return MonitoringDisk; + break; + case MonitorInput: + return MonitoringInput; + break; + default: + break; + } + /* This is an implementation of the truth table in doc/monitor_modes.pdf; I don't think it's ever going to be too pretty too look at. */ @@ -932,9 +964,11 @@ Track::monitoring_state () const * time, but just to keep the semantics the same as they were before * sept 26th 2012, we differentiate between the cases where punch is * enabled and those where it is not. + * + * rg: I suspect this is not the case: monitoring may differ */ - if (_session.config.get_punch_in() || _session.config.get_punch_out()) { + if (_session.config.get_punch_in() || _session.config.get_punch_out() || _session.preroll_record_punch_enabled ()) { session_rec = _session.actively_recording (); } else { session_rec = _session.get_record_enabled();