summaryrefslogtreecommitdiff
path: root/libs
diff options
context:
space:
mode:
authorCarl Hetherington <carl@carlh.net>2010-05-24 15:42:27 +0000
committerCarl Hetherington <carl@carlh.net>2010-05-24 15:42:27 +0000
commitdd134d8afb70e0db290baa732bdfcd4ff6d8daca (patch)
treeaf064df875e3c2a468663366d8c1b9ee49be3a3b /libs
parenta4664d68c031c77c5e436fe97a92005b7d2019d8 (diff)
Note the time of the last event that was read by read_unlocked, so that the current time can be reset on a subsequent call.
git-svn-id: svn://localhost/ardour2/branches/3.0@7148 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs')
-rw-r--r--libs/ardour/ardour/smf_source.h3
-rw-r--r--libs/ardour/smf_source.cc5
2 files changed, 8 insertions, 0 deletions
diff --git a/libs/ardour/ardour/smf_source.h b/libs/ardour/ardour/smf_source.h
index 44080a8cff..d271cb0dba 100644
--- a/libs/ardour/ardour/smf_source.h
+++ b/libs/ardour/ardour/smf_source.h
@@ -86,7 +86,10 @@ private:
double _last_ev_time_beats;
sframes_t _last_ev_time_frames;
+ /** end time (start + duration) of last call to read_unlocked */
mutable sframes_t _smf_last_read_end;
+ /** time (in SMF ticks, 1 tick per _ppqn) of the last event read by read_unlocked */
+ mutable sframes_t _smf_last_read_time;
};
}; /* namespace ARDOUR */
diff --git a/libs/ardour/smf_source.cc b/libs/ardour/smf_source.cc
index e4727761b5..f326b19799 100644
--- a/libs/ardour/smf_source.cc
+++ b/libs/ardour/smf_source.cc
@@ -56,6 +56,7 @@ SMFSource::SMFSource (Session& s, const ustring& path, Source::Flag flags)
, _last_ev_time_beats(0.0)
, _last_ev_time_frames(0)
, _smf_last_read_end (0)
+ , _smf_last_read_time (0)
{
if (init(_path, false)) {
throw failed_constructor ();
@@ -76,6 +77,7 @@ SMFSource::SMFSource (Session& s, const XMLNode& node, bool must_exist)
, _last_ev_time_beats(0.0)
, _last_ev_time_frames(0)
, _smf_last_read_end (0)
+ , _smf_last_read_time (0)
{
if (set_state(node, Stateful::loading_state_version)) {
throw failed_constructor ();
@@ -134,6 +136,8 @@ SMFSource::read_unlocked (Evoral::EventSink<nframes_t>& destination, sframes_t s
}
time += ev_delta_t; // accumulate delta time
}
+ } else {
+ time = _smf_last_read_time;
}
_smf_last_read_end = start + duration;
@@ -145,6 +149,7 @@ SMFSource::read_unlocked (Evoral::EventSink<nframes_t>& destination, sframes_t s
}
time += ev_delta_t; // accumulate delta time
+ _smf_last_read_time = time;
if (ret == 0) { // meta-event (skipped, just accumulate time)
continue;