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)
+ , _disk_io_point (DiskIOPreFader)
, _mode (mode)
, _alignment_choice (Automatic)
{
use_new_playlist ();
- /* ordering here is important, and needs to be generally maintained */
-
- add_processor (_disk_writer, PreFader);
- add_processor (_disk_reader, PreFader);
+ /* disk writer and reader processors will be added when Route calls
+ * setup_invisible_processors_oh_children_of_mine ().
+ */
boost::shared_ptr<Route> rp (boost::dynamic_pointer_cast<Route> (shared_from_this()));
boost::shared_ptr<Track> rt = boost::dynamic_pointer_cast<Track> (rp);
root.add_child_nocopy (_record_enable_control->get_state ());
root.set_property (X_("saved-meter-point"), _saved_meter_point);
+ root.set_property (X_("disk-io-point"), _disk_io_point);
root.set_property (X_("alignment-choice"), _alignment_choice);
return root;
_saved_meter_point = _meter_point;
}
+ if (!node.get_property (X_("saved-meter-point"), _disk_io_point)) {
+ _disk_io_point = DiskIOPreFader;
+ }
+
AlignChoice ac;
if (node.get_property (X_("alignment-choice"), ac)) {
pl->set_capture_insertion_in_progress (false);
_session.add_command (new StatefulDiffCommand (pl));
}
+
+#ifdef __clang__
+__attribute__((annotate("realtime")))
+#endif
+void
+Track::setup_invisible_processors_oh_children_of_mine (ProcessorList& processors)
+{
+ ProcessorList::iterator insert_pos;
+
+ switch (_disk_io_point) {
+ case DiskIOPreFader:
+ insert_pos = find (processors.begin(), processors.end(), _trim);
+ if (insert_pos != processors.end()) {
+ insert_pos = processors.insert (insert_pos, _disk_writer);
+ processors.insert (insert_pos, _disk_reader);
+ }
+ break;
+ case DiskIOPostFader:
+ insert_pos = find (processors.begin(), processors.end(), _main_outs);
+ if (insert_pos != processors.end()) {
+ insert_pos = processors.insert (insert_pos, _disk_writer);
+ processors.insert (insert_pos, _disk_reader);
+ }
+ case DiskIOCustom:
+ break;
+ }
+}
+
+void
+Track::set_disk_io_position (DiskIOPoint diop)
+{
+ bool display = false;
+
+ switch (diop) {
+ case DiskIOCustom:
+ display = true;
+ break;
+ default:
+ display = false;
+ }
+
+ _disk_writer->set_display_to_user (display);
+ _disk_reader->set_display_to_user (display);
+
+ const bool changed = (diop != _disk_io_point);
+
+ _disk_io_point = diop;
+
+ if (changed) {
+ Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
+ configure_processors (0);
+ }
+}