make Session::get_remote_nth_stripable() ignore hidden stripables unless asked.
[ardour.git] / libs / ardour / beats_frames_converter.cc
index d6f7ab8a9e75de454efcfa9dceabaa29bf9ccf22..54db8008da2c4fcabacaba0d0da64963952da040 100644 (file)
@@ -1,6 +1,6 @@
 /*
-    Copyright (C) 2009 Paul Davis 
-    Author: Dave Robillard
+    Copyright (C) 2009 Paul Davis
+    Author: David Robillard
 
     This program is free software; you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     $Id: midiregion.h 733 2006-08-01 17:19:38Z drobilla $
 */
 
-#include <ardour/audioengine.h>
-#include <ardour/beats_frames_converter.h>
-#include <ardour/session.h>
-#include <ardour/tempo.h>
+#include "pbd/stacktrace.h"
+
+#include "ardour/beats_frames_converter.h"
+#include "ardour/tempo.h"
 
 namespace ARDOUR {
 
-sframes_t
-BeatsFramesConverter::to(double beats) const
+/** 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.
+ */
+framepos_t
+BeatsFramesConverter::to (Evoral::Beats beats) const
 {
-       // FIXME: assumes tempo never changes after origin
-       const Tempo& tempo = _session.tempo_map().tempo_at(_origin);
-       const double frames_per_beat = tempo.frames_per_beat(
-                       _session.engine().frame_rate(),
-                       _session.tempo_map().meter_at(_origin));
+       if (beats < Evoral::Beats()) {
+               std::cerr << "negative beats passed to BFC: " << beats << std::endl;
+               PBD::stacktrace (std::cerr, 30);
+               return 0;
+       }
+       return _tempo_map.framepos_plus_beats (_origin_b, beats) - _origin_b;
+}
 
-       return lrint(beats * frames_per_beat);
+/** Takes a duration in frames and considers it as a distance from the origin
+ *  supplied to the constructor.  Returns the equivalent number of beats,
+ *  taking tempo changes into account.
+ */
+Evoral::Beats
+BeatsFramesConverter::from (framepos_t frames) const
+{
+       return _tempo_map.framewalk_to_beats (_origin_b, frames);
 }
 
-double
-BeatsFramesConverter::from(sframes_t frames) const
+/** As above, but with beats in double instead (for GUI). */
+framepos_t
+DoubleBeatsFramesConverter::to (double beats) const
 {
-       // FIXME: assumes tempo never changes after origin
-       const Tempo& tempo = _session.tempo_map().tempo_at(_origin);
-       const double frames_per_beat = tempo.frames_per_beat(
-                       _session.engine().frame_rate(),
-                       _session.tempo_map().meter_at(_origin));
+       if (beats < 0.0) {
+               std::cerr << "negative beats passed to BFC: " << beats << std::endl;
+               PBD::stacktrace (std::cerr, 30);
+               return 0;
+       }
+       return _tempo_map.framepos_plus_beats (_origin_b, Evoral::Beats(beats)) - _origin_b;
+}
 
-       return frames / frames_per_beat;
+/** As above, but with beats in double instead (for GUI). */
+double
+DoubleBeatsFramesConverter::from (framepos_t frames) const
+{
+       return _tempo_map.framewalk_to_beats (_origin_b, frames).to_double();
 }
 
 } /* namespace ARDOUR */