Add method to find a section location by position

This commit is contained in:
Ben Loftis 2023-09-03 14:17:08 -05:00 committed by Robin Gareus
parent 5c888f2b90
commit 101744b812
Signed by: rgareus
GPG Key ID: A090BCE02CF57F04
2 changed files with 40 additions and 7 deletions

View File

@ -29,6 +29,7 @@
#include <list> #include <list>
#include <iostream> #include <iostream>
#include <map> #include <map>
#include <vector>
#include <sys/types.h> #include <sys/types.h>
@ -246,6 +247,7 @@ class LIBARDOUR_API Locations : public SessionHandleRef, public PBD::StatefulDes
{ {
public: public:
typedef std::list<Location *> LocationList; typedef std::list<Location *> LocationList;
typedef std::pair<Temporal::timepos_t, Location*> LocationPair;
Locations (Session &); Locations (Session &);
~Locations (); ~Locations ();
@ -299,6 +301,7 @@ public:
timepos_t first_mark_after (timepos_t const &, bool include_special_ranges = false); timepos_t first_mark_after (timepos_t const &, bool include_special_ranges = false);
Location* next_section (Location*, timepos_t&, timepos_t&) const; Location* next_section (Location*, timepos_t&, timepos_t&) const;
Location* section_at (timepos_t const&, timepos_t&, timepos_t&) const;
void marks_either_side (timepos_t const &, timepos_t &, timepos_t &) const; void marks_either_side (timepos_t const &, timepos_t &, timepos_t &) const;
@ -343,6 +346,8 @@ public:
} }
private: private:
void sorted_section_locations (std::vector<LocationPair>&) const;
LocationList locations; LocationList locations;
Location* current_location; Location* current_location;
mutable Glib::Threads::RWLock _lock; mutable Glib::Threads::RWLock _lock;

View File

@ -1370,18 +1370,16 @@ Locations::set_state (const XMLNode& node, int version)
} }
typedef std::pair<timepos_t,Location*> LocationPair;
struct LocationStartEarlierComparison struct LocationStartEarlierComparison
{ {
bool operator() (LocationPair a, LocationPair b) { bool operator() (Locations::LocationPair a, Locations::LocationPair b) {
return a.first < b.first; return a.first < b.first;
} }
}; };
struct LocationStartLaterComparison struct LocationStartLaterComparison
{ {
bool operator() (LocationPair a, LocationPair b) { bool operator() (Locations::LocationPair a, Locations::LocationPair b) {
return a.first > b.first; return a.first > b.first;
} }
}; };
@ -1568,10 +1566,9 @@ Locations::marks_either_side (timepos_t const & pos, timepos_t& before, timepos_
before = *i; before = *i;
} }
Location* void
Locations::next_section (Location* l, timepos_t& start, timepos_t& end) const Locations::sorted_section_locations (vector<LocationPair>& locs) const
{ {
vector<LocationPair> locs;
{ {
Glib::Threads::RWLock::ReaderLock lm (_lock); Glib::Threads::RWLock::ReaderLock lm (_lock);
@ -1586,6 +1583,13 @@ Locations::next_section (Location* l, timepos_t& start, timepos_t& end) const
LocationStartEarlierComparison cmp; LocationStartEarlierComparison cmp;
sort (locs.begin(), locs.end(), cmp); sort (locs.begin(), locs.end(), cmp);
}
Location*
Locations::next_section (Location* l, timepos_t& start, timepos_t& end) const
{
vector<LocationPair> locs;
sorted_section_locations (locs);
if (locs.size () < 2) { if (locs.size () < 2) {
return NULL; return NULL;
@ -1619,6 +1623,30 @@ Locations::next_section (Location* l, timepos_t& start, timepos_t& end) const
return NULL; return NULL;
} }
Location*
Locations::section_at (timepos_t const& when, timepos_t& start, timepos_t& end) const
{
vector<LocationPair> locs;
sorted_section_locations (locs);
if (locs.size () < 2) {
return NULL;
}
Location* rv = NULL;
for (auto const& i: locs) {
if (when >= i.first) {
start = i.first;
rv = i.second;
} else {
end = i.first;
return rv;
}
}
return NULL;
}
Location* Location*
Locations::session_range_location () const Locations::session_range_location () const
{ {