Add playlist APIs to find audible regions

This traverses the layered region stack at a given time,
taking both mute and transparency into account.
This commit is contained in:
Robin Gareus 2022-09-09 17:30:32 +02:00
parent 9781c1baca
commit e62f1093ea
Signed by: rgareus
GPG Key ID: A090BCE02CF57F04
2 changed files with 62 additions and 0 deletions

View File

@ -225,6 +225,7 @@ public:
boost::shared_ptr<RegionList> regions_touched (timepos_t const & start, timepos_t const & end);
boost::shared_ptr<RegionList> regions_with_start_within (Temporal::TimeRange);
boost::shared_ptr<RegionList> regions_with_end_within (Temporal::TimeRange);
boost::shared_ptr<RegionList> audible_regions_at (timepos_t const &);
uint32_t region_use_count (boost::shared_ptr<Region>) const;
boost::shared_ptr<Region> find_region (const PBD::ID&) const;
boost::shared_ptr<Region> top_region_at (timepos_t const &);
@ -233,6 +234,7 @@ public:
timepos_t find_next_region_boundary (timepos_t const &, int dir);
bool region_is_shuffle_constrained (boost::shared_ptr<Region>);
bool has_region_at (timepos_t const &) const;
bool region_is_audible_at (boost::shared_ptr<Region>, timepos_t const&);
timepos_t find_prev_region_start (timepos_t const & sample);

View File

@ -1838,6 +1838,66 @@ Playlist::top_unmuted_region_at (timepos_t const & pos)
return region;
}
boost::shared_ptr<RegionList>
Playlist::audible_regions_at (timepos_t const& pos)
{
boost::shared_ptr<RegionList> rv (new RegionList);
boost::shared_ptr<RegionList> rlist;
{
RegionReadLock rlock (this);
rlist = find_regions_at (pos);
}
if (!rlist->size ()) {
return rv;
}
RegionSortByLayer cmp;
rlist->sort (cmp);
for (auto i = rlist->rbegin (); i != rlist->rend (); ++i) {
if ((*i)->muted ()) {
continue;
}
rv->push_back (*i);
if ((*i)->opaque ()) {
break;
}
}
return rv;
}
bool
Playlist::region_is_audible_at (boost::shared_ptr<Region> r, timepos_t const& pos)
{
boost::shared_ptr<RegionList> rlist;
{
RegionReadLock rlock (this);
rlist = find_regions_at (pos);
}
if (!rlist->size ()) {
return false;
}
RegionSortByLayer cmp;
rlist->sort (cmp);
for (auto i = rlist->rbegin (); i != rlist->rend (); ++i) {
if ((*i)->muted ()) {
continue;
}
if (r == *i) {
return true;
}
if ((*i)->opaque ()) {
break;
}
}
return false;
}
boost::shared_ptr<RegionList>
Playlist::find_regions_at (timepos_t const & pos)
{