mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-16 19:56:31 +01:00
handle MIDI rendering correctly when there are no regions
This commit is contained in:
parent
d0668721d5
commit
bfa5eb982d
1 changed files with 32 additions and 27 deletions
|
|
@ -339,46 +339,51 @@ MidiPlaylist::render (MidiChannelFilter* filter)
|
||||||
/* RAII */
|
/* RAII */
|
||||||
RTMidiBuffer::WriteProtectRender wpr (_rendered);
|
RTMidiBuffer::WriteProtectRender wpr (_rendered);
|
||||||
|
|
||||||
if (regs.size() == 1) {
|
if (regs.empty()) {
|
||||||
tgt = &_rendered;
|
|
||||||
wpr.acquire ();
|
wpr.acquire ();
|
||||||
_rendered.clear ();
|
_rendered.clear ();
|
||||||
} else {
|
} 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;
|
||||||
for (vector<boost::shared_ptr<Region> >::iterator i = regs.begin(); i != regs.end(); ++i) {
|
wpr.acquire ();
|
||||||
|
_rendered.clear ();
|
||||||
boost::shared_ptr<MidiRegion> mr = boost::dynamic_pointer_cast<MidiRegion>(*i);
|
} else {
|
||||||
|
tgt = &evlist;
|
||||||
if (!mr) {
|
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
DEBUG_TRACE (DEBUG::MidiPlaylistIO, string_compose ("render from %1\n", mr->name()));
|
DEBUG_TRACE (DEBUG::MidiPlaylistIO, string_compose ("\t%1 regions to read, direct: %2\n", regs.size(), (regs.size() == 1)));
|
||||||
mr->render (*tgt, 0, _note_mode, filter);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!evlist.empty()) {
|
for (vector<boost::shared_ptr<Region> >::iterator i = regs.begin(); i != regs.end(); ++i) {
|
||||||
/* We've read from multiple regions into evlist, sort the event list by time. */
|
|
||||||
EventsSortByTimeAndType<samplepos_t> cmp;
|
|
||||||
evlist.sort (cmp);
|
|
||||||
|
|
||||||
/* Copy ordered events from event list to _rendered. */
|
boost::shared_ptr<MidiRegion> mr = boost::dynamic_pointer_cast<MidiRegion>(*i);
|
||||||
|
|
||||||
wpr.acquire ();
|
if (!mr) {
|
||||||
_rendered.clear ();
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
for (Evoral::EventList<samplepos_t>::iterator e = evlist.begin(); e != evlist.end(); ++e) {
|
DEBUG_TRACE (DEBUG::MidiPlaylistIO, string_compose ("render from %1\n", mr->name()));
|
||||||
Evoral::Event<samplepos_t>* ev (*e);
|
mr->render (*tgt, 0, _note_mode, filter);
|
||||||
_rendered.write (ev->time(), ev->event_type(), ev->size(), ev->buffer());
|
}
|
||||||
delete ev;
|
|
||||||
|
if (!evlist.empty()) {
|
||||||
|
/* We've read from multiple regions into evlist, sort the event list by time. */
|
||||||
|
EventsSortByTimeAndType<samplepos_t> cmp;
|
||||||
|
evlist.sort (cmp);
|
||||||
|
|
||||||
|
/* Copy ordered events from event list to _rendered. */
|
||||||
|
|
||||||
|
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 */
|
/* 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()));
|
DEBUG_TRACE (DEBUG::MidiPlaylistIO, string_compose ("---- End MidiPlaylist::render, events: %1\n", _rendered.size()));
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue