#include <glibmm/thread.h>
-#include <pbd/basename.h>
-#include <pbd/xml++.h>
-#include <pbd/enumwriter.h>
-
-#include <ardour/midi_region.h>
-#include <ardour/session.h>
-#include <ardour/gain.h>
-#include <ardour/dB.h>
-#include <ardour/playlist.h>
-#include <ardour/midi_source.h>
-#include <ardour/types.h>
-#include <ardour/midi_ring_buffer.h>
+#include "pbd/basename.h"
+#include "pbd/xml++.h"
+#include "pbd/enumwriter.h"
+
+#include "ardour/midi_region.h"
+#include "ardour/session.h"
+#include "ardour/gain.h"
+#include "ardour/dB.h"
+#include "ardour/playlist.h"
+#include "ardour/midi_source.h"
+#include "ardour/types.h"
+#include "ardour/midi_ring_buffer.h"
#include "i18n.h"
#include <locale.h>
{
}
+void
+MidiRegion::set_position_internal (nframes_t pos, bool allow_bbt_recompute)
+{
+ BeatsFramesConverter old_converter(_session, _position - _start);
+ double length_beats = old_converter.from(_length);
+
+ Region::set_position_internal(pos, allow_bbt_recompute);
+
+ BeatsFramesConverter new_converter(_session, pos - _start);
+
+ set_length(new_converter.to(length_beats), 0);
+}
+
nframes_t
MidiRegion::read_at (MidiRingBuffer<nframes_t>& out, sframes_t position, nframes_t dur, uint32_t chan_n, NoteMode mode) const
{
}
nframes_t
-MidiRegion::_read_at (const SourceList& srcs, MidiRingBuffer<nframes_t>& dst, nframes_t position, nframes_t dur, uint32_t chan_n, NoteMode mode) const
+MidiRegion::_read_at (const SourceList& /*srcs*/, MidiRingBuffer<nframes_t>& dst, nframes_t position, nframes_t dur, uint32_t chan_n, NoteMode mode) const
{
- /*cerr << "MidiRegion " << _name << "._read_at(" << position << ") - "
- << position << " duration: " << dur << endl;*/
-
nframes_t internal_offset = 0;
nframes_t src_offset = 0;
nframes_t to_read = 0;
-
+
/* precondition: caller has verified that we cover the desired section */
assert(chan_n == 0);
return 0; /* read nothing */
}
-
if ((to_read = min (dur, _length - internal_offset)) == 0) {
return 0; /* read nothing */
}
// _start from the note times in the midi source
negative_output_buffer_position = _start;
}
-
+
+#if 0
+ cerr << "\t\tsource read from " << _position << " - " << _start << " (" << _position - _start << ") "
+ << " start in source " << _start << " + " << internal_offset << " (" << _start + internal_offset << ") "
+ << " dur = " << to_read
+ << " offset = " << output_buffer_position
+ << " negoffset = " << negative_output_buffer_position
+ << endl;
+#endif
+
if (src->midi_read (
dst, // destination buffer
_position - _start, // start position of the source in this read context
- _start + internal_offset, // where to start reading in the region
+ _start + internal_offset, // where to start reading in the source
to_read, // read duration in frames
output_buffer_position, // the offset in the output buffer
negative_output_buffer_position // amount to substract from note times