diff --git a/libs/evoral/SMF.cc b/libs/evoral/SMF.cc index 2bdee9f98d..7594ef0e77 100644 --- a/libs/evoral/SMF.cc +++ b/libs/evoral/SMF.cc @@ -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 diff --git a/libs/evoral/evoral/SMF.h b/libs/evoral/evoral/SMF.h index 349a62b43f..229ed4af9b 100644 --- a/libs/evoral/evoral/SMF.h +++ b/libs/evoral/evoral/SMF.h @@ -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 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 _type0channels; + + mutable Markers _markers; }; }; /* namespace Evoral */