- size_t read_events = 0;
-
- if (start != _next_read) {
- _read_iter = const_iterator(*this, (double)start);
- // cerr << "Repositioning iterator from " << _next_read << " to " << start << endl;
- //} else {
- // cerr << "Using cached iterator at " << _next_read << endl;
- }
-
- _next_read = start + nframes;
-
- while (_read_iter != end() && _read_iter->time() < start + nframes) {
- dst.write(_read_iter->time() + stamp_offset, _read_iter->size(), _read_iter->buffer());
- ++_read_iter;
- ++read_events;
- }
-
-#if 0
- /* FIXME: cache last lookup value to avoid O(n) search every time */
-
- if (_note_mode == Sustained) {
-
- for (Notes::const_iterator n = _notes.begin(); n != _notes.end(); ++n) {
-
- while ( ! _active_notes.empty() ) {
- const Note* const earliest_off = _active_notes.top();
- const MidiEvent& off_ev = earliest_off->off_event();
- if (off_ev.time() < start + nframes && off_ev.time() <= n->time()) {
- dst.write(off_ev.time() + stamp_offset, off_ev.size(), off_ev.buffer());
- _active_notes.pop();
- ++read_events;
- } else {
- break;
- }
- }
-
- if (n->time() >= start + nframes)
- break;
-
- // Note on
- if (n->time() >= start) {
- const MidiEvent& on_ev = n->on_event();
- dst.write(on_ev.time() + stamp_offset, on_ev.size(), on_ev.buffer());
- _active_notes.push(&(*n));
- ++read_events;
- }
-
- }
-
- // Write any trailing note offs
- while ( ! _active_notes.empty() ) {
- const Note* const earliest_off = _active_notes.top();
- const MidiEvent& off_ev = earliest_off->off_event();
- if (off_ev.time() < start + nframes) {
- dst.write(off_ev.time() + stamp_offset, off_ev.size(), off_ev.buffer());
- _active_notes.pop();
- ++read_events;
- } else {
- break;
- }
- }
-
- // Percussive
- } else {
- for (Notes::const_iterator n = _notes.begin(); n != _notes.end(); ++n) {
- // Note on
- if (n->time() >= start) {
- if (n->time() < start + nframes) {
- const MidiEvent& ev = n->on_event();
- dst.write(ev.time() + stamp_offset, ev.size(), ev.buffer());
- ++read_events;
- } else {
- break;
- }
- }
- }
- }
-#endif
- return read_events;