a better fix for timestamping non-beat-aligned tempo changes
authorPaul Davis <paul@linuxaudiosystems.com>
Sat, 7 Jan 2012 00:16:28 +0000 (00:16 +0000)
committerPaul Davis <paul@linuxaudiosystems.com>
Sat, 7 Jan 2012 00:16:28 +0000 (00:16 +0000)
git-svn-id: svn://localhost/ardour2/branches/3.0@11181 d708f5d6-7413-0410-9779-e7cbd77b26cf

libs/ardour/tempo.cc

index a521f44bd78d93cacf4b1da75b0faaa468972056..1247f1e806ee4fe20fa12652636ce3a053354655 100644 (file)
@@ -885,12 +885,19 @@ TempoMap::_extend_map (TempoSection* tempo, MeterSection* meter,
        MeterSection* ms;
        double divisions_per_bar;
        double beat_frames;
+       framepos_t bar_start_frame;
+
+       if (current.beats == 1) {
+               bar_start_frame = current_frame;
+       } else {
+               bar_start_frame = 0;
+       }
 
        divisions_per_bar = meter->divisions_per_bar ();
        beat_frames = meter->frames_per_grid (*tempo,_frame_rate);
 
        while (current_frame < end) {
-               
+
                current.beats++;
                current_frame += beat_frames;
 
@@ -937,19 +944,13 @@ TempoMap::_extend_map (TempoSection* tempo, MeterSection* meter,
                                                /* back up to previous beat */
                                                current_frame -= beat_frames;
 
-                                               /* set tempo section location based on offset from last beat */
-
-                                               double bar_offset_in_beats = 1 + (ts->bar_offset() * meter->divisions_per_bar());
-
-                                               /* we've already advanced
-                                                * current.beats, but we want
-                                                * the previous beat's value
+                                               /* set tempo section location
+                                                * based on offset from last
+                                                * bar start 
                                                 */
-
-                                               bar_offset_in_beats -= current.beats - 1;
-
-                                               tempo->set_frame (current_frame + (bar_offset_in_beats * beat_frames));
-
+                                               tempo->set_frame (bar_start_frame + 
+                                                                 llrint ((ts->bar_offset() * meter->divisions_per_bar() * beat_frames)));
+                                               
                                                /* advance to the location of the new (adjusted) beat */
                                                current_frame += (ts->bar_offset() * beat_frames) + ((1.0 - ts->bar_offset()) * next_beat_frames);
                                                /* next metric doesn't have to
@@ -1000,6 +1001,7 @@ TempoMap::_extend_map (TempoSection* tempo, MeterSection* meter,
                if (current.beats == 1) {
                        DEBUG_TRACE (DEBUG::TempoMath, string_compose ("Add Bar at %1|1 @ %2\n", current.bars, current_frame));
                        _map.push_back (BBTPoint (*meter, *tempo,(framepos_t) llrint(current_frame), current.bars, 1));
+                       bar_start_frame = current_frame;
                } else {
                        DEBUG_TRACE (DEBUG::TempoMath, string_compose ("Add Beat at %1|%2 @ %3\n", current.bars, current.beats, current_frame));
                        _map.push_back (BBTPoint (*meter, *tempo, (framepos_t) llrint(current_frame), current.bars, current.beats));