summaryrefslogtreecommitdiff
path: root/libs/ardour/route.cc
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2017-07-25 17:29:19 -0400
committerPaul Davis <paul@linuxaudiosystems.com>2017-09-18 11:40:53 -0400
commit13d44c4d7627e32a9c98645ab5a95daa6abc8cca (patch)
treee7981d75065977def758a89bbdded77ca1d66a5c /libs/ardour/route.cc
parent9d355f1390c4090da8195c50bd37e2b781ef87b3 (diff)
move disk_{writer,reader} into Route to allow for simple, sensible implementation of DiskIOPoint
Diffstat (limited to 'libs/ardour/route.cc')
-rw-r--r--libs/ardour/route.cc106
1 files changed, 101 insertions, 5 deletions
diff --git a/libs/ardour/route.cc b/libs/ardour/route.cc
index f83a9d4d13..c447f26875 100644
--- a/libs/ardour/route.cc
+++ b/libs/ardour/route.cc
@@ -47,6 +47,8 @@
#include "ardour/capturing_processor.h"
#include "ardour/debug.h"
#include "ardour/delivery.h"
+#include "ardour/disk_reader.h"
+#include "ardour/disk_writer.h"
#include "ardour/event_type_map.h"
#include "ardour/gain_control.h"
#include "ardour/internal_return.h"
@@ -96,6 +98,7 @@ Route::Route (Session& sess, string name, PresentationInfo::Flag flag, DataType
, _signal_latency_at_trim_position (0)
, _initial_delay (0)
, _roll_delay (0)
+ , _disk_io_point (DiskIOPreFader)
, _pending_process_reorder (0)
, _pending_signals (0)
, _pending_declick (true)
@@ -239,10 +242,6 @@ Route::init ()
_monitor_control->activate ();
}
- /* give derived classes a chance to add processors before we configure */
-
- add_processors_oh_children_of_mine ();
-
/* now that we have _meter, its safe to connect to this */
{
@@ -2340,6 +2339,7 @@ Route::state(bool full_state)
node->set_property ("active", _active);
node->set_property ("denormal-protection", _denormal_protection);
node->set_property ("meter-point", _meter_point);
+ node->set_property ("disk-io-point", _disk_io_point);
node->set_property ("meter-type", _meter_type);
@@ -2496,6 +2496,17 @@ Route::set_state (const XMLNode& node, int version)
}
}
+ DiskIOPoint diop;
+ if (node.get_property (X_("disk-io-point"), diop)) {
+ if (_disk_writer) {
+ _disk_writer->set_display_to_user (diop == DiskIOCustom);
+ }
+ if (_disk_reader) {
+ _disk_reader->set_display_to_user (diop == DiskIOCustom);
+ }
+ set_disk_io_point (diop);
+ }
+
node.get_property (X_("meter-type"), _meter_type);
_initial_io_setup = false;
@@ -2835,6 +2846,12 @@ Route::set_processor_state (const XMLNode& node)
} else if (prop->value() == "capture") {
/* CapturingProcessor should never be restored, it's always
added explicitly when needed */
+ } else if (prop->value() == "diskreader" && _disk_reader) {
+ _disk_reader->set_state (**niter, Stateful::current_state_version);
+ new_order.push_back (_disk_reader);
+ } else if (prop->value() == "diskwriter" && _disk_writer) {
+ _disk_writer->set_state (**niter, Stateful::current_state_version);
+ new_order.push_back (_disk_writer);
} else {
set_processor_state (**niter, prop, new_order, must_configure);
}
@@ -4511,6 +4528,8 @@ Route::setup_invisible_processors ()
*/
ProcessorList new_processors;
+ ProcessorList::iterator dr;
+ ProcessorList::iterator dw;
/* find visible processors */
@@ -4630,9 +4649,12 @@ Route::setup_invisible_processors ()
/* TRIM CONTROL */
+ ProcessorList::iterator trim = new_processors.end();
+
if (_trim && _trim->active()) {
assert (!_trim->display_to_user ());
new_processors.push_front (_trim);
+ trim = new_processors.begin();
}
/* INTERNAL RETURN */
@@ -4653,7 +4675,46 @@ Route::setup_invisible_processors ()
new_processors.push_front (_capturing_processor);
}
- setup_invisible_processors_oh_children_of_mine (new_processors);
+ /* DISK READER & WRITER (for Track objects) */
+
+ if (_disk_reader || _disk_writer) {
+ switch (_disk_io_point) {
+ case DiskIOPreFader:
+ if (trim != new_processors.end()) {
+ /* insert AFTER TRIM */
+ ProcessorList::iterator insert_pos = trim;
+ ++insert_pos;
+ if (_disk_writer) {
+ new_processors.insert (insert_pos, _disk_writer);
+ }
+ if (_disk_reader) {
+ new_processors.insert (insert_pos, _disk_reader);
+ }
+ } else {
+ if (_disk_writer) {
+ new_processors.push_front (_disk_writer);
+ }
+ if (_disk_reader) {
+ new_processors.push_front (_disk_reader);
+ }
+ }
+ break;
+ case DiskIOPostFader:
+ /* insert BEFORE main outs */
+ if (_disk_writer) {
+ new_processors.insert (main, _disk_writer);
+ }
+ if (_disk_reader) {
+ new_processors.insert (main, _disk_reader);
+ }
+ break;
+ case DiskIOCustom:
+ /* reader and writer are visible under this condition, so they
+ * are not invisible and thus not handled here.
+ */
+ break;
+ }
+ }
_processors = new_processors;
@@ -5565,3 +5626,38 @@ Route::slavables () const
rv.push_back (_solo_control);
return rv;
}
+
+void
+Route::set_disk_io_point (DiskIOPoint diop)
+{
+ bool display = false;
+
+ cerr << "set disk io to " << enum_2_string (diop) << endl;
+
+ switch (diop) {
+ case DiskIOCustom:
+ display = true;
+ break;
+ default:
+ display = false;
+ }
+
+ if (_disk_writer) {
+ _disk_writer->set_display_to_user (display);
+ }
+
+ if (_disk_reader) {
+ _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);
+ }
+
+ processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
+}