13
0

mark BBT_Offset (double) constructor explicit to avoid implicit conversion in timeline expressions.

Also clean up the mess this had caused.
This commit is contained in:
Paul Davis 2020-12-01 22:30:04 -07:00
parent b01b6929fb
commit def35cf043
4 changed files with 39 additions and 34 deletions

View File

@ -255,7 +255,7 @@ SMFSource::read_unlocked (const Lock& lock,
_smf_last_read_end = start + duration; _smf_last_read_end = start + duration;
return timecnt_t(); return timecnt_t();
} }
time += ev_delta_t; // accumulate delta time time += timepos_t::from_ticks (ev_delta_t); // accumulate delta time
} }
} else { } else {
DEBUG_TRACE (DEBUG::MidiSourceIO, string_compose ("SMF read_unlocked: set time to %1\n", _smf_last_read_time)); DEBUG_TRACE (DEBUG::MidiSourceIO, string_compose ("SMF read_unlocked: set time to %1\n", _smf_last_read_time));
@ -272,7 +272,7 @@ SMFSource::read_unlocked (const Lock& lock,
break; break;
} }
time += ev_delta_t; // accumulate delta time time += timepos_t::from_ticks (ev_delta_t); // accumulate delta time
_smf_last_read_time = time; _smf_last_read_time = time;
if (ret == 0) { // meta-event (skipped, just accumulate time) if (ret == 0) { // meta-event (skipped, just accumulate time)

View File

@ -2053,10 +2053,10 @@ ControlList::move_ranges (const list< RangeMove> & movements)
switch (_time_domain) { switch (_time_domain) {
case AudioTime: case AudioTime:
ev->when += dx.samples(); ev->when += dx;
break; break;
case BeatTime: case BeatTime:
ev->when += dx.beats().to_ticks(); ev->when += dx;
break; break;
default: default:
/*NOTREACHED*/ /*NOTREACHED*/

View File

@ -146,7 +146,7 @@ struct LIBTEMPORAL_API BBT_Offset
BBT_Offset () : bars (0), beats (0), ticks (0) {} BBT_Offset () : bars (0), beats (0), ticks (0) {}
BBT_Offset (int32_t ba, uint32_t be, uint32_t t) : bars (ba), beats (be), ticks (t) {} BBT_Offset (int32_t ba, uint32_t be, uint32_t t) : bars (ba), beats (be), ticks (t) {}
BBT_Offset (BBT_Time const & bbt) : bars (bbt.bars), beats (bbt.beats), ticks (bbt.ticks) {} BBT_Offset (BBT_Time const & bbt) : bars (bbt.bars), beats (bbt.beats), ticks (bbt.ticks) {}
BBT_Offset (double beats); explicit BBT_Offset (double beats);
/* unlike BBT_Time, we can define +,-,* and / operators for BBT_Offset /* unlike BBT_Time, we can define +,-,* and / operators for BBT_Offset
* because there is no requirement that the result is "well-formed" or * because there is no requirement that the result is "well-formed" or

View File

@ -362,6 +362,7 @@ std::operator<< (std::ostream & o, timecnt_t const & tc)
timepos_t::timepos_t (timecnt_t const & t) timepos_t::timepos_t (timecnt_t const & t)
{ {
if (t.distance() < 0) { if (t.distance() < 0) {
std::cerr << "timecnt_t has negative distance distance " << " val " << t.distance().val() << " flagged " << t.distance().flagged() << std::endl;
throw std::domain_error("negative value for timepos_t constructor"); throw std::domain_error("negative value for timepos_t constructor");
} }
@ -577,48 +578,34 @@ timepos_t::earlier (Temporal::BBT_Offset const & offset) const
} }
timepos_t &
timepos_t::shift_earlier (Temporal::BBT_Offset const & offset)
{
TempoMap::SharedPtr tm (TempoMap::use());
if (is_superclock()) {
v = build (false, (tm->superclock_at (tm->bbt_walk (tm->bbt_at (superclocks()), -offset))));
} else {
v = build (true, tm->bbtwalk_to_quarters (beats(), -offset).to_ticks());
}
return *this;
}
timepos_t timepos_t
timepos_t::earlier (timepos_t const & other) const timepos_t::earlier (timepos_t const & other) const
{ {
if (other.is_superclock()) { if (is_superclock()) {
return earlier (other.superclocks()); return timepos_t::from_superclock (val() - other.superclocks());
} }
return earlier (other.beats()); return timepos_t::from_ticks (val() - other.ticks());
} }
timepos_t timepos_t
timepos_t::earlier (timecnt_t const & distance) const timepos_t::earlier (timecnt_t const & distance) const
{ {
if (distance.time_domain() == AudioTime) { if (is_superclock()) {
return earlier (distance.superclocks()); return timepos_t::from_superclock (val() - distance.superclocks());
} }
return earlier (distance.beats());
return timepos_t::from_ticks (val() - distance.ticks());
} }
bool bool
timepos_t::expensive_lt (timepos_t const & other) const timepos_t::expensive_lt (timepos_t const & other) const
{ {
if (time_domain() == AudioTime) { if (time_domain() == AudioTime) {
return superclocks() < other.superclocks(); return val() < other.superclocks();
} }
return beats() < other.beats (); return ticks() < other.ticks ();
} }
bool bool
@ -656,21 +643,25 @@ timepos_t::expensive_gte (timepos_t const & other) const
timepos_t & timepos_t &
timepos_t::shift_earlier (timepos_t const & d) timepos_t::shift_earlier (timepos_t const & d)
{ {
if (d.time_domain() == AudioTime) { if (is_superclock()) {
return shift_earlier (d.superclocks()); v = build (false, val() - d.superclocks());
} else {
v = build (true, val() - d.ticks());
} }
return shift_earlier (d.beats()); return *this;
} }
timepos_t & timepos_t &
timepos_t::shift_earlier (timecnt_t const & d) timepos_t::shift_earlier (timecnt_t const & d)
{ {
if (d.time_domain() == AudioTime) { if (is_superclock()) {
return shift_earlier (d.superclocks()); v = build (false, val() - d.superclocks());
} else {
v = build (true, val() - d.ticks());
} }
return shift_earlier (d.beats()); return *this;
} }
timepos_t & timepos_t &
@ -690,6 +681,20 @@ timepos_t::shift_earlier (Temporal::Beats const & b)
return *this; return *this;
} }
timepos_t &
timepos_t::shift_earlier (Temporal::BBT_Offset const & offset)
{
TempoMap::SharedPtr tm (TempoMap::use());
if (is_superclock()) {
v = build (false, (tm->superclock_at (tm->bbt_walk (tm->bbt_at (superclocks()), -offset))));
} else {
v = build (true, tm->bbtwalk_to_quarters (beats(), -offset).to_ticks());
}
return *this;
}
/* */ /* */
timepos_t & timepos_t &