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))); - - for (vector >::iterator i = regs.begin(); i != regs.end(); ++i) { - - boost::shared_ptr mr = boost::dynamic_pointer_cast(*i); - - if (!mr) { - continue; + if (regs.size() == 1) { + tgt = &_rendered; + wpr.acquire (); + _rendered.clear (); + } else { + tgt = &evlist; } - DEBUG_TRACE (DEBUG::MidiPlaylistIO, string_compose ("render from %1\n", mr->name())); - mr->render (*tgt, 0, _note_mode, filter); - } + DEBUG_TRACE (DEBUG::MidiPlaylistIO, string_compose ("\t%1 regions to read, direct: %2\n", regs.size(), (regs.size() == 1))); - if (!evlist.empty()) { - /* We've read from multiple regions into evlist, sort the event list by time. */ - EventsSortByTimeAndType cmp; - evlist.sort (cmp); + for (vector >::iterator i = regs.begin(); i != regs.end(); ++i) { - /* Copy ordered events from event list to _rendered. */ + boost::shared_ptr mr = boost::dynamic_pointer_cast(*i); - wpr.acquire (); - _rendered.clear (); + if (!mr) { + continue; + } - for (Evoral::EventList::iterator e = evlist.begin(); e != evlist.end(); ++e) { - Evoral::Event* ev (*e); - _rendered.write (ev->time(), ev->event_type(), ev->size(), ev->buffer()); - delete ev; + DEBUG_TRACE (DEBUG::MidiPlaylistIO, string_compose ("render from %1\n", mr->name())); + mr->render (*tgt, 0, _note_mode, filter); + } + + if (!evlist.empty()) { + /* We've read from multiple regions into evlist, sort the event list by time. */ + EventsSortByTimeAndType cmp; + evlist.sort (cmp); + + /* Copy ordered events from event list to _rendered. */ + + wpr.acquire (); + _rendered.clear (); + + for (Evoral::EventList::iterator e = evlist.begin(); e != evlist.end(); ++e) { + Evoral::Event* 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()));