fix BeatFramesConverter so that it at least works even if its not optimally named...
authorPaul Davis <paul@linuxaudiosystems.com>
Fri, 17 Dec 2010 01:51:12 +0000 (01:51 +0000)
committerPaul Davis <paul@linuxaudiosystems.com>
Fri, 17 Dec 2010 01:51:12 +0000 (01:51 +0000)
git-svn-id: svn://localhost/ardour2/branches/3.0@8290 d708f5d6-7413-0410-9779-e7cbd77b26cf

libs/ardour/ardour/beats_frames_converter.h
libs/ardour/beats_frames_converter.cc
libs/ardour/midi_region.cc
libs/ardour/tempo.cc

index e0856acc6f8b8842f129f08bea55e4c251f9f538..286c4aaa6ac2eef951d4335d46febb5aee9a67e6 100644 (file)
@@ -29,18 +29,19 @@ namespace ARDOUR {
 
 class TempoMap;
 
-/** Converter between beats and frames.  Takes `distances' in beats or frames
+/** Converter between beats and frames.  Takes durations in beats or frames
  *  and converts them using the tempo at the \a origin supplied to the constructor.
+ *  Note that this does not covert positions, only durations.
  */
 class BeatsFramesConverter : public Evoral::TimeConverter<double,framepos_t> {
 public:
-       BeatsFramesConverter(const TempoMap& tempo_map, framepos_t origin)
-               : Evoral::TimeConverter<double, framepos_t> (origin)
-               , _tempo_map(tempo_map)
-       {}
+        BeatsFramesConverter (const TempoMap& tempo_map, framepos_t origin)
+                : Evoral::TimeConverter<double, framepos_t> (origin)
+                , _tempo_map(tempo_map)
+        {}
 
-       framepos_t to(double beats)       const;
-       double    from(framepos_t frames) const;
+       framepos_t to (double beats)       const;
+       double     from (framepos_t frames) const;
 
 private:
        const TempoMap& _tempo_map;
index c2c54eb9cda410f26cdab742c888e12afceddbe2..69610aecd3a550af1fee2f85ca0e754da4728e83 100644 (file)
@@ -25,9 +25,9 @@
 namespace ARDOUR {
 
 framecnt_t
-BeatsFramesConverter::to(double beats) const
+BeatsFramesConverter::to (double beats) const
 {
-        return _tempo_map.framepos_plus_bbt (_origin_b, Timecode::BBT_Time(beats));
+        return _tempo_map.framepos_plus_bbt (_origin_b, Timecode::BBT_Time(beats)) - _origin_b;
 }
 
 double
index ee5d42dcf9f39daa8eafd0ce675c547356bf601c..e487cae2f5224426fc9a8947846de9f078e7d146 100644 (file)
@@ -134,7 +134,7 @@ void
 MidiRegion::update_length_beats ()
 {
         cerr << name() << " Updating length beats, currently = " << _length_beats << " w/length = " << _length << endl;
-       BeatsFramesConverter converter (_session.tempo_map(), _position - _start);
+       BeatsFramesConverter converter (_session.tempo_map(), _position);
         _length_beats = converter.from (_length);
         cerr << "\tnew value: " << _length_beats << endl;
 }
@@ -151,7 +151,6 @@ MidiRegion::set_position_internal (framepos_t pos, bool allow_bbt_recompute)
                    at the new position (tempo map may dictate a different number of frames
                 */
                 BeatsFramesConverter converter (_session.tempo_map(), _position - _start);
-                cerr << name() << " change frame length to " << converter.to (_length_beats) << endl;
                 Region::set_length_internal (converter.to (_length_beats));
         }
 }
index 08c9289919353b7e13e51905bb3846196092fac4..dd1b07ad01061b4f1e779d62aad5878533092fcf 100644 (file)
@@ -2067,7 +2067,7 @@ TempoMap::framewalk_to_beats (framepos_t pos, framecnt_t distance) const
                 */
 
                 if (ddist < frames_per_beat) {
-                        beats += BBT_Time::ticks_per_beat * (ddist/frames_per_beat);
+                        beats += (1.0/BBT_Time::ticks_per_beat) * (ddist/frames_per_beat);
                         break;
                 }
 
@@ -2076,7 +2076,7 @@ TempoMap::framewalk_to_beats (framepos_t pos, framecnt_t distance) const
                 ddist -= frames_per_beat;
                 dpos += frames_per_beat;
                 beats += 1.0;
-               
+
                /* check if we need to use a new metric section: has adding frames moved us
                   to or after the start of the next metric section? in which case, use it.
                */