summaryrefslogtreecommitdiff
path: root/libs/ardour/midi_source.cc
diff options
context:
space:
mode:
Diffstat (limited to 'libs/ardour/midi_source.cc')
-rw-r--r--libs/ardour/midi_source.cc22
1 files changed, 14 insertions, 8 deletions
diff --git a/libs/ardour/midi_source.cc b/libs/ardour/midi_source.cc
index 70abb99e56..ece0d9b104 100644
--- a/libs/ardour/midi_source.cc
+++ b/libs/ardour/midi_source.cc
@@ -52,16 +52,20 @@ sigc::signal<void,MidiSource *> MidiSource::MidiSourceCreated;
MidiSource::MidiSource (Session& s, string name)
: Source (s, name, DataType::MIDI)
, _timeline_position(0)
+ , _read_data_count(0)
+ , _write_data_count(0)
+ , _converter(s, _timeline_position)
, _writing (false)
, _last_read_end(0)
{
- _read_data_count = 0;
- _write_data_count = 0;
}
MidiSource::MidiSource (Session& s, const XMLNode& node)
: Source (s, node)
, _timeline_position(0)
+ , _read_data_count(0)
+ , _write_data_count(0)
+ , _converter(s, _timeline_position)
, _writing (false)
, _last_read_end(0)
{
@@ -110,12 +114,7 @@ MidiSource::midi_read (MidiRingBuffer<nframes_t>& dst, nframes_t start, nframes_
Glib::Mutex::Lock lm (_lock);
if (_model) {
- // FIXME: assumes tempo never changes after start
- const Tempo& tempo = _session.tempo_map().tempo_at(_timeline_position);
- const double frames_per_beat = tempo.frames_per_beat(
- _session.engine().frame_rate(),
- _session.tempo_map().meter_at(_timeline_position));
-#define BEATS_TO_FRAMES(t) (((t) * frames_per_beat) + stamp_offset - negative_stamp_offset)
+#define BEATS_TO_FRAMES(t) (_converter.to(t) + stamp_offset - negative_stamp_offset)
Evoral::Sequence<double>::const_iterator& i = _model_iter;
@@ -162,6 +161,13 @@ MidiSource::file_changed (string path)
}
void
+MidiSource::set_timeline_position (nframes_t when)
+{
+ _timeline_position = when;
+ _converter.set_origin(when);
+}
+
+void
MidiSource::mark_streaming_midi_write_started (NoteMode mode, nframes_t start_frame)
{
set_timeline_position(start_frame); // why do I have a feeling this can break somehow...