diff --git a/libs/surfaces/control_protocol/basic_ui.cc b/libs/surfaces/control_protocol/basic_ui.cc index aa13060b35..dd18702d4c 100644 --- a/libs/surfaces/control_protocol/basic_ui.cc +++ b/libs/surfaces/control_protocol/basic_ui.cc @@ -539,6 +539,37 @@ BasicUI::cancel_all_solo () } } +struct SortLocationsByPosition { + bool operator() (Location* a, Location* b) { + return a->start() < b->start(); + } +}; + +void +BasicUI::goto_nth_marker (int n) +{ + if (!session) { + return; + } + + const Locations::LocationList& l (session->locations()->list()); + Locations::LocationList ordered; + ordered = l; + + SortLocationsByPosition cmp; + ordered.sort (cmp); + + for (Locations::LocationList::iterator i = ordered.begin(); n >= 0 && i != ordered.end(); ++i) { + if ((*i)->is_mark() && !(*i)->is_hidden() && !(*i)->is_session_range()) { + if (n == 0) { + session->request_locate ((*i)->start(), session->transport_rolling()); + break; + } + --n; + } + } +} + #if 0 this stuff is waiting to go in so that all UIs can offer complex solo/mute functionality diff --git a/libs/surfaces/control_protocol/control_protocol/basic_ui.h b/libs/surfaces/control_protocol/control_protocol/basic_ui.h index a09c28e627..069a40c119 100644 --- a/libs/surfaces/control_protocol/control_protocol/basic_ui.h +++ b/libs/surfaces/control_protocol/control_protocol/basic_ui.h @@ -140,6 +140,8 @@ class LIBCONTROLCP_API BasicUI { void all_tracks_rec_in (); void all_tracks_rec_out (); + void goto_nth_marker (int n); + ARDOUR::framecnt_t timecode_frames_per_hour (); void timecode_time (framepos_t where, Timecode::Time&);