diff options
Diffstat (limited to 'libs')
-rw-r--r-- | libs/ardour/ardour/midi_diskstream.h | 1 | ||||
-rw-r--r-- | libs/ardour/ardour/midi_ring_buffer.h | 1 | ||||
-rw-r--r-- | libs/ardour/midi_diskstream.cc | 13 | ||||
-rw-r--r-- | libs/ardour/midi_ring_buffer.cc | 7 | ||||
-rw-r--r-- | libs/ardour/midi_track.cc | 10 | ||||
-rw-r--r-- | libs/ardour/mute_master.cc | 3 | ||||
-rw-r--r-- | libs/ardour/session.cc | 1 |
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); } |