diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2019-10-17 15:19:05 -0600 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2019-11-02 16:32:18 -0600 |
commit | 5cd9c86d580d6419400e67f5890d583c606c8a10 (patch) | |
tree | a245b803e266d8a9204cbfaf386dd3e1f832cc08 /libs/ardour/midi_playlist.cc | |
parent | c55e23e7aadca4ebe3b9ee8029abce939b4403ec (diff) |
add RAII-style write protection while rendering MIDI playlist into RTMidiBuffer
Diffstat (limited to 'libs/ardour/midi_playlist.cc')
-rw-r--r-- | libs/ardour/midi_playlist.cc | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/libs/ardour/midi_playlist.cc b/libs/ardour/midi_playlist.cc index 61d114f67f..881641d32a 100644 --- a/libs/ardour/midi_playlist.cc +++ b/libs/ardour/midi_playlist.cc @@ -519,8 +519,12 @@ MidiPlaylist::render (RTMidiBuffer& dst, MidiChannelFilter* filter) Evoral::EventList<samplepos_t> evlist; Evoral::EventSink<samplepos_t>* tgt; + /* RAII */ + RTMidiBuffer::WriteProtectRender wpr (dst); + if (regs.size() == 1) { tgt = &dst; + wpr.acquire (); } else { tgt = &evlist; } @@ -545,6 +549,9 @@ MidiPlaylist::render (RTMidiBuffer& dst, MidiChannelFilter* filter) evlist.sort (cmp); /* Copy ordered events from event list to dst. */ + + wpr.acquire (); + for (Evoral::EventList<samplepos_t>::iterator e = evlist.begin(); e != evlist.end(); ++e) { Evoral::Event<samplepos_t>* ev (*e); dst.write (ev->time(), ev->event_type(), ev->size(), ev->buffer()); @@ -552,6 +559,8 @@ MidiPlaylist::render (RTMidiBuffer& dst, MidiChannelFilter* filter) } } - DEBUG_TRACE (DEBUG::MidiPlaylistIO, "---- End MidiPlaylist::dump ----\n"); + /* no need to release - RAII with WriteProtectRender takes care of it */ + + DEBUG_TRACE (DEBUG::MidiPlaylistIO, "---- End MidiPlaylist::dump ----\n"); } |