diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2009-10-19 17:05:22 +0000 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2009-10-19 17:05:22 +0000 |
commit | 539a692b0e9d249cab75a2d1c255f8cbef8bcf6b (patch) | |
tree | 9c40db2f5651a57bd90e034c8750209915db2363 /libs/ardour/midi_playlist.cc | |
parent | a86b994c683b981c395f829082abef67add2424a (diff) |
track notes at the region level in MidiPlaylist; resolve them (deliver note offs) if a note spans the end of the region
git-svn-id: svn://localhost/ardour2/branches/3.0@5804 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/ardour/midi_playlist.cc')
-rw-r--r-- | libs/ardour/midi_playlist.cc | 38 |
1 files changed, 34 insertions, 4 deletions
diff --git a/libs/ardour/midi_playlist.cc b/libs/ardour/midi_playlist.cc index 8d030b949e..991e709651 100644 --- a/libs/ardour/midi_playlist.cc +++ b/libs/ardour/midi_playlist.cc @@ -142,6 +142,16 @@ MidiPlaylist::read (MidiRingBuffer<nframes_t>& dst, nframes_t start, nframes_t d for (RegionList::iterator i = regions.begin(); i != regions.end(); ++i) { if ((*i)->coverage (start, end) != OverlapNone) { regs.push_back(*i); + } else { + /* region does not cover the current read boundaries, so make + sure that we silence any notes that it had turned on + */ + NoteTrackers::iterator t = _note_trackers.find ((*i).get()); + if (t != _note_trackers.end()) { + t->second->resolve_notes (dst, (*i)->last_frame()); + delete t->second; + _note_trackers.erase (t); + } } } @@ -151,7 +161,20 @@ MidiPlaylist::read (MidiRingBuffer<nframes_t>& dst, nframes_t start, nframes_t d for (vector<boost::shared_ptr<Region> >::iterator i = regs.begin(); i != regs.end(); ++i) { boost::shared_ptr<MidiRegion> mr = boost::dynamic_pointer_cast<MidiRegion>(*i); if (mr) { - mr->read_at (dst, start, dur, chan_n, _note_mode); + + NoteTrackers::iterator t = _note_trackers.find ((*i).get()); + MidiStateTracker* tracker; + + if (t == _note_trackers.end()) { + pair<Region*,MidiStateTracker*> newpair; + newpair.first = (*i).get(); + tracker = newpair.second = new MidiStateTracker; + _note_trackers.insert (newpair); + } else { + tracker = t->second; + } + + mr->read_at (dst, start, dur, chan_n, _note_mode, tracker); _read_data_count += mr->read_data_count(); } } @@ -159,11 +182,18 @@ MidiPlaylist::read (MidiRingBuffer<nframes_t>& dst, nframes_t start, nframes_t d return dur; } - void -MidiPlaylist::remove_dependents (boost::shared_ptr<Region> /*region*/) +MidiPlaylist::remove_dependents (boost::shared_ptr<Region> region) { - /* MIDI regions have no dependents (crossfades) */ + /* MIDI regions have no dependents (crossfades) but we might be tracking notes */ + NoteTrackers::iterator t = _note_trackers.find (region.get()); + + /* GACK! THREAD SAFETY! */ + + if (t != _note_trackers.end()) { + delete t->second; + _note_trackers.erase (t); + } } |