summaryrefslogtreecommitdiff
path: root/libs/ardour/midi_playlist.cc
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2019-12-19 13:11:43 -0700
committerPaul Davis <paul@linuxaudiosystems.com>2019-12-19 13:14:45 -0700
commitbfa5eb982d174ccdfe855023c4c3119f6df3a585 (patch)
tree1f188b3bea131254179afc88fdb789d4224dd733 /libs/ardour/midi_playlist.cc
parentd0668721d5ac0c3d1de6f09e482eae49562232df (diff)
handle MIDI rendering correctly when there are no regions
Diffstat (limited to 'libs/ardour/midi_playlist.cc')
-rw-r--r--libs/ardour/midi_playlist.cc55
1 files changed, 30 insertions, 25 deletions
diff --git a/libs/ardour/midi_playlist.cc b/libs/ardour/midi_playlist.cc
index 3b24232626..b79a90fde6 100644
--- a/libs/ardour/midi_playlist.cc
+++ b/libs/ardour/midi_playlist.cc
@@ -339,46 +339,51 @@ MidiPlaylist::render (MidiChannelFilter* filter)
/* RAII */
RTMidiBuffer::WriteProtectRender wpr (_rendered);
- if (regs.size() == 1) {
- tgt = &_rendered;
+ if (regs.empty()) {
wpr.acquire ();
_rendered.clear ();
} else {
- tgt = &evlist;
- }
- DEBUG_TRACE (DEBUG::MidiPlaylistIO, string_compose ("\t%1 regions to read, direct: %2\n", regs.size(), (regs.size() == 1)));
+ if (regs.size() == 1) {
+ tgt = &_rendered;
+ wpr.acquire ();
+ _rendered.clear ();
+ } else {
+ tgt = &evlist;
+ }
- for (vector<boost::shared_ptr<Region> >::iterator i = regs.begin(); i != regs.end(); ++i) {
+ DEBUG_TRACE (DEBUG::MidiPlaylistIO, string_compose ("\t%1 regions to read, direct: %2\n", regs.size(), (regs.size() == 1)));
- boost::shared_ptr<MidiRegion> mr = boost::dynamic_pointer_cast<MidiRegion>(*i);
+ for (vector<boost::shared_ptr<Region> >::iterator i = regs.begin(); i != regs.end(); ++i) {
- if (!mr) {
- continue;
- }
+ boost::shared_ptr<MidiRegion> mr = boost::dynamic_pointer_cast<MidiRegion>(*i);
- DEBUG_TRACE (DEBUG::MidiPlaylistIO, string_compose ("render from %1\n", mr->name()));
- mr->render (*tgt, 0, _note_mode, filter);
- }
+ if (!mr) {
+ continue;
+ }
- if (!evlist.empty()) {
- /* We've read from multiple regions into evlist, sort the event list by time. */
- EventsSortByTimeAndType<samplepos_t> cmp;
- evlist.sort (cmp);
+ DEBUG_TRACE (DEBUG::MidiPlaylistIO, string_compose ("render from %1\n", mr->name()));
+ mr->render (*tgt, 0, _note_mode, filter);
+ }
- /* Copy ordered events from event list to _rendered. */
+ if (!evlist.empty()) {
+ /* We've read from multiple regions into evlist, sort the event list by time. */
+ EventsSortByTimeAndType<samplepos_t> cmp;
+ evlist.sort (cmp);
- wpr.acquire ();
- _rendered.clear ();
+ /* Copy ordered events from event list to _rendered. */
- for (Evoral::EventList<samplepos_t>::iterator e = evlist.begin(); e != evlist.end(); ++e) {
- Evoral::Event<samplepos_t>* ev (*e);
- _rendered.write (ev->time(), ev->event_type(), ev->size(), ev->buffer());
- delete ev;
+ wpr.acquire ();
+ _rendered.clear ();
+
+ for (Evoral::EventList<samplepos_t>::iterator e = evlist.begin(); e != evlist.end(); ++e) {
+ Evoral::Event<samplepos_t>* ev (*e);
+ _rendered.write (ev->time(), ev->event_type(), ev->size(), ev->buffer());
+ delete ev;
+ }
}
}
-
/* no need to release - RAII with WriteProtectRender takes care of it */
DEBUG_TRACE (DEBUG::MidiPlaylistIO, string_compose ("---- End MidiPlaylist::render, events: %1\n", _rendered.size()));