summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2016-12-16 16:49:27 +0000
committerPaul Davis <paul@linuxaudiosystems.com>2016-12-16 16:49:27 +0000
commit73f8ffce6340d854334925c9b5b466f3fb8f9a04 (patch)
treeaf0e4a1103ddf8daa1879e68bdf19b5ee4628b88
parentebc7eabea2f513ad6050c8fbd735371d553f68cf (diff)
add copy constructor, operator= and a clean ::dump() method for TempoMap
-rw-r--r--libs/ardour/ardour/tempo.h5
-rw-r--r--libs/ardour/tempo.cc59
2 files changed, 58 insertions, 6 deletions
diff --git a/libs/ardour/ardour/tempo.h b/libs/ardour/ardour/tempo.h
index 3bdaaa84eb..026f5176f5 100644
--- a/libs/ardour/ardour/tempo.h
+++ b/libs/ardour/ardour/tempo.h
@@ -304,8 +304,11 @@ class LIBARDOUR_API TempoMap : public PBD::StatefulDestructible
{
public:
TempoMap (framecnt_t frame_rate);
+ TempoMap (TempoMap const &);
~TempoMap();
+ TempoMap& operator= (TempoMap const &);
+
/* measure-based stuff */
enum BBTPointType {
@@ -381,7 +384,7 @@ class LIBARDOUR_API TempoMap : public PBD::StatefulDestructible
XMLNode& get_state (void);
int set_state (const XMLNode&, int version);
- void dump (const Metrics& metrics, std::ostream&) const;
+ void dump (std::ostream&) const;
void clear ();
TempoMetric metric_at (Timecode::BBT_Time bbt) const;
diff --git a/libs/ardour/tempo.cc b/libs/ardour/tempo.cc
index 0208ca3ce3..9f724a3dca 100644
--- a/libs/ardour/tempo.cc
+++ b/libs/ardour/tempo.cc
@@ -744,6 +744,55 @@ TempoMap::TempoMap (framecnt_t fr)
}
+TempoMap::TempoMap (TempoMap const & other)
+{
+ _frame_rate = other._frame_rate;
+ for (Metrics::const_iterator m = other._metrics.begin(); m != other._metrics.end(); ++m) {
+ TempoSection* ts = dynamic_cast<TempoSection*> (*m);
+ MeterSection* ms = dynamic_cast<MeterSection*> (*m);
+
+ if (ts) {
+ TempoSection* new_section = new TempoSection (*ts);
+ _metrics.push_back (new_section);
+ } else {
+ MeterSection* new_section = new MeterSection (*ms);
+ _metrics.push_back (new_section);
+ }
+ }
+}
+
+TempoMap&
+TempoMap::operator= (TempoMap const & other)
+{
+ if (&other != this) {
+ _frame_rate = other._frame_rate;
+
+ Metrics::const_iterator d = _metrics.begin();
+ while (d != _metrics.end()) {
+ delete (*d);
+ ++d;
+ }
+ _metrics.clear();
+
+ for (Metrics::const_iterator m = other._metrics.begin(); m != other._metrics.end(); ++m) {
+ TempoSection* ts = dynamic_cast<TempoSection*> (*m);
+ MeterSection* ms = dynamic_cast<MeterSection*> (*m);
+
+ if (ts) {
+ TempoSection* new_section = new TempoSection (*ts);
+ _metrics.push_back (new_section);
+ } else {
+ MeterSection* new_section = new MeterSection (*ms);
+ _metrics.push_back (new_section);
+ }
+ }
+ }
+
+ PropertyChanged (PropertyChange());
+
+ return *this;
+}
+
TempoMap::~TempoMap ()
{
Metrics::const_iterator d = _metrics.begin();
@@ -983,7 +1032,7 @@ TempoMap::do_insert (MetricSection* section)
}
_metrics.insert (i, section);
- //dump (_metrics, std::cout);
+ //dump (std::cout);
}
}
/* user supplies the exact pulse if pls == MusicTime */
@@ -1067,7 +1116,7 @@ TempoMap::add_meter (const Meter& meter, const double& beat, const Timecode::BBT
#ifndef NDEBUG
if (DEBUG_ENABLED(DEBUG::TempoMap)) {
- dump (_metrics, std::cerr);
+ dump (std::cerr);
}
#endif
@@ -3819,7 +3868,7 @@ TempoMap::round_to_type (framepos_t frame, RoundMode dir, BBTPointType type)
++bbt.bars;
framepos_t next_ft = frame_at_minute (minute_at_bbt_locked (_metrics, bbt));
- if ((raw_ft - prev_ft) > (next_ft - prev_ft) / 2) {
+ if ((raw_ft - prev_ft) > (next_ft - prev_ft) / 2) {
return next_ft;
} else {
return prev_ft;
@@ -4235,14 +4284,14 @@ TempoMap::set_state (const XMLNode& node, int /*version*/)
}
void
-TempoMap::dump (const Metrics& metrics, std::ostream& o) const
+TempoMap::dump (std::ostream& o) const
{
Glib::Threads::RWLock::ReaderLock lm (lock, Glib::Threads::TRY_LOCK);
const MeterSection* m;
const TempoSection* t;
const TempoSection* prev_t = 0;
- for (Metrics::const_iterator i = metrics.begin(); i != metrics.end(); ++i) {
+ for (Metrics::const_iterator i = _metrics.begin(); i != _metrics.end(); ++i) {
if ((t = dynamic_cast<const TempoSection*>(*i)) != 0) {
o << "Tempo @ " << *i << t->note_types_per_minute() << " BPM (pulse = 1/" << t->note_type()