summaryrefslogtreecommitdiff
path: root/libs/ardour
diff options
context:
space:
mode:
authorBen Loftis <ben@harrisonconsoles.com>2018-02-14 18:04:57 -0600
committerBen Loftis <ben@harrisonconsoles.com>2018-02-14 18:04:57 -0600
commit208c781248335dda963f032fcb7e9427bb070244 (patch)
treeb6d0253486929af2c5a91572a6c6bac222ca89b6 /libs/ardour
parent58002d82eaed7b0c4d388eccc93a5f638a3ff409 (diff)
Auto-monitor == Cue for MIDI tracks.
Diffstat (limited to 'libs/ardour')
-rw-r--r--libs/ardour/ardour/audio_track.h2
-rw-r--r--libs/ardour/ardour/midi_track.h1
-rw-r--r--libs/ardour/ardour/route.h2
-rw-r--r--libs/ardour/ardour/types.h1
-rw-r--r--libs/ardour/audio_track.cc67
-rw-r--r--libs/ardour/midi_track.cc7
-rw-r--r--libs/ardour/route.cc64
7 files changed, 82 insertions, 62 deletions
diff --git a/libs/ardour/ardour/audio_track.h b/libs/ardour/ardour/audio_track.h
index aecf5d2c9f..ee25837481 100644
--- a/libs/ardour/ardour/audio_track.h
+++ b/libs/ardour/ardour/audio_track.h
@@ -36,6 +36,8 @@ class LIBARDOUR_API AudioTrack : public Track
AudioTrack (Session&, std::string name, TrackMode m = Normal);
~AudioTrack ();
+ MonitorState get_auto_monitoring_state () const;
+
void freeze_me (InterThreadInfo&);
void unfreeze ();
diff --git a/libs/ardour/ardour/midi_track.h b/libs/ardour/ardour/midi_track.h
index abee445e01..d9a11540e4 100644
--- a/libs/ardour/ardour/midi_track.h
+++ b/libs/ardour/ardour/midi_track.h
@@ -125,6 +125,7 @@ public:
boost::shared_ptr<MidiBuffer> get_gui_feed_buffer () const;
MonitorState monitoring_state () const;
+ MonitorState get_auto_monitoring_state () const;
MidiBuffer const& immediate_event_buffer () const { return _immediate_event_buffer; }
diff --git a/libs/ardour/ardour/route.h b/libs/ardour/ardour/route.h
index 138f8a9d71..bfd894375b 100644
--- a/libs/ardour/ardour/route.h
+++ b/libs/ardour/ardour/route.h
@@ -134,6 +134,8 @@ public:
boost::shared_ptr<MonitorControl> monitoring_control() const { return _monitoring_control; }
MonitorState monitoring_state () const;
+ virtual MonitorState get_auto_monitoring_state () const { return MonitoringSilence; }
+
virtual MeterState metering_state () const;
/* these are the core of the API of a Route. see the protected sections as well */
diff --git a/libs/ardour/ardour/types.h b/libs/ardour/ardour/types.h
index 352c20ae9b..4bdab6b070 100644
--- a/libs/ardour/ardour/types.h
+++ b/libs/ardour/ardour/types.h
@@ -432,6 +432,7 @@ namespace ARDOUR {
MonitoringSilence = 0x1,
MonitoringInput = 0x2,
MonitoringDisk = 0x4,
+ MonitoringCue = 0x6,
};
enum MeterState {
diff --git a/libs/ardour/audio_track.cc b/libs/ardour/audio_track.cc
index 12c2f1975b..46aff98122 100644
--- a/libs/ardour/audio_track.cc
+++ b/libs/ardour/audio_track.cc
@@ -64,6 +64,73 @@ AudioTrack::~AudioTrack ()
}
}
+MonitorState
+AudioTrack::get_auto_monitoring_state () const
+{
+ /* 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.
+ */
+
+ bool const roll = _session.transport_rolling ();
+ bool const track_rec = _disk_writer->record_enabled ();
+ bool const auto_input = _session.config.get_auto_input ();
+ bool const software_monitor = Config->get_monitoring_model() == SoftwareMonitoring;
+ bool const tape_machine_mode = Config->get_tape_machine_mode ();
+ bool session_rec;
+
+ /* I suspect that just use actively_recording() is good enough all the
+ * 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: sept 30 2017: Above is not the case: punch-in/out location is
+ * global session playhead position.
+ * When this method is called from process_output_buffers() we need
+ * to use delay-compensated route's process-position.
+ *
+ * NB. Disk reader/writer may also be offset by a same amount of time.
+ *
+ * Also keep in mind that _session.transport_rolling() is false during
+ * pre-roll but the disk already produces output.
+ *
+ * TODO: FIXME
+ */
+
+ if (_session.config.get_punch_in() || _session.config.get_punch_out()) {
+ session_rec = _session.actively_recording ();
+ } else {
+ session_rec = _session.get_record_enabled();
+ }
+
+ if (track_rec) {
+
+ if (!session_rec && roll && auto_input) {
+ return MonitoringDisk;
+ } else {
+ return software_monitor ? MonitoringInput : MonitoringSilence;
+ }
+
+ } else {
+
+ if (tape_machine_mode) {
+
+ return MonitoringDisk;
+
+ } else {
+
+ if (!roll && auto_input) {
+ return software_monitor ? MonitoringInput : MonitoringSilence;
+ } else {
+ return MonitoringDisk;
+ }
+
+ }
+ }
+
+ abort(); /* NOTREACHED */
+ return MonitoringSilence;
+}
+
int
AudioTrack::set_state (const XMLNode& node, int version)
{
diff --git a/libs/ardour/midi_track.cc b/libs/ardour/midi_track.cc
index a6a3b9f6f8..798bd1aef5 100644
--- a/libs/ardour/midi_track.cc
+++ b/libs/ardour/midi_track.cc
@@ -826,6 +826,13 @@ MidiTrack::monitoring_state () const
return ms;
}
+MonitorState
+MidiTrack::get_auto_monitoring_state () const
+{
+ //if we are a midi track, we ignore auto_input, tape_mode, etc etc. "Auto" will monitor Disk+In
+ return MonitoringCue;
+}
+
void
MidiTrack::filter_input (BufferSet& bufs)
{
diff --git a/libs/ardour/route.cc b/libs/ardour/route.cc
index 2c3c14c940..3b615c517b 100644
--- a/libs/ardour/route.cc
+++ b/libs/ardour/route.cc
@@ -57,6 +57,7 @@
#include "ardour/delayline.h"
#include "ardour/midi_buffer.h"
#include "ardour/midi_port.h"
+#include "ardour/midi_track.h"
#include "ardour/monitor_control.h"
#include "ardour/monitor_processor.h"
#include "ardour/pannable.h"
@@ -6007,67 +6008,6 @@ Route::monitoring_state () const
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.
- */
-
- bool const roll = _session.transport_rolling ();
- bool const track_rec = _disk_writer->record_enabled ();
- bool const auto_input = _session.config.get_auto_input ();
- bool const software_monitor = Config->get_monitoring_model() == SoftwareMonitoring;
- bool const tape_machine_mode = Config->get_tape_machine_mode ();
- bool session_rec;
-
- /* I suspect that just use actively_recording() is good enough all the
- * 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: sept 30 2017: Above is not the case: punch-in/out location is
- * global session playhead position.
- * When this method is called from process_output_buffers() we need
- * to use delay-compensated route's process-position.
- *
- * NB. Disk reader/writer may also be offset by a same amount of time.
- *
- * Also keep in mind that _session.transport_rolling() is false during
- * pre-roll but the disk already produces output.
- *
- * TODO: FIXME
- */
-
- if (_session.config.get_punch_in() || _session.config.get_punch_out()) {
- session_rec = _session.actively_recording ();
- } else {
- session_rec = _session.get_record_enabled();
- }
-
- if (track_rec) {
-
- if (!session_rec && roll && auto_input) {
- return MonitoringDisk;
- } else {
- return software_monitor ? MonitoringInput : MonitoringSilence;
- }
-
- } else {
-
- if (tape_machine_mode) {
-
- return MonitoringDisk;
-
- } else {
-
- if (!roll && auto_input) {
- return software_monitor ? MonitoringInput : MonitoringSilence;
- } else {
- return MonitoringDisk;
- }
-
- }
- }
-
- abort(); /* NOTREACHED */
- return MonitoringSilence;
+ return get_auto_monitoring_state();
}
#endif