add back-pointer to TempoMap from points, and push dirty=true into map
This commit is contained in:
parent
7b0c5a0def
commit
9bc8b32b8e
24
nutemp/t.cc
24
nutemp/t.cc
@ -306,6 +306,23 @@ TempoMetric::superclock_at_qn (Evoral::Beats const & qn) const
|
||||
return llrint (superclocks_per_quarter_note() * (log1p (_c_per_quarter * qn.to_double()) / _c_per_quarter));
|
||||
}
|
||||
|
||||
void
|
||||
TempoMapPoint::set_map (TempoMap* m)
|
||||
{
|
||||
_map = m;
|
||||
}
|
||||
|
||||
void
|
||||
TempoMapPoint::set_dirty (bool yn)
|
||||
{
|
||||
if (yn != _dirty) {
|
||||
_dirty = yn;
|
||||
if (yn && _map) {
|
||||
_map->set_dirty (true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Evoral::Beats
|
||||
TempoMapPoint::quarters_at (superclock_t sc) const
|
||||
{
|
||||
@ -339,11 +356,18 @@ TempoMapPoint::bbt_at (Evoral::Beats const & qn) const
|
||||
|
||||
TempoMap::TempoMap (Tempo const & initial_tempo, Meter const & initial_meter, framecnt_t sr)
|
||||
: _sample_rate (sr)
|
||||
, _dirty (false)
|
||||
{
|
||||
TempoMapPoint tmp (TempoMapPoint::Flag (TempoMapPoint::ExplicitMeter|TempoMapPoint::ExplicitTempo), initial_tempo, initial_meter, 0, Evoral::Beats(), Timecode::BBT_Time(), AudioTime);
|
||||
_points.push_back (tmp);
|
||||
}
|
||||
|
||||
void
|
||||
TempoMap::set_dirty (bool yn)
|
||||
{
|
||||
_dirty = yn;
|
||||
}
|
||||
|
||||
Meter const &
|
||||
TempoMap::meter_at (superclock_t sc) const
|
||||
{
|
||||
|
12
nutemp/t.h
12
nutemp/t.h
@ -191,11 +191,13 @@ class LIBARDOUR_API TempoMapPoint
|
||||
};
|
||||
|
||||
TempoMapPoint (Flag f, Tempo const& t, Meter const& m, superclock_t sc, Evoral::Beats const & q, Timecode::BBT_Time const & bbt, PositionLockStyle psl, bool ramp = false)
|
||||
: _flags (f), _explicit (t, m, psl, ramp), _sclock (sc), _quarters (q), _bbt (bbt), _dirty (true) {}
|
||||
: _flags (f), _explicit (t, m, psl, ramp), _sclock (sc), _quarters (q), _bbt (bbt), _dirty (true), _map (0) {}
|
||||
TempoMapPoint (TempoMapPoint const & tmp, superclock_t sc, Evoral::Beats const & q, Timecode::BBT_Time const & bbt)
|
||||
: _flags (Flag (0)), _reference (&tmp), _sclock (sc), _quarters (q), _bbt (bbt), _dirty (true) {}
|
||||
: _flags (Flag (0)), _reference (&tmp), _sclock (sc), _quarters (q), _bbt (bbt), _dirty (true), _map (0) {}
|
||||
~TempoMapPoint () {}
|
||||
|
||||
void set_map (TempoMap* m);
|
||||
|
||||
Flag flags() const { return _flags; }
|
||||
bool is_explicit() const { return _flags != Flag (0); }
|
||||
bool is_implicit() const { return _flags == Flag (0); }
|
||||
@ -230,7 +232,7 @@ class LIBARDOUR_API TempoMapPoint
|
||||
void set_sclock (superclock_t sc) { if (is_explicit()) { _sclock = sc; _dirty = true; } }
|
||||
void set_quarters (Evoral::Beats const & q) { if (is_explicit()) { _quarters = q; _dirty = true; } }
|
||||
void set_bbt (Timecode::BBT_Time const & bbt) { if (is_explicit()) { _bbt = bbt; _dirty = true; } }
|
||||
void set_dirty (bool yn) { if (is_explicit()) { _dirty = yn; } }
|
||||
void set_dirty (bool yn);
|
||||
void set_lock_style (PositionLockStyle psl) { if (is_explicit()) { _explicit.lock_style = psl; _dirty = true; } }
|
||||
|
||||
void make_explicit (Flag f) {
|
||||
@ -289,6 +291,7 @@ class LIBARDOUR_API TempoMapPoint
|
||||
Evoral::Beats _quarters;
|
||||
Timecode::BBT_Time _bbt;
|
||||
bool _dirty;
|
||||
TempoMap* _map;
|
||||
};
|
||||
|
||||
typedef std::list<TempoMapPoint> TempoMapPoints;
|
||||
@ -298,6 +301,8 @@ class LIBARDOUR_API TempoMap
|
||||
public:
|
||||
TempoMap (Tempo const & initial_tempo, Meter const & initial_meter, framecnt_t sr);
|
||||
|
||||
void set_dirty (bool yn);
|
||||
|
||||
void set_sample_rate (framecnt_t sr);
|
||||
framecnt_t sample_rate() const { return _sample_rate; }
|
||||
|
||||
@ -360,6 +365,7 @@ class LIBARDOUR_API TempoMap
|
||||
TempoMapPoints _points;
|
||||
framecnt_t _sample_rate;
|
||||
mutable Glib::Threads::RWLock _lock;
|
||||
bool _dirty;
|
||||
|
||||
/* these return an iterator that refers to the TempoMapPoint at or most immediately preceding the given position.
|
||||
*
|
||||
|
Loading…
Reference in New Issue
Block a user