_track_size = 4;
// Write a tentative header just to pad things out so writing happens in the right spot
- set_timeline_position(0);
flush_header();
write_footer();
seek_to_end();
nframes_t
SMFSource::read_unlocked (MidiRingBuffer& dst, nframes_t start, nframes_t cnt, nframes_t stamp_offset) const
{
- //cerr << "SMF - read " << start << ", count=" << cnt << ", offset=" << stamp_offset << endl;
+ //cerr << "SMF " << name() << " read " << start << ", count=" << cnt << ", offset=" << stamp_offset << endl;
// 64 bits ought to be enough for anybody
uint64_t time = 0; // in SMF ticks, 1 tick per _ppqn
// FIXME: assumes tempo never changes after start
const double frames_per_beat = _session.tempo_map().tempo_at(_timeline_position).frames_per_beat(
- _session.engine().frame_rate());
+ _session.engine().frame_rate(),
+ _session.tempo_map().meter_at(_timeline_position));
const uint64_t start_ticks = (uint64_t)((start / frames_per_beat) * _ppqn);
size_t buf_capacity = 4;
Byte* buf = (Byte*)malloc(buf_capacity);
- if (_model && ! _model->currently_writing())
+ if (_model && ! _model->writing())
_model->start_write();
while (true) {
bool ret = src.full_peek(sizeof(double), (Byte*)&time);
- if (!ret || time > _length + cnt)
+ if (!ret || time - _timeline_position > _length + cnt)
break;
ret = src.read_prefix(&time, &size);
assert(time >= _timeline_position);
time -= _timeline_position;
- assert(time >= _last_ev_time);
const MidiEvent ev(time, size, buf);
- append_event_unlocked(MidiEvent(ev));
+ append_event_unlocked(ev);
if (_model)
_model->append(ev);
const nframes_t oldlen = _length;
update_length(oldlen, cnt);
- ViewDataRangeReady (oldlen, cnt); /* EMIT SIGNAL */
+ ViewDataRangeReady (_timeline_position + oldlen, cnt); /* EMIT SIGNAL */
return cnt;
}
}
printf("\n");*/
+ assert(ev.time() >= 0);
+
assert(ev.time() >= _last_ev_time);
// FIXME: assumes tempo never changes after start
- const double frames_per_beat = _session.tempo_map().tempo_at
- (_timeline_position).frames_per_beat(_session.engine().frame_rate());
+ const double frames_per_beat = _session.tempo_map().tempo_at(_timeline_position).frames_per_beat(
+ _session.engine().frame_rate(),
+ _session.tempo_map().meter_at(_timeline_position));
const uint32_t delta_time = (uint32_t)((ev.time() - _last_ev_time) / frames_per_beat * _ppqn);
_flags = Flag (_flags | RemoveAtDestroy);
}
+void
+SMFSource::mark_streaming_midi_write_started (NoteMode mode, nframes_t start_frame)
+{
+ MidiSource::mark_streaming_midi_write_started (mode, start_frame);
+ _last_ev_time = 0;
+}
+
void
SMFSource::mark_streaming_write_completed ()
{
void
-SMFSource::write_chunk_header(char id[4], uint32_t length)
+SMFSource::write_chunk_header(const char id[4], uint32_t length)
{
const uint32_t length_be = GUINT32_TO_BE(length);
}
void
-SMFSource::write_chunk(char id[4], uint32_t length, void* data)
+SMFSource::write_chunk(const char id[4], uint32_t length, void* data)
{
write_chunk_header(id, length);
//cerr << _name << " NOT reloading model " << _model.get() << " (" << _model->n_notes()
// << " notes)" << endl;
return;
+ } else {
+ cerr << _name << " loading model" << endl;
}
if (! _model) {
// FIXME: assumes tempo never changes after start
const double frames_per_beat = _session.tempo_map().tempo_at(_timeline_position).frames_per_beat(
- _session.engine().frame_rate());
+ _session.engine().frame_rate(),
+ _session.tempo_map().meter_at(_timeline_position));
uint32_t delta_t = 0;
int ret;