summaryrefslogtreecommitdiff
path: root/libs/ardour/track.cc
diff options
context:
space:
mode:
Diffstat (limited to 'libs/ardour/track.cc')
-rw-r--r--libs/ardour/track.cc59
1 files changed, 47 insertions, 12 deletions
diff --git a/libs/ardour/track.cc b/libs/ardour/track.cc
index fdb1665a31..5693b86c42 100644
--- a/libs/ardour/track.cc
+++ b/libs/ardour/track.cc
@@ -241,14 +241,15 @@ Track::zero_diskstream_id_in_xml (XMLNode& node)
}
int
-Track::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame,
- bool session_state_changing, bool can_record)
+Track::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, bool session_state_changing)
{
Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
if (!lm.locked()) {
return 0;
}
+ bool can_record = _session.actively_recording ();
+
if (n_outputs().n_total() == 0) {
return 0;
}
@@ -323,8 +324,7 @@ Track::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame,
}
int
-Track::silent_roll (pframes_t nframes, framepos_t /*start_frame*/, framepos_t /*end_frame*/,
- bool can_record, bool& need_butler)
+Track::silent_roll (pframes_t nframes, framepos_t /*start_frame*/, framepos_t /*end_frame*/, bool& need_butler)
{
Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
if (!lm.locked()) {
@@ -345,7 +345,7 @@ Track::silent_roll (pframes_t nframes, framepos_t /*start_frame*/, framepos_t /*
silence (nframes);
- return _diskstream->process (_session.transport_frame(), nframes, can_record, need_butler);
+ return _diskstream->process (_session.transport_frame(), nframes, need_butler);
}
void
@@ -774,12 +774,47 @@ Track::set_monitoring (MonitorChoice mc)
}
}
-bool
-Track::should_monitor_input ()
+MonitorState
+Track::monitoring_state ()
{
- return (_monitoring & MonitorInput) ||
- (!(_monitoring & MonitorDisk) &&
- (diskstream->record_enabled() &&
- !can_record &&
- !_session.config.get_auto_input()));
+ MonitorState ms = MonitoringSilence;
+
+ if (_session.transport_rolling()) {
+
+ /* roll case */
+
+ if ((_monitoring & MonitorInput) || // explicitly requested input monitoring
+ (!(_monitoring & MonitorDisk) && // disk monitoring not requested
+ (_diskstream->record_enabled() && // record-enabled BUT
+ !_session.actively_recording() && // session NOT rec-armed
+ !_session.config.get_auto_input()))) { // and auto-input is off
+
+ ms = MonitoringInput;
+
+ } else {
+
+ ms = MonitorState (0);
+ }
+
+ if ((_monitoring & MonitorDisk) || // explicitly requested disk monitoring
+ (!(_monitoring & MonitorInput) && // input monitoring not requested
+ (_diskstream->record_enabled() && // record-enabled BUT
+ (_session.actively_recording() || // session rec-armed OR
+ _session.config.get_auto_input())))) { // auto-input is ON (mon-input while rec-rolling
+
+ ms = MonitorState (ms | MonitoringDisk);
+ }
+
+ } else {
+
+ /* no-roll case */
+
+ if (send_silence()) {
+ ms = MonitoringSilence;
+ } else {
+ ms = MonitoringInput;
+ }
+ }
+
+ return ms;
}