temporal: refactor methods to add tempo/meter points

This commit is contained in:
Paul Davis 2022-05-23 16:17:37 -06:00
parent ef1f814837
commit c48430f502
2 changed files with 55 additions and 46 deletions

View File

@ -758,34 +758,14 @@ TempoMap::copy_points (TempoMap const & other)
MeterPoint*
TempoMap::add_meter (MeterPoint* mp)
{
Meters::iterator m;
Points::iterator p;
const superclock_t sclock_limit = mp->sclock();
const Beats beats_limit = mp->beats ();
for (m = _meters.begin(); m != _meters.end() && m->beats() < beats_limit; ++m);
for (p = _points.begin(); p != _points.end() && p->beats() < beats_limit; ++p);
bool replaced = false;
MeterPoint* ret = 0;
if (m != _meters.end()) {
if (m->sclock() == sclock_limit) {
/* overwrite Meter part of this point */
*((Meter*)&(*m)) = *mp;
delete mp;
ret = &(*m);
replaced = true;
}
}
bool replaced;
MeterPoint* ret = core_add_meter (mp, replaced);
if (!replaced) {
ret = &(*(_meters.insert (m, *mp)));
_points.insert (p, *mp);
core_add_point (mp);
}
reset_starting_at (sclock_limit);
reset_starting_at (mp->sclock());
return ret;
}
@ -856,50 +836,75 @@ TempoMap::set_tempo (Tempo const & t, timepos_t const & time)
return *ret;
}
void
TempoMap::core_add_point (Point* pp)
{
Points::iterator p;
const Beats beats_limit = pp->beats();
for (p = _points.begin(); p != _points.end() && p->beats() < beats_limit; ++p);
_points.insert (p, *pp);
}
TempoPoint*
TempoMap::add_tempo (TempoPoint * tp)
TempoMap::core_add_tempo (TempoPoint* tp, bool& replaced)
{
Tempos::iterator t;
Points::iterator p;
const superclock_t sclock_limit = tp->sclock();
const Beats beats_limit = tp->beats ();
for (t = _tempos.begin(); t != _tempos.end() && t->beats() < beats_limit; ++t);
for (p = _points.begin(); p != _points.end() && p->beats() < beats_limit; ++p);
bool replaced = false;
TempoPoint* ret = 0;
if (t != _tempos.end()) {
if (t->sclock() == sclock_limit) {
/* overwrite Tempo part of this point */
*((Tempo*)&(*t)) = *tp;
delete tp;
ret = &(*t);
DEBUG_TRACE (DEBUG::TemporalMap, string_compose ("overwrote old tempo with %1\n", tp));
replaced = true;
return &(*t);
}
}
if (!replaced) {
t = _tempos.insert (t, *tp);
p = _points.insert (p, *tp);
ret = &*t;
DEBUG_TRACE (DEBUG::TemporalMap, string_compose ("inserted tempo %1\n", tp));
DEBUG_TRACE (DEBUG::TemporalMap, string_compose ("inserted tempo %1\n", tp));
replaced = false;
return &(* _tempos.insert (t, *tp));
}
MeterPoint*
TempoMap::core_add_meter (MeterPoint* mp, bool& replaced)
{
Meters::iterator m;
const superclock_t sclock_limit = mp->sclock();
const Beats beats_limit = mp->beats ();
for (m = _meters.begin(); m != _meters.end() && m->beats() < beats_limit; ++m);
if (m != _meters.end()) {
if (m->sclock() == sclock_limit) {
/* overwrite Meter part of this point */
*((Meter*)&(*m)) = *mp;
delete mp;
replaced = true;
return &(*m);
}
}
/* t is guaranteed not to be _tempos.end() : it was either the
* TempoPoint we overwrote, or its the one we inserted.
*/
replaced = false;
return &(*(_meters.insert (m, *mp)));
}
assert (t != _tempos.end());
assert (p != _points.end());
Tempos::iterator nxt = t;
++nxt;
reset_starting_at (sclock_limit);
TempoPoint*
TempoMap::add_tempo (TempoPoint * tp)
{
bool replaced;
TempoPoint* ret = core_add_tempo (tp, replaced);
if (!replaced) {
core_add_point (tp);
}
reset_starting_at (tp->sclock());
return ret;
}

View File

@ -888,6 +888,10 @@ class /*LIBTEMPORAL_API*/ TempoMap : public PBD::StatefulDestructible
int set_meters_from_state (XMLNode const &);
int set_music_times_from_state (XMLNode const &);
TempoPoint* core_add_tempo (TempoPoint*, bool&);
MeterPoint* core_add_meter (MeterPoint*, bool&);
void core_add_point (Point*);
MeterPoint & set_meter (Meter const &, superclock_t);
TempoPoint* add_tempo (TempoPoint*);