Resolve only active notes when muted/non-soloed.

Fixes bug #6206.
This commit is contained in:
David Robillard 2015-03-24 13:47:37 -04:00
parent d67d4d129f
commit 089c334d0c
7 changed files with 33 additions and 3 deletions

View file

@ -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 ();

View file

@ -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;

View file

@ -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 ()
{

View file

@ -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

View file

@ -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);
}
}

View file

@ -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))

View file

@ -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);
}