diff --git a/libs/temporal/temporal/time_converter.h b/libs/temporal/temporal/time_converter.h new file mode 100644 index 0000000000..10c79bdef4 --- /dev/null +++ b/libs/temporal/temporal/time_converter.h @@ -0,0 +1,82 @@ +/* This file is part of Temporal. + * Copyright (C) 2009 David Robillard + * Copyright (C) 2009 Paul Davis + * + * Temporal is free software; you can redistribute it and/or modify it under the + * terms of the GNU General Public License as published by the Free Software + * Foundation; either version 2 of the License, or (at your option) any later + * version. + * + * Temporal is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __libtemporal_time_converter_h__ +#define __libtemporal_time_converter_h__ + +#include "temporal/timeline.h" +#include "temporal/visibility.h" + +namespace Temporal { + +class TempoMap; + +/** A bidirectional converter between two different time units. + * + * Think of the conversion method names as if they are written in-between + * the two template parameters (i.e. "A B"). + * + * _origin_b should be the origin for conversion in the units of B. + * That is, there is some point in time _origin, such that: + * + * to() converts a time _origin + a into an offset from _origin_b in units of B. + * from() converts a time _origin + b into an offset from _origin_b in units of A. + */ +template +class LIBTEMPORAL_TEMPLATE_API TimeConverter { +public: + TimeConverter () : _origin (0) {} + TimeConverter (B ob) : _origin (ob) {} + virtual ~TimeConverter(); + + /** Convert A time to C time (A to C) */ + virtual C to(A a) const = 0; + + /** Convert C time to A time (A from C) */ + virtual A from(C b) const = 0; + + B origin () const { + return _origin; + } + + void set_origin (B o) { + _origin = o; + } + +protected: + B _origin; +}; + +class LIBTEMPORAL_API DistanceMeasure +{ + public: + DistanceMeasure (timepos_t const & o) + : _origin (o) {} + + timepos_t operator() (Temporal::timecnt_t const & duration, Temporal::TimeDomain canonical_domain) const; + timepos_t origin() const { return _origin; } + void set_origin (timepos_t const &); + + private: + timepos_t _origin; +}; + + +} // namespace Temporal + +#endif /* __libtemporal_time_converter_h__ */ diff --git a/libs/temporal/time_converter.cc b/libs/temporal/time_converter.cc new file mode 100644 index 0000000000..7e42d9c79d --- /dev/null +++ b/libs/temporal/time_converter.cc @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2008 David Robillard + * Copyright (C) 2000-2008 Paul Davis + * + * Temporal is free software; you can redistribute it and/or modify it under the + * terms of the GNU General Public License as published by the Free Software + * Foundation; either version 2 of the License, or (at your option) any later + * version. + * + * Temporal is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include + +#include "temporal/beats.h" +#include "temporal/types.h" +#include "temporal/time_converter.h" +#include "temporal/tempo.h" + +namespace Temporal { + +template +TimeConverter::~TimeConverter() +{} + +template class TimeConverter; +template class TimeConverter; + +Temporal::timepos_t +DistanceMeasure::operator() (Temporal::timecnt_t const & duration, Temporal::TimeDomain canonical_domain) const +{ + return timepos_t (TempoMap::fetch()->full_duration_at (_origin, duration, canonical_domain)); +} + +void +DistanceMeasure::set_origin (timepos_t const & pos) +{ + _origin = pos; +} + +} // namespace Temporal diff --git a/libs/temporal/wscript b/libs/temporal/wscript index 576eb62417..a2281a1f2a 100644 --- a/libs/temporal/wscript +++ b/libs/temporal/wscript @@ -30,6 +30,7 @@ temporal_sources = [ 'enums.cc', 'tempo.cc', 'time.cc', + 'time_converter.cc', 'timeline.cc', 'superclock.cc' ]