nframes_t
MidiRegion::_read_at (const SourceList& srcs, MidiRingBuffer& dst, nframes_t position, nframes_t dur, uint32_t chan_n, NoteMode mode) const
{
- // cerr << _name << "._read_at(" << position << ") - " << _position << endl;
+ /*cerr << "MidiRegion " << _name << "._read_at(" << position << ") - "
+ << position << " duration: " << dur << endl;*/
nframes_t internal_offset = 0;
nframes_t src_offset = 0;
boost::shared_ptr<MidiSource> src = midi_source(chan_n);
src->set_note_mode(mode);
- if (src->midi_read (dst, _start + internal_offset, to_read, _position) != to_read) {
+ nframes_t output_buffer_position = 0;
+ nframes_t negative_output_buffer_position = 0;
+ if (_position >= _start) {
+ // handle resizing of beginnings of regions correctly
+ output_buffer_position = _position - _start;
+ } else {
+ // when _start is greater than _position, we have to subtract
+ // _start from the note times in the midi source
+ negative_output_buffer_position = _start;
+ }
+
+ if (src->midi_read (
+ // the destination buffer
+ dst,
+ // where to start reading in the region
+ _start + internal_offset,
+ // how many bytes
+ to_read,
+ // the offset in the output buffer
+ output_buffer_position,
+ // what to substract from note times written in the output buffer
+ negative_output_buffer_position
+ ) != to_read) {
return 0; /* "read nothing" */
}
return -1;
}
+int
+MidiRegion::exportme (ARDOUR::Session&, ARDOUR::ExportSpecification&)
+{
+ return -1;
+}
+
boost::shared_ptr<MidiSource>
MidiRegion::midi_source (uint32_t n) const
{