X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=libs%2Fardour%2Ftrack.cc;h=72948b4a98a5ffc90c9bae6a99ec3cf78c523146;hb=9885f04fe6e69bce59271aaa98998b7331153bc0;hp=c9f581add2b03678376f7654d3c567f2213a0153;hpb=c6bd03352382094b9d8996c16c1a681c2cb495c3;p=ardour.git diff --git a/libs/ardour/track.cc b/libs/ardour/track.cc index c9f581add2..72948b4a98 100644 --- a/libs/ardour/track.cc +++ b/libs/ardour/track.cc @@ -55,6 +55,7 @@ using namespace PBD; 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) { @@ -102,10 +103,9 @@ Track::init () 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 rp (boost::dynamic_pointer_cast (shared_from_this())); boost::shared_ptr rt = boost::dynamic_pointer_cast (rp); @@ -162,6 +162,7 @@ Track::state (bool full) 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; @@ -224,6 +225,10 @@ Track::set_state (const XMLNode& node, int version) _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)) { @@ -1512,3 +1517,56 @@ Track::use_captured_audio_sources (SourceList& srcs, CaptureInfos const & captur 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); + } +}