diff options
Diffstat (limited to 'libs/ardour/midi_playlist.cc')
-rw-r--r-- | libs/ardour/midi_playlist.cc | 55 |
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())); |