From aa95ffbc97ccab5cf5d43da9e89bdea85efdd406 Mon Sep 17 00:00:00 2001 From: nick_m Date: Fri, 4 Mar 2016 04:31:11 +1100 Subject: [PATCH] Tempo ramps - change some prototypes, rename some methods. --- libs/ardour/ardour/tempo.h | 8 ++-- libs/ardour/tempo.cc | 87 ++++++++++++++++++++------------------ 2 files changed, 52 insertions(+), 43 deletions(-) diff --git a/libs/ardour/ardour/tempo.h b/libs/ardour/ardour/tempo.h index 92549d29e1..5dc9525e4d 100644 --- a/libs/ardour/ardour/tempo.h +++ b/libs/ardour/ardour/tempo.h @@ -375,9 +375,9 @@ class LIBARDOUR_API TempoMap : public PBD::StatefulDestructible void remove_tempo (const TempoSection&, bool send_signal); void remove_meter (const MeterSection&, bool send_signal); - framepos_t compute_replacement_tempo_section (TempoSection* section, const double& tempo, const double& beat); - Metrics imagine_new_order (TempoSection* section, const Tempo& bpm, const framepos_t& frame, const double& beat); - Metrics imagine_new_order (MeterSection* section, const Meter& mt, const framepos_t& frame, const double& beat); + framepos_t compute_replacement_tempo_section (TempoSection* section, const Tempo& bpm, const double& beat); + Metrics get_new_order (TempoSection* section, const Tempo& bpm, const framepos_t& frame, const double& beat); + Metrics get_new_order (MeterSection* section, const Meter& mt, const framepos_t& frame, const double& beat); void replace_tempo (const TempoSection&, const Tempo&, const double& where, TempoSection::Type type); void replace_tempo (const TempoSection&, const Tempo&, const framepos_t& frame, TempoSection::Type type); @@ -445,6 +445,8 @@ private: framecnt_t _frame_rate; mutable Glib::Threads::RWLock lock; + void recompute_tempos (); + void recompute_meters (); void recompute_map (bool reassign_tempo_bbt, framepos_t end = -1); framepos_t round_to_type (framepos_t fr, RoundMode dir, BBTPointType); diff --git a/libs/ardour/tempo.cc b/libs/ardour/tempo.cc index 9601b064af..5463d8539b 100644 --- a/libs/ardour/tempo.cc +++ b/libs/ardour/tempo.cc @@ -392,7 +392,7 @@ TempoSection::compute_c_func (double end_bpm, framepos_t end_frame, framecnt_t f framecnt_t TempoSection::minute_to_frame (double time, framecnt_t frame_rate) const { - return (framecnt_t) floor ((time * 60.0 * frame_rate) + 0.5); + return (framecnt_t) floor ((time * 60.0 * frame_rate)); } double @@ -877,14 +877,14 @@ TempoMap::do_insert (MetricSection* section) * @return returns - the position in frames where the new tempo section will lie */ framepos_t -TempoMap::compute_replacement_tempo_section (TempoSection* section, const double& bpm, const double& beat) +TempoMap::compute_replacement_tempo_section (TempoSection* section, const Tempo& bpm, const double& beat) { + Glib::Threads::RWLock::WriterLock lm (lock); + TempoSection* prev_ts = 0; TempoSection* t; framepos_t ret = 0; MetricSectionSorter cmp; - { - Glib::Threads::RWLock::WriterLock lm (lock); for (Metrics::iterator i = metrics.begin(); i != metrics.end(); ++i) { if ((t = dynamic_cast (*i)) != 0) { @@ -892,8 +892,8 @@ TempoMap::compute_replacement_tempo_section (TempoSection* section, const double if (section->beat() == t->beat()) { continue; } - if (beat < t->beat()){ - prev_ts->set_c_func_from_tempo_and_beat (bpm, beat, _frame_rate); + if (t->beat() > beat){ + prev_ts->set_c_func_from_tempo_and_beat (bpm.beats_per_minute(), beat, _frame_rate); section->set_beat (beat); section->set_frame (prev_ts->frame_at_beat (beat, _frame_rate)); break; @@ -920,8 +920,8 @@ TempoMap::compute_replacement_tempo_section (TempoSection* section, const double if (section->beat() == t->beat()) { continue; } - if (beat < t->beat()){ - prev_ts->set_c_func_from_tempo_and_beat (bpm, beat, _frame_rate); + if (t->beat() > beat){ + prev_ts->set_c_func_from_tempo_and_beat (bpm.beats_per_minute(), beat, _frame_rate); ret = prev_ts->frame_at_beat (beat, _frame_rate); section->set_frame (ret); prev_ts = section; @@ -940,13 +940,13 @@ TempoMap::compute_replacement_tempo_section (TempoSection* section, const double } if (!ret) { - prev_ts->set_c_func_from_tempo_and_beat (bpm, beat, _frame_rate); + prev_ts->set_c_func_from_tempo_and_beat (bpm.beats_per_minute(), beat, _frame_rate); section->set_beat (beat); section->set_frame (prev_ts->frame_at_beat (beat, _frame_rate)); ret = prev_ts->frame_at_beat (beat, _frame_rate); } - } + return ret; } @@ -995,7 +995,7 @@ TempoMap::replace_tempo (const TempoSection& ts, const Tempo& tempo, const frame } Metrics -TempoMap::imagine_new_order (TempoSection* section, const Tempo& bpm, const framepos_t& frame, const double& beat) +TempoMap::get_new_order (TempoSection* section, const Tempo& bpm, const framepos_t& frame, const double& beat) { Metrics imaginary (metrics); @@ -1032,10 +1032,8 @@ TempoMap::imagine_new_order (TempoSection* section, const Tempo& bpm, const fram prev_ts = t; } } - MetricSectionSorter cmp; imaginary.sort (cmp); - /* to do - check precision using _at_tempo() methods */ /* prev_ts = 0; @@ -1059,7 +1057,7 @@ TempoMap::imagine_new_order (TempoSection* section, const Tempo& bpm, const fram } Metrics -TempoMap::imagine_new_order(MeterSection* section, const Meter& mt, const framepos_t& frame, const double& beat) +TempoMap::get_new_order(MeterSection* section, const Meter& mt, const framepos_t& frame, const double& beat) { /* incomplete */ Metrics imaginary (metrics); @@ -1134,10 +1132,10 @@ TempoMap::gui_move_tempo (TempoSection* ts, const Tempo& bpm, const framepos_t& { { Glib::Threads::RWLock::WriterLock lm (lock); - Metrics new_order = imagine_new_order (ts, bpm, frame, beat_where); + Metrics new_order = get_new_order (ts, bpm, frame, beat_where); + metrics.clear(); metrics = new_order; - recompute_map (false); } @@ -1148,7 +1146,7 @@ void TempoMap::gui_move_meter (MeterSection* ms, const Meter& mt, const framepos_t& frame, const double& beat_where) { Glib::Threads::RWLock::WriterLock lm (lock); - Metrics imaginary = imagine_new_order (ms, mt, frame, beat_where); + Metrics imaginary = get_new_order (ms, mt, frame, beat_where); } void @@ -1448,33 +1446,12 @@ TempoMap::first_tempo () abort(); /*NOTREACHED*/ return *t; } - void -TempoMap::recompute_map (bool reassign_tempo_bbt, framepos_t end) +TempoMap::recompute_tempos () { - /* CALLER MUST HOLD WRITE LOCK */ - - if (end < 0) { - - /* we will actually stop once we hit - the last metric. - */ - end = max_framepos; - - } - - DEBUG_TRACE (DEBUG::TempoMath, string_compose ("recomputing tempo map, zero to %1\n", end)); - - if (end == 0) { - /* silly call from Session::process() during startup - */ - return; - } - - Metrics::const_iterator i; TempoSection* prev_ts = 0; - for (i = metrics.begin(); i != metrics.end(); ++i) { + for (Metrics::const_iterator i = metrics.begin(); i != metrics.end(); ++i) { TempoSection* t; if ((t = dynamic_cast (*i)) != 0) { @@ -1504,7 +1481,11 @@ TempoMap::recompute_map (bool reassign_tempo_bbt, framepos_t end) prev_ts = t; } } +} +void +TempoMap::recompute_meters () +{ MeterSection* meter = 0; for (Metrics::const_iterator mi = metrics.begin(); mi != metrics.end(); ++mi) { @@ -1529,6 +1510,32 @@ TempoMap::recompute_map (bool reassign_tempo_bbt, framepos_t end) } } +void +TempoMap::recompute_map (bool reassign_tempo_bbt, framepos_t end) +{ + /* CALLER MUST HOLD WRITE LOCK */ + + if (end < 0) { + + /* we will actually stop once we hit + the last metric. + */ + end = max_framepos; + + } + + DEBUG_TRACE (DEBUG::TempoMath, string_compose ("recomputing tempo map, zero to %1\n", end)); + + if (end == 0) { + /* silly call from Session::process() during startup + */ + return; + } + + recompute_tempos(); + recompute_meters(); +} + TempoMetric TempoMap::metric_at (framepos_t frame, Metrics::const_iterator* last) const -- 2.30.2