13
0

propagate SMFSource length into MidiModel

When we "sync-to-source" from a MidiModel (IS-A Evoral::Sequence),
we will mark the end (length) just like when capturing MIDI. So
the MidiModel/Sequence needs to know the actual length, not just
the time of the last event.
This commit is contained in:
Paul Davis 2024-10-31 12:04:32 -06:00
parent 39661732c3
commit eebdb63014

View File

@ -462,6 +462,11 @@ void
SMFSource::update_length (timepos_t const & dur) SMFSource::update_length (timepos_t const & dur)
{ {
assert (!_length || (_length.time_domain() == dur.time_domain())); assert (!_length || (_length.time_domain() == dur.time_domain()));
if (_model) {
_model->set_duration (dur.beats());
}
_length = dur; _length = dur;
} }
@ -648,7 +653,7 @@ SMFSource::mark_midi_streaming_write_completed (const WriterLock& lm, Evoral::Se
} }
try { try {
update_length (duration.distance()); update_length (timepos_t (duration.beats()));
Evoral::SMF::end_write (_path); Evoral::SMF::end_write (_path);
} catch (std::exception & e) { } catch (std::exception & e) {
error << string_compose (_("Exception while writing %1, file may be corrupt/unusable"), _path) << endmsg; error << string_compose (_("Exception while writing %1, file may be corrupt/unusable"), _path) << endmsg;
@ -823,7 +828,6 @@ SMFSource::load_model_unlocked (bool force_reload)
} }
_num_channels = _used_channels.size(); _num_channels = _used_channels.size();
_length = duration();
eventlist.sort(compare_eventlist); eventlist.sort(compare_eventlist);
@ -833,7 +837,14 @@ SMFSource::load_model_unlocked (bool force_reload)
delete it->first; delete it->first;
} }
// cerr << "----SMF-SRC-----\n"; /* Length ought to be based on data in the file (TrkEnd meta-event, not
the final true event.
*/
_length = file_duration();
_model->set_duration (_length.beats());
// cerr << "----SMF-SRC-----\n";
// _playback_buf->dump (cerr); // _playback_buf->dump (cerr);
// cerr << "----------------\n"; // cerr << "----------------\n";