From bfa5eb982d174ccdfe855023c4c3119f6df3a585 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Thu, 19 Dec 2019 13:11:43 -0700 Subject: handle MIDI rendering correctly when there are no regions --- libs/ardour/midi_playlist.cc | 55 ++++++++++++++++++++++++-------------------- 1 file 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 >::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 mr = boost::dynamic_pointer_cast(*i); + for (vector >::iterator i = regs.begin(); i != regs.end(); ++i) { - if (!mr) { - continue; - } + boost::shared_ptr mr = boost::dynamic_pointer_cast(*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 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 cmp; + evlist.sort (cmp); - wpr.acquire (); - _rendered.clear (); + /* Copy ordered events from event list to _rendered. */ - 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; + 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())); -- cgit v1.2.3