X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Ftrack.cc;h=02c44eddf7dcb46b52b6599121949d8736a44fa3;hb=6946bdc0830c9f0971d2cd0d54b27e343c54d96a;hp=43dc26122e7cb4148c7d1f52983ee32c360173f0;hpb=2ca819c00b2c631fbc04785e4b33a7e04a0f0e0e;p=ardour.git diff --git a/libs/ardour/track.cc b/libs/ardour/track.cc index 43dc26122e..02c44eddf7 100644 --- a/libs/ardour/track.cc +++ b/libs/ardour/track.cc @@ -28,19 +28,20 @@ #include "ardour/port.h" #include "ardour/processor.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/utils.h" -#include "i18n.h" +#include "pbd/i18n.h" using namespace std; using namespace ARDOUR; using namespace PBD; -Track::Track (Session& sess, string name, Route::Flag flag, TrackMode mode, DataType default_type) +Track::Track (Session& sess, string name, PresentationInfo::Flag flag, TrackMode mode, DataType default_type) : Route (sess, name, flag, default_type) , _saved_meter_point (_meter_point) , _mode (mode) @@ -66,17 +67,13 @@ Track::init () _record_enable_control.reset (new RecordEnableControl (_session, X_("recenable"), *this)); add_control (_record_enable_control); - _record_enable_control->set_flags (Controllable::Toggle); - _record_safe_control.reset (new AutomationControl (_session, RecSafeAutomation, ParameterDescriptor (RecSafeAutomation), - boost::shared_ptr (new AutomationList (Evoral::Parameter (RecSafeAutomation))), - X_("recsafe"))); + _record_safe_control.reset (new RecordSafeControl (_session, X_("recsafe"), *this)); add_control (_record_safe_control); _monitoring_control.reset (new MonitorControl (_session, X_("monitoring"), *this)); add_control (_monitoring_control); - track_number_changed.connect_same_thread (*this, boost::bind (&Track::resync_track_name, this)); _session.config.ParameterChanged.connect_same_thread (*this, boost::bind (&Track::parameter_changed, this, _1)); _monitoring_control->Changed.connect_same_thread (*this, boost::bind (&Track::monitoring_changed, this, _1, _2)); @@ -108,6 +105,11 @@ XMLNode& Track::state (bool full) { XMLNode& root (Route::state (full)); + + 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.add_property (X_("saved-meter-point"), enum_2_string (_saved_meter_point)); root.add_child_nocopy (_diskstream->get_state ()); @@ -144,9 +146,18 @@ Track::set_state (const XMLNode& node, int version) 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) { + if ((prop = child->property ("name")) == 0) { + continue; + } + + if (prop->value() == _record_enable_control->name()) { _record_enable_control->set_state (*child, version); + } else if (prop->value() == _record_safe_control->name()) { + _record_safe_control->set_state (*child, version); + } else if (prop->value() == _monitoring_control->name()) { + _monitoring_control->set_state (*child, version); } } } @@ -243,27 +254,15 @@ Track::record_safe_changed (bool, Controllable::GroupControlDisposition) } bool -Track::record_safe () const +Track::can_be_record_safe () { - return _diskstream && _diskstream->record_safe (); + return !_record_enable_control->get_value() && _diskstream && _session.writable() && (_freeze_record.state != Frozen); } -void -Track::set_record_safe (bool yn, Controllable::GroupControlDisposition group_override) +bool +Track::can_be_record_enabled () { - if (!_session.writable()) { - return; - } - - if (_freeze_record.state == Frozen) { - return; - } - - if (record_enabled ()) { - return; - } - - _rec_safe_control->set_value (yn, group_override); + return !_record_safe_control->get_value() && _diskstream && !_diskstream->record_safe() && _session.writable() && (_freeze_record.state != Frozen); } void @@ -459,10 +458,10 @@ Track::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, if (no_meter) { BufferSet& bufs (_session.get_silent_buffers (n_process_buffers())); - _meter->run (bufs, 0, 0, nframes, true); - _input->process_input (boost::shared_ptr(), start_frame, end_frame, nframes); + _meter->run (bufs, start_frame, end_frame, 1.0, nframes, true); + _input->process_input (boost::shared_ptr(), start_frame, end_frame, speed(), nframes); } else { - _input->process_input (_meter, start_frame, end_frame, nframes); + _input->process_input (_meter, start_frame, end_frame, speed(), nframes); } } @@ -475,18 +474,13 @@ Track::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, fill_buffers_with_input (bufs, _input, nframes); if (_meter_point == MeterInput) { - _meter->run (bufs, start_frame, end_frame, nframes, true); + _meter->run (bufs, start_frame, end_frame, 1.0 /*speed()*/, nframes, true); } 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; } @@ -516,6 +510,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;