Add method to find a section location by position
This commit is contained in:
parent
5c888f2b90
commit
101744b812
@ -29,6 +29,7 @@
|
||||
#include <list>
|
||||
#include <iostream>
|
||||
#include <map>
|
||||
#include <vector>
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
@ -246,6 +247,7 @@ class LIBARDOUR_API Locations : public SessionHandleRef, public PBD::StatefulDes
|
||||
{
|
||||
public:
|
||||
typedef std::list<Location *> LocationList;
|
||||
typedef std::pair<Temporal::timepos_t, Location*> LocationPair;
|
||||
|
||||
Locations (Session &);
|
||||
~Locations ();
|
||||
@ -299,6 +301,7 @@ public:
|
||||
timepos_t first_mark_after (timepos_t const &, bool include_special_ranges = false);
|
||||
|
||||
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;
|
||||
|
||||
@ -343,6 +346,8 @@ public:
|
||||
}
|
||||
|
||||
private:
|
||||
void sorted_section_locations (std::vector<LocationPair>&) const;
|
||||
|
||||
LocationList locations;
|
||||
Location* current_location;
|
||||
mutable Glib::Threads::RWLock _lock;
|
||||
|
@ -1370,18 +1370,16 @@ Locations::set_state (const XMLNode& node, int version)
|
||||
}
|
||||
|
||||
|
||||
typedef std::pair<timepos_t,Location*> LocationPair;
|
||||
|
||||
struct LocationStartEarlierComparison
|
||||
{
|
||||
bool operator() (LocationPair a, LocationPair b) {
|
||||
bool operator() (Locations::LocationPair a, Locations::LocationPair b) {
|
||||
return a.first < b.first;
|
||||
}
|
||||
};
|
||||
|
||||
struct LocationStartLaterComparison
|
||||
{
|
||||
bool operator() (LocationPair a, LocationPair b) {
|
||||
bool operator() (Locations::LocationPair a, Locations::LocationPair b) {
|
||||
return a.first > b.first;
|
||||
}
|
||||
};
|
||||
@ -1568,10 +1566,9 @@ Locations::marks_either_side (timepos_t const & pos, timepos_t& before, timepos_
|
||||
before = *i;
|
||||
}
|
||||
|
||||
Location*
|
||||
Locations::next_section (Location* l, timepos_t& start, timepos_t& end) const
|
||||
void
|
||||
Locations::sorted_section_locations (vector<LocationPair>& locs) const
|
||||
{
|
||||
vector<LocationPair> locs;
|
||||
{
|
||||
Glib::Threads::RWLock::ReaderLock lm (_lock);
|
||||
|
||||
@ -1586,6 +1583,13 @@ Locations::next_section (Location* l, timepos_t& start, timepos_t& end) const
|
||||
|
||||
LocationStartEarlierComparison 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) {
|
||||
return NULL;
|
||||
@ -1619,6 +1623,30 @@ Locations::next_section (Location* l, timepos_t& start, timepos_t& end) const
|
||||
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*
|
||||
Locations::session_range_location () const
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user