X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fbeats_frames_converter.cc;h=94042b1b03c0ae84ccece34fa4eaefc6f2464223;hb=ef0c4ed0e6907ff7cc0c9f139495619a9f242ff5;hp=da0f6e4c18f455df95f372a848565b646fb41b7f;hpb=bb9cc45cd22af67ac275a5e73accbe14fee664d8;p=ardour.git diff --git a/libs/ardour/beats_frames_converter.cc b/libs/ardour/beats_frames_converter.cc index da0f6e4c18..94042b1b03 100644 --- a/libs/ardour/beats_frames_converter.cc +++ b/libs/ardour/beats_frames_converter.cc @@ -1,6 +1,6 @@ /* Copyright (C) 2009 Paul Davis - Author: Dave Robillard + 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 @@ -19,35 +19,38 @@ $Id: midiregion.h 733 2006-08-01 17:19:38Z drobilla $ */ -#include "ardour/audioengine.h" +#include "pbd/stacktrace.h" + #include "ardour/beats_frames_converter.h" -#include "ardour/session.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 (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)); - - return lrint(beats * frames_per_beat); + if (beats < 0) { + std::cerr << "negative beats passed to BFC: " << beats << std::endl; + PBD::stacktrace (std::cerr, 30); + } + assert (beats >= 0); + framecnt_t r = _tempo_map.framepos_plus_beats (_origin_b, beats) - _origin_b; + return r; } +/** 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. + */ double -BeatsFramesConverter::from(sframes_t frames) const +BeatsFramesConverter::from (framepos_t frames) 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)); - - return frames / frames_per_beat; + double b = _tempo_map.framewalk_to_beats (_origin_b, frames); + return b; } } /* namespace ARDOUR */