summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libs/ardour/ardour/midi_track.h1
-rw-r--r--libs/ardour/ardour/route.h2
-rw-r--r--libs/ardour/ardour/track.h2
-rw-r--r--libs/ardour/midi_track.cc13
-rw-r--r--libs/ardour/route.cc8
-rw-r--r--libs/ardour/track.cc21
6 files changed, 42 insertions, 5 deletions
diff --git a/libs/ardour/ardour/midi_track.h b/libs/ardour/ardour/midi_track.h
index a96094f140..cf7167e3af 100644
--- a/libs/ardour/ardour/midi_track.h
+++ b/libs/ardour/ardour/midi_track.h
@@ -102,6 +102,7 @@ public:
boost::shared_ptr<MidiBuffer> get_gui_feed_buffer () const;
void set_monitoring (MonitorChoice);
+ MonitorState monitoring_state () const;
void set_input_active (bool);
bool input_active () const;
diff --git a/libs/ardour/ardour/route.h b/libs/ardour/ardour/route.h
index 7b090af35c..1a42999e6b 100644
--- a/libs/ardour/ardour/route.h
+++ b/libs/ardour/ardour/route.h
@@ -527,6 +527,8 @@ class Route : public SessionObject, public Automatable, public RouteGroupMember,
boost::shared_ptr<Amp> _amp;
boost::shared_ptr<PeakMeter> _meter;
+ boost::shared_ptr<Processor> the_instrument_unlocked() const;
+
private:
int set_state_2X (const XMLNode&, int);
void set_processor_state_2X (XMLNodeList const &, int);
diff --git a/libs/ardour/ardour/track.h b/libs/ardour/ardour/track.h
index da3b3b24ee..8493d5e4ae 100644
--- a/libs/ardour/ardour/track.h
+++ b/libs/ardour/ardour/track.h
@@ -51,7 +51,7 @@ class Track : public Route, public PublicDiskstream
virtual void set_monitoring (MonitorChoice);
MonitorChoice monitoring_choice() const { return _monitoring; }
- MonitorState monitoring_state () const;
+ MonitorState monitoring_state () const;
PBD::Signal0<void> MonitoringChanged;
MeterState metering_state () const;
diff --git a/libs/ardour/midi_track.cc b/libs/ardour/midi_track.cc
index 2226574e6a..7f2bb641e1 100644
--- a/libs/ardour/midi_track.cc
+++ b/libs/ardour/midi_track.cc
@@ -352,7 +352,9 @@ MidiTrack::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame
BufferSet& bufs = _session.get_scratch_buffers (n_process_buffers());
MidiBuffer& mbuf (bufs.get_midi (0));
- /* we are a MIDI track, so we always start the chain with a single-channel diskstream */
+ /* we are a MIDI track, so we always start the chain with a
+ * single-MIDI-channel diskstream
+ */
ChanCount c;
c.set_audio (0);
c.set_midi (1);
@@ -772,3 +774,12 @@ MidiTrack::set_monitoring (MonitorChoice mc)
}
}
+MonitorState
+MidiTrack::monitoring_state () const
+{
+ MonitorState ms = Track::monitoring_state();
+ if (ms == MonitoringSilence) {
+ return MonitoringInput;
+ }
+ return ms;
+}
diff --git a/libs/ardour/route.cc b/libs/ardour/route.cc
index e086bb8b4b..8d59a80580 100644
--- a/libs/ardour/route.cc
+++ b/libs/ardour/route.cc
@@ -4114,6 +4114,12 @@ boost::shared_ptr<Processor>
Route::the_instrument () const
{
Glib::Threads::RWLock::WriterLock lm (_processor_lock);
+ return the_instrument_unlocked ();
+}
+
+boost::shared_ptr<Processor>
+Route::the_instrument_unlocked () const
+{
for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
if (boost::dynamic_pointer_cast<PluginInsert>(*i)) {
if ((*i)->input_streams().n_midi() > 0 &&
@@ -4125,6 +4131,8 @@ Route::the_instrument () const
return boost::shared_ptr<Processor>();
}
+
+
void
Route::non_realtime_locate (framepos_t pos)
{
diff --git a/libs/ardour/track.cc b/libs/ardour/track.cc
index c7cff72fd3..52a960fce6 100644
--- a/libs/ardour/track.cc
+++ b/libs/ardour/track.cc
@@ -370,19 +370,34 @@ Track::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame,
into the route.
*/
be_silent = true;
+
} else {
+
MonitorState const s = monitoring_state ();
/* we are not rolling, so be silent even if we are monitoring disk, as there
will be no disk data coming in.
*/
- be_silent = (s == MonitoringSilence || s == MonitoringDisk);
+ switch (s) {
+ case MonitoringSilence:
+ /* if there is an instrument, be_silent should always
+ be false
+ */
+ be_silent = (the_instrument_unlocked() == 0);
+ break;
+ case MonitoringDisk:
+ be_silent = true;
+ break;
+ case MonitoringInput:
+ be_silent = false;
+ break;
+ }
}
-
+
if (!_have_internal_generator && metering_state() == MeteringInput) {
_input->process_input (_meter, start_frame, end_frame, nframes);
}
- _amp->apply_gain_automation(false);
+ _amp->apply_gain_automation (false);
/* if have_internal_generator, or .. */
//_input->process_input (_meter, start_frame, end_frame, nframes);