summaryrefslogtreecommitdiff
path: root/libs/ardour
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2015-03-24 13:47:37 -0400
committerDavid Robillard <d@drobilla.net>2015-03-24 13:48:43 -0400
commit089c334d0c4f2878f81b6767ee2230256e1fc949 (patch)
tree0159e58bd04e9045279b018c2bda61c3ba81929d /libs/ardour
parentd67d4d129f49179e41948d9268c40bc16d0475c9 (diff)
Resolve only active notes when muted/non-soloed.
Fixes bug #6206.
Diffstat (limited to 'libs/ardour')
-rw-r--r--libs/ardour/ardour/midi_diskstream.h1
-rw-r--r--libs/ardour/ardour/midi_ring_buffer.h1
-rw-r--r--libs/ardour/midi_diskstream.cc13
-rw-r--r--libs/ardour/midi_ring_buffer.cc7
-rw-r--r--libs/ardour/midi_track.cc10
-rw-r--r--libs/ardour/mute_master.cc3
-rw-r--r--libs/ardour/session.cc1
7 files changed, 33 insertions, 3 deletions
diff --git a/libs/ardour/ardour/midi_diskstream.h b/libs/ardour/ardour/midi_diskstream.h
index 742b327b36..58b74bd54f 100644
--- a/libs/ardour/ardour/midi_diskstream.h
+++ b/libs/ardour/ardour/midi_diskstream.h
@@ -72,6 +72,7 @@ class LIBARDOUR_API MidiDiskstream : public Diskstream
void set_record_enabled (bool yn);
void reset_tracker ();
+ void resolve_tracker (Evoral::EventSink<framepos_t>& buffer, framepos_t time);
boost::shared_ptr<MidiPlaylist> midi_playlist ();
diff --git a/libs/ardour/ardour/midi_ring_buffer.h b/libs/ardour/ardour/midi_ring_buffer.h
index d89d85b2d7..652f1c49cf 100644
--- a/libs/ardour/ardour/midi_ring_buffer.h
+++ b/libs/ardour/ardour/midi_ring_buffer.h
@@ -56,6 +56,7 @@ public:
void reset_tracker ();
void resolve_tracker (MidiBuffer& dst, framepos_t);
+ void resolve_tracker (Evoral::EventSink<framepos_t>& dst, framepos_t);
private:
MidiStateTracker _tracker;
diff --git a/libs/ardour/midi_diskstream.cc b/libs/ardour/midi_diskstream.cc
index 9795d57b5c..f6ba10342a 100644
--- a/libs/ardour/midi_diskstream.cc
+++ b/libs/ardour/midi_diskstream.cc
@@ -1554,6 +1554,19 @@ MidiDiskstream::reset_tracker ()
}
}
+void
+MidiDiskstream::resolve_tracker (Evoral::EventSink<framepos_t>& buffer, framepos_t time)
+{
+ _playback_buf->resolve_tracker(buffer, time);
+
+ boost::shared_ptr<MidiPlaylist> mp (midi_playlist());
+
+ if (mp) {
+ mp->reset_note_trackers ();
+ }
+}
+
+
boost::shared_ptr<MidiPlaylist>
MidiDiskstream::midi_playlist ()
{
diff --git a/libs/ardour/midi_ring_buffer.cc b/libs/ardour/midi_ring_buffer.cc
index 5bd3f947e2..658583322e 100644
--- a/libs/ardour/midi_ring_buffer.cc
+++ b/libs/ardour/midi_ring_buffer.cc
@@ -303,6 +303,13 @@ MidiRingBuffer<T>::resolve_tracker (MidiBuffer& dst, framepos_t t)
_tracker.resolve_notes (dst, t);
}
+template<typename T>
+void
+MidiRingBuffer<T>::resolve_tracker (Evoral::EventSink<framepos_t>& dst, framepos_t t)
+{
+ _tracker.resolve_notes(dst, t);
+}
+
template class MidiRingBuffer<framepos_t>;
} // namespace ARDOUR
diff --git a/libs/ardour/midi_track.cc b/libs/ardour/midi_track.cc
index 6e59600990..770e4da3fe 100644
--- a/libs/ardour/midi_track.cc
+++ b/libs/ardour/midi_track.cc
@@ -892,7 +892,7 @@ MidiTrack::act_on_mute ()
return;
}
- if (muted()) {
+ if (muted() || _mute_master->muted_by_others_at(MuteMaster::AllPoints)) {
/* only send messages for channels we are using */
uint16_t mask = get_playback_channel_mask();
@@ -904,10 +904,14 @@ MidiTrack::act_on_mute ()
DEBUG_TRACE (DEBUG::MidiIO, string_compose ("%1 delivers mute message to channel %2\n", name(), channel+1));
uint8_t ev[3] = { ((uint8_t) (MIDI_CMD_CONTROL | channel)), MIDI_CTL_SUSTAIN, 0 };
write_immediate_event (3, ev);
- ev[1] = MIDI_CTL_ALL_NOTES_OFF;
- write_immediate_event (3, ev);
+
+ /* Note we do not send MIDI_CTL_ALL_NOTES_OFF here, since this may
+ silence notes that came from another non-muted track. */
}
}
+
+ /* Resolve active notes. */
+ midi_diskstream()->resolve_tracker(_immediate_events, 0);
}
}
diff --git a/libs/ardour/mute_master.cc b/libs/ardour/mute_master.cc
index 9f2ed08dab..5734af8a3d 100644
--- a/libs/ardour/mute_master.cc
+++ b/libs/ardour/mute_master.cc
@@ -31,6 +31,9 @@
using namespace ARDOUR;
using namespace std;
+const MuteMaster::MutePoint MuteMaster::AllPoints = MuteMaster::MutePoint(
+ PreFader|PostFader|Listen|Main);
+
MuteMaster::MuteMaster (Session& s, const std::string&)
: SessionHandleRef (s)
, _mute_point (MutePoint (0))
diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc
index 9e3e168242..7afeebb416 100644
--- a/libs/ardour/session.cc
+++ b/libs/ardour/session.cc
@@ -3022,6 +3022,7 @@ Session::route_solo_changed (bool self_solo_change, void* /*src*/, boost::weak_p
for (RouteList::iterator i = uninvolved.begin(); i != uninvolved.end(); ++i) {
DEBUG_TRACE (DEBUG::Solo, string_compose ("mute change for %1, which neither feeds or is fed by %2\n", (*i)->name(), route->name()));
+ (*i)->act_on_mute ();
(*i)->mute_changed (this);
}