fix error in framepos_{plus,minus}_bbt() which miscounted beats while stepping throug...
authorPaul Davis <paul@linuxaudiosystems.com>
Wed, 4 Jan 2012 18:48:32 +0000 (18:48 +0000)
committerPaul Davis <paul@linuxaudiosystems.com>
Wed, 4 Jan 2012 18:48:32 +0000 (18:48 +0000)
git-svn-id: svn://localhost/ardour2/branches/3.0@11159 d708f5d6-7413-0410-9779-e7cbd77b26cf

gtk2_ardour/midi_region_view.cc
libs/ardour/beats_frames_converter.cc
libs/ardour/tempo.cc

index d26e9b1323ce62f335b214237da4df244953e095..af44311085564c043962a76ef4607fa677f43cdf 100644 (file)
@@ -1498,7 +1498,6 @@ void
 MidiRegionView::update_note (CanvasNote* ev, bool update_ghost_regions)
 {
        boost::shared_ptr<NoteType> note = ev->note();
-
        const double x = trackview.editor().frame_to_pixel (source_beats_to_region_frames (note->time()));
        const double y1 = midi_stream_view()->note_to_y(note->note());
 
@@ -2302,13 +2301,9 @@ MidiRegionView::note_dropped(CanvasNoteEvent *, frameoffset_t dt, int8_t dnote)
        start_note_diff_command (_("move notes"));
 
        for (Selection::iterator i = _selection.begin(); i != _selection.end() ; ++i) {
-
-               cerr << "Note dropped, was at " << (*i)->note()->time() << " now + " << dt << endl;
-               cerr << "original pos as frames " << source_beats_to_absolute_frames ((*i)->note()->time()) << endl;
                
-               Evoral::MusicalTime new_time = absolute_frames_to_source_beats (source_beats_to_absolute_frames ((*i)->note()->time()) + dt);
-
-               cerr << "new time in beats = " << new_time << endl;
+               framepos_t new_frames = source_beats_to_absolute_frames ((*i)->note()->time()) + dt;
+               Evoral::MusicalTime new_time = absolute_frames_to_source_beats (new_frames);
 
                if (new_time < 0) {
                        continue;
index 03a581e276d9f85163ce97c676c8c31f559de552..215292f6c1a132b015150c990800e6b53143feb0 100644 (file)
@@ -24,7 +24,7 @@
 
 namespace ARDOUR {
 
-/** Takes a duration in beats and considers it as a distance from the origin
+/** Takes a positive duration in beats and considers it as a distance from the origin
  *  supplied to the constructor.  Returns the equivalent number of frames,
  *  taking tempo changes into account.
  */
@@ -32,7 +32,6 @@ framecnt_t
 BeatsFramesConverter::to (double beats) const
 {
        assert (beats >= 0);
-
        return _tempo_map.framepos_plus_beats (_origin_b, beats) - _origin_b;
 }
 
index e8f894c1b4ea4ef5feeef795e067524c78a482bc..5d027462100a36a73467aa604a3efb68831f7304 100644 (file)
@@ -1655,6 +1655,7 @@ TempoMap::framepos_minus_bbt (framepos_t pos, BBT_Time op)
        Glib::RWLock::ReaderLock lm (map_lock);
        BBTPointList::const_iterator i;
        framecnt_t extra_frames = 0;
+       bool had_bars = (op.bars != 0);
 
        /* start from the bar|beat right before (or at) pos */
 
@@ -1667,11 +1668,19 @@ TempoMap::framepos_minus_bbt (framepos_t pos, BBT_Time op)
 
        while (i != _map->begin() && (op.bars || op.beats)) {
                --i;
-               if ((*i).is_bar()) {
-                       if (op.bars) {
-                               op.bars--;
+
+               if (had_bars) {
+                       if ((*i).is_bar()) {
+                               if (op.bars) {
+                                       op.bars--;
+                               }
                        }
-               } else {
+               }
+
+               if ((had_bars && op.bars == 0) || !had_bars) {
+                       /* finished counting bars, or none to count, 
+                          so decrement beat count
+                       */
                        if (op.beats) {
                                op.beats--;
                        }
@@ -1703,23 +1712,34 @@ TempoMap::framepos_plus_bbt (framepos_t pos, BBT_Time op)
        int additional_minutes = 1;
        BBTPointList::const_iterator i;
        framecnt_t backup_frames = 0;
-
+       bool had_bars = (op.bars != 0);
+               
        while (true) {
 
                i = bbt_before_or_at (pos);
-               
+
                op = op_copy;
 
                /* we know that (*i).frame is before or equal to pos */
                backup_frames = pos - (*i).frame;
 
                while (i != _map->end() && (op.bars || op.beats)) {
+
                        ++i;
-                       if ((*i).is_bar()) {
-                               if (op.bars) {
-                                       op.bars--;
+
+                       if (had_bars) {
+                               if ((*i).is_bar()) {
+                                       if (op.bars) {
+                                               op.bars--;
+                                       }
                                }
-                       } else {
+                       }
+                       
+                       if ((had_bars && op.bars == 0) || !had_bars) {
+                               /* finished counting bars, or none to count, 
+                                  so decrement beat count
+                               */
+
                                if (op.beats) {
                                        op.beats--;
                                }