13
0

Evoral: add methods to SMF to load and access markers/cues in SMF files

This commit is contained in:
Paul Davis 2021-05-07 14:56:25 -06:00
parent 4db1c02bd1
commit f689e9ecab
2 changed files with 54 additions and 0 deletions

View File

@ -580,4 +580,45 @@ SMF::nth_tempo (size_t n) const
return new Tempo (t);
}
void
SMF::load_markers ()
{
if (!_smf_track) {
return;
}
Glib::Threads::Mutex::Lock lm (_smf_lock);
if (_smf_track) {
_smf_track->next_event_number = std::min(_smf_track->number_of_events, (size_t)1);
}
smf_event_t* event;
while ((event = smf_track_get_next_event(_smf_track)) != NULL) {
if (smf_event_is_metadata(event)) {
if (event->midi_buffer[1] == 0x06) {
string marker = smf_event_decode (event);
if (!marker.empty()) {
if (marker.find ("Marker: ") == 0) {
marker = marker.substr (8);
}
_markers.push_back (MarkerAt (marker, event->time_pulses));
}
}
if (event->midi_buffer[1] == 0x07) {
string marker = smf_event_decode (event);
if (!marker.empty()) {
if (marker.find ("Cue Point: ") == 0) {
marker = marker.substr (8);
}
_markers.push_back (MarkerAt (marker, event->time_pulses));
}
}
}
}
}
} // namespace Evoral

View File

@ -118,6 +118,17 @@ public:
Tempo* nth_tempo (size_t n) const;
struct MarkerAt {
std::string text;
size_t time_pulses; /* type matches libsmf smf_event_struct.time_pulses */
MarkerAt (std::string const & txt, size_t tp) : text (txt), time_pulses (tp) {}
};
typedef std::vector<MarkerAt> Markers;
Markers const & markers() const { return _markers; }
void load_markers ();
private:
smf_t* _smf;
smf_track_t* _smf_track;
@ -126,6 +137,8 @@ public:
bool _type0;
std::set<uint8_t> _type0channels;
mutable Markers _markers;
};
}; /* namespace Evoral */