temporal: add API to clear tempos in various ways

This commit is contained in:
Paul Davis 2023-06-30 15:50:25 -06:00
parent a8c2585cdc
commit 20e1b6b287
2 changed files with 112 additions and 3 deletions

View File

@ -1111,6 +1111,114 @@ TempoMap::add_meter (MeterPoint* mp)
return ret;
}
bool
TempoMap::clear_tempos_before (timepos_t const & t, bool stop_at_music_time)
{
if (_tempos.size() < 2) {
return false;
}
bool removed = false;
superclock_t sc = t.superclocks();
Tempos::iterator tp = _tempos.end();
--tp;
MusicTimePoint* mtp (nullptr);
while (tp != _tempos.begin()) {
if (tp->sclock() > sc) {
--tp;
mtp = nullptr;
continue;
}
if ((mtp = dynamic_cast<MusicTimePoint*> (&*tp)) && stop_at_music_time) {
break;
}
Tempos::iterator nxt = tp;
--nxt;
if (mtp) {
Meters::iterator mpi = _meters.s_iterator_to (*(static_cast<MeterPoint*> (&*mtp)));
_meters.erase (mpi);
MusicTimes::iterator mtpi = _bartimes.s_iterator_to (*mtp);
_bartimes.erase (mtpi);
}
Points::iterator pi = _points.s_iterator_to (*(static_cast<Point*> (&*tp)));
if (pi != _points.end()) {
_points.erase (pi);
}
_tempos.erase (tp);
removed = true;
tp = nxt;
mtp = nullptr;
}
if (removed) {
reset_starting_at (sc);
}
return removed;
}
bool
TempoMap::clear_tempos_after (timepos_t const & t, bool stop_at_music_time)
{
if (_tempos.size() < 2) {
return false;
}
bool removed = false;
superclock_t sc = t.superclocks();
Tempos::iterator tp = _tempos.begin();
MusicTimePoint* mtp (nullptr);
++tp;
while (tp != _tempos.end()) {
if (tp->sclock() < sc) {
++tp;
mtp = nullptr;
continue;
}
if ((mtp = dynamic_cast<MusicTimePoint*> (&*tp)) && stop_at_music_time) {
break;
}
Tempos::iterator nxt = tp;
++nxt;
if (mtp) {
Meters::iterator mpi = _meters.s_iterator_to (*(static_cast<MeterPoint*> (&*mtp)));
_meters.erase (mpi);
MusicTimes::iterator mtpi = _bartimes.s_iterator_to (*mtp);
_bartimes.erase (mtpi);
}
Points::iterator pi = _points.s_iterator_to (*(static_cast<Point*> (&*tp)));
if (pi != _points.end()) {
_points.erase (pi);
}
_tempos.erase (tp);
removed = true;
tp = nxt;
mtp = nullptr;
}
if (removed) {
reset_starting_at (sc);
}
return removed;
}
void
TempoMap::change_tempo (TempoPoint & p, Tempo const & t)
{
@ -2378,7 +2486,7 @@ TempoMap::get_grid (TempoMapPoints& ret, superclock_t rstart, superclock_t end,
* arbitrarily placed with respect to the earlier elements of the tempo
* map.
*
* So we can just start at the later of the two of them,
* So we can just start at the later of the two of them,
*/
superclock_t start;
@ -4911,5 +5019,3 @@ TempoMapCutBuffer::clear ()
_bartimes.clear ();
_points.clear ();
}

View File

@ -773,6 +773,9 @@ class /*LIBTEMPORAL_API*/ TempoMap : public PBD::StatefulDestructible
LIBTEMPORAL_API void stretch_tempo (TempoPoint& ts, double new_npm);
LIBTEMPORAL_API void stretch_tempo_end (TempoPoint* ts, samplepos_t sample, samplepos_t end_sample);
LIBTEMPORAL_API bool clear_tempos_before (timepos_t const &, bool stop_at_music_time);
LIBTEMPORAL_API bool clear_tempos_after (timepos_t const &, bool stop_at_music_time);
/* END OF MODIFYING METHODS */
/* rather than giving direct access to the intrusive list members,