#include <glibmm/thread.h>
#include "pbd/xml++.h"
+#include "ardour/debug.h"
#include "ardour/tempo.h"
#include "ardour/utils.h"
for (i = metrics->begin(); i != metrics->end(); ++i) {
BBT_Time bbt;
- Metric metric (*meter, *tempo);
+ TempoMetric metric (*meter, *tempo);
if (prev) {
metric.set_start (prev->start());
}
-TempoMap::Metric
+TempoMetric
TempoMap::metric_at (nframes_t frame) const
{
- Metric m (first_meter(), first_tempo());
+ TempoMetric m (first_meter(), first_tempo());
const Meter* meter;
const Tempo* tempo;
return m;
}
-TempoMap::Metric
+TempoMetric
TempoMap::metric_at (BBT_Time bbt) const
{
- Metric m (first_meter(), first_tempo());
+ TempoMetric m (first_meter(), first_tempo());
const Meter* meter;
const Tempo* tempo;
}
void
-TempoMap::bbt_time_with_metric (nframes_t frame, BBT_Time& bbt, const Metric& metric) const
+TempoMap::bbt_time_with_metric (nframes_t frame, BBT_Time& bbt, const TempoMetric& metric) const
{
nframes_t frame_diff;
nframes_t start_frame = 0;
nframes_t end_frame = 0;
- Metric m = metric_at (start);
+ TempoMetric m = metric_at (start);
uint32_t bar_offset = start.bars - m.start().bars;
result.beats = 1;
result.ticks = 0;
- Metric metric = metric_at(result);
+ TempoMetric metric = metric_at(result);
beats_per_bar = metric.meter().beats_per_bar();
nframes_t
TempoMap::round_to_type (nframes_t frame, int dir, BBTPointType type)
{
- Metric metric = metric_at (frame);
+ TempoMetric metric = metric_at (frame);
BBT_Time bbt;
BBT_Time start;
bbt_time_with_metric (frame, bbt, metric);
+
switch (type) {
case Bar:
+ DEBUG_TRACE(DEBUG::SnapBBT, string_compose ("round from %1 (%3) to bars in direction %2\n", frame, (dir < 0 ? "back" : "forward"), bbt));
if (dir < 0) {
if (bbt.bars > 1) {
bbt.bars--;
break;
case Beat:
+ DEBUG_TRACE(DEBUG::SnapBBT, string_compose ("round from %1 (%3) to beat in direction %2\n", frame, (dir < 0 ? "back" : "forward"), bbt));
if (dir < 0) {
if (bbt.beats > 1) {
bbt.beats--;
- }
+ }
+
} else if (dir > 0) {
if (bbt.ticks > 0) {
bbt.beats++;
}
- /*
- cerr << "for " << frame << " round to " << bbt << " using "
- << metric.start()
- << endl;
- */
-
+ DEBUG_TRACE(DEBUG::SnapBBT, string_compose ("\tat %1 count frames from %2 to %3 = %4\n", metric.frame(), metric.start(), bbt, count_frames_between (metric.start(), bbt)));
return metric.frame() + count_frames_between (metric.start(), bbt);
}
}
const Tempo&
-TempoMap::tempo_at (nframes_t frame)
+TempoMap::tempo_at (nframes_t frame) const
{
- Metric m (metric_at (frame));
+ TempoMetric m (metric_at (frame));
return m.tempo();
}
const Meter&
-TempoMap::meter_at (nframes_t frame)
+TempoMap::meter_at (nframes_t frame) const
{
- Metric m (metric_at (frame));
+ TempoMetric m (metric_at (frame));
return m.meter();
}
}
int
-TempoMap::set_state (const XMLNode& node)
+TempoMap::set_state (const XMLNode& node, int /*version*/)
{
{
Glib::RWLock::WriterLock lm (lock);
StateChanged (Change (0));
}
+
+BBT_Time
+TempoMap::bbt_add (const BBT_Time& a, const BBT_Time& b, const TempoMetric& /*metric*/)
+{
+ // FIXME: Obviously not correct!
+ return BBT_Time(a.bars + b.bars, a.beats + b.beats, a.ticks + b.ticks);
+}
+
+BBT_Time
+TempoMap::bbt_add (const BBT_Time& a, const BBT_Time& b)
+{
+ // FIXME: Obviously not correct!
+ return BBT_Time(a.bars + b.bars, a.beats + b.beats, a.ticks + b.ticks);
+}
+
+BBT_Time
+TempoMap::bbt_subtract (const BBT_Time& a, const BBT_Time& b)
+{
+ // FIXME: Obviously not correct!
+ return BBT_Time(a.bars - b.bars, a.beats - b.beats, a.ticks - b.ticks);
+}