(Source List) Clean up the natural_position implementation (libardour part).

This commit is contained in:
Ben Loftis 2018-11-15 09:33:54 -06:00
parent 77950c36c5
commit edde5d64a2
24 changed files with 91 additions and 74 deletions

View file

@ -97,7 +97,7 @@ Analyser::work ()
boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource> (src); boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource> (src);
if (afs && afs->length(afs->timeline_position())) { if (afs && afs->length(afs->natural_position())) {
Glib::Threads::Mutex::Lock lm (analysis_active_lock); Glib::Threads::Mutex::Lock lm (analysis_active_lock);
analyse_audio_file_source (afs); analyse_audio_file_source (afs);
} }

View file

@ -99,7 +99,7 @@ protected:
int init (const std::string& idstr, bool must_exist); int init (const std::string& idstr, bool must_exist);
virtual void set_header_timeline_position () = 0; virtual void set_header_natural_position () = 0;
virtual void handle_header_position_change () {} virtual void handle_header_position_change () {}
int move_dependents_to_trash(); int move_dependents_to_trash();

View file

@ -43,7 +43,6 @@ class LIBARDOUR_API CAImportableSource : public ImportableSource {
samplecnt_t length() const; samplecnt_t length() const;
samplecnt_t samplerate() const; samplecnt_t samplerate() const;
void seek (samplepos_t pos); void seek (samplepos_t pos);
samplepos_t natural_position() const { return 0; }
bool clamped_at_unity () const { return false; } bool clamped_at_unity () const { return false; }
protected: protected:

View file

@ -46,7 +46,7 @@ class LIBARDOUR_API CoreAudioSource : public AudioFileSource {
uint32_t channel_count () const { return n_channels; } uint32_t channel_count () const { return n_channels; }
int flush_header () {return 0;}; int flush_header () {return 0;};
void set_header_timeline_position () {}; void set_header_natural_position () {};
bool clamped_at_unity () const { return false; } bool clamped_at_unity () const { return false; }
void flush () {} void flush () {}

View file

@ -59,7 +59,7 @@ protected:
samplecnt_t write_unlocked (Sample */*dst*/, samplecnt_t /*cnt*/) { return 0; } samplecnt_t write_unlocked (Sample */*dst*/, samplecnt_t /*cnt*/) { return 0; }
void set_header_timeline_position () {} void set_header_natural_position () {}
int read_peaks_with_fpp (PeakData *peaks, samplecnt_t npeaks, samplepos_t /*start*/, samplecnt_t /*cnt*/, int read_peaks_with_fpp (PeakData *peaks, samplecnt_t npeaks, samplepos_t /*start*/, samplecnt_t /*cnt*/,
double /*samples_per_pixel*/, samplecnt_t /*fpp*/) const { double /*samples_per_pixel*/, samplecnt_t /*fpp*/) const {

View file

@ -38,8 +38,8 @@ public:
samplecnt_t length() const; samplecnt_t length() const;
samplecnt_t samplerate() const; samplecnt_t samplerate() const;
void seek (samplepos_t pos); void seek (samplepos_t pos);
samplepos_t natural_position() const;
bool clamped_at_unity () const; bool clamped_at_unity () const;
samplepos_t natural_position () const;
protected: protected:
SF_INFO sf_info; SF_INFO sf_info;

View file

@ -60,8 +60,6 @@ class LIBARDOUR_API SndFileSource : public AudioFileSource {
int flush_header (); int flush_header ();
void flush (); void flush ();
samplepos_t natural_position () const;
samplepos_t last_capture_start_sample() const; samplepos_t last_capture_start_sample() const;
void mark_capture_start (samplepos_t); void mark_capture_start (samplepos_t);
void mark_capture_end (); void mark_capture_end ();
@ -81,7 +79,7 @@ class LIBARDOUR_API SndFileSource : public AudioFileSource {
void close (); void close ();
void set_path (const std::string& p); void set_path (const std::string& p);
void set_header_timeline_position (); void set_header_natural_position ();
samplecnt_t read_unlocked (Sample *dst, samplepos_t start, samplecnt_t cnt) const; samplecnt_t read_unlocked (Sample *dst, samplepos_t start, samplecnt_t cnt) const;
samplecnt_t write_unlocked (Sample *dst, samplecnt_t cnt); samplecnt_t write_unlocked (Sample *dst, samplecnt_t cnt);
@ -111,7 +109,7 @@ class LIBARDOUR_API SndFileSource : public AudioFileSource {
Sample* xfade_buf; Sample* xfade_buf;
samplecnt_t crossfade (Sample* data, samplecnt_t cnt, int dir); samplecnt_t crossfade (Sample* data, samplecnt_t cnt, int dir);
void set_timeline_position (samplepos_t); void set_natural_position (samplepos_t);
samplecnt_t destructive_write_unlocked (Sample *dst, samplecnt_t cnt); samplecnt_t destructive_write_unlocked (Sample *dst, samplecnt_t cnt);
samplecnt_t nondestructive_write_unlocked (Sample *dst, samplecnt_t cnt); samplecnt_t nondestructive_write_unlocked (Sample *dst, samplecnt_t cnt);
void handle_header_position_change (); void handle_header_position_change ();

View file

@ -74,8 +74,6 @@ public:
void set_take_id (std::string id) { _take_id =id; } void set_take_id (std::string id) { _take_id =id; }
const std::string& take_id () const { return _take_id; } const std::string& take_id () const { return _take_id; }
virtual samplepos_t natural_position() const { return 0; }
void mark_for_remove(); void mark_for_remove();
virtual void mark_streaming_write_started (const Lock& lock) {} virtual void mark_streaming_write_started (const Lock& lock) {}
@ -104,8 +102,9 @@ public:
std::string get_transients_path() const; std::string get_transients_path() const;
int load_transients (const std::string&); int load_transients (const std::string&);
samplepos_t timeline_position() const { return _timeline_position; } virtual samplepos_t natural_position() const { return _natural_position; }
virtual void set_timeline_position (samplepos_t pos); virtual void set_natural_position (samplepos_t pos);
bool have_natural_position() const { return _have_natural_position; }
void set_allow_remove_if_empty (bool yn); void set_allow_remove_if_empty (bool yn);
@ -129,7 +128,8 @@ public:
Flag _flags; Flag _flags;
time_t _timestamp; time_t _timestamp;
std::string _take_id; std::string _take_id;
samplepos_t _timeline_position; samplepos_t _natural_position;
samplepos_t _have_natural_position;
bool _analysed; bool _analysed;
mutable Glib::Threads::Mutex _lock; mutable Glib::Threads::Mutex _lock;
mutable Glib::Threads::Mutex _analysis_lock; mutable Glib::Threads::Mutex _analysis_lock;

View file

@ -38,7 +38,7 @@ public:
int update_header (samplepos_t /*when*/, struct tm&, time_t) { return 0; } int update_header (samplepos_t /*when*/, struct tm&, time_t) { return 0; }
int flush_header () { return 0; } int flush_header () { return 0; }
void flush () { } void flush () { }
void set_header_timeline_position () {}; void set_header_natural_position () {};
void set_length (samplecnt_t /*len*/) {}; void set_length (samplecnt_t /*len*/) {};
float sample_rate () const { return _session.nominal_sample_rate(); } float sample_rate () const { return _session.nominal_sample_rate(); }

View file

@ -441,7 +441,7 @@ AudioTrack::freeze_me (InterThreadInfo& itt)
PropertyList plist; PropertyList plist;
plist.add (Properties::start, 0); plist.add (Properties::start, 0);
plist.add (Properties::length, srcs[0]->length(srcs[0]->timeline_position())); plist.add (Properties::length, srcs[0]->length(srcs[0]->natural_position()));
plist.add (Properties::name, region_name); plist.add (Properties::name, region_name);
plist.add (Properties::whole_file, true); plist.add (Properties::whole_file, true);

View file

@ -462,7 +462,7 @@ AudioRegion::master_read_at (Sample *buf, Sample* /*mixdown_buffer*/, float* /*g
assert (cnt >= 0); assert (cnt >= 0);
return read_from_sources ( return read_from_sources (
_master_sources, _master_sources.front()->length (_master_sources.front()->timeline_position()), _master_sources, _master_sources.front()->length (_master_sources.front()->natural_position()),
buf, position, cnt, chan_n buf, position, cnt, chan_n
); );
} }

View file

@ -267,7 +267,7 @@ AudioSource::initialize_peakfile (const string& audio_path, const bool in_sessio
/* we found it in the peaks dir, so check it out */ /* we found it in the peaks dir, so check it out */
if (statbuf.st_size == 0 || (statbuf.st_size < (off_t) ((length(_timeline_position) / _FPP) * sizeof (PeakData)))) { if (statbuf.st_size == 0 || (statbuf.st_size < (off_t) ((length(_natural_position) / _FPP) * sizeof (PeakData)))) {
DEBUG_TRACE(DEBUG::Peaks, string_compose("Peakfile %1 is empty\n", _peakpath)); DEBUG_TRACE(DEBUG::Peaks, string_compose("Peakfile %1 is empty\n", _peakpath));
_peaks_built = false; _peaks_built = false;
} else { } else {
@ -1066,7 +1066,7 @@ samplecnt_t
AudioSource::available_peaks (double zoom_factor) const AudioSource::available_peaks (double zoom_factor) const
{ {
if (zoom_factor < _FPP) { if (zoom_factor < _FPP) {
return length(_timeline_position); // peak data will come from the audio file return length(_natural_position); // peak data will come from the audio file
} }
/* peak data comes from peakfile, but the filesize might not represent /* peak data comes from peakfile, but the filesize might not represent

View file

@ -328,7 +328,7 @@ void
DiskWriter::non_realtime_locate (samplepos_t position) DiskWriter::non_realtime_locate (samplepos_t position)
{ {
if (_midi_write_source) { if (_midi_write_source) {
_midi_write_source->set_timeline_position (position); _midi_write_source->set_natural_position (position);
} }
DiskIOProcessor::non_realtime_locate (position); DiskIOProcessor::non_realtime_locate (position);
@ -1220,8 +1220,6 @@ DiskWriter::transport_stopped_wallclock (struct tm& when, time_t twhen, bool abo
strftime (buf, sizeof(buf), "%F %H.%M.%S", &when); strftime (buf, sizeof(buf), "%F %H.%M.%S", &when);
as->set_take_id ( buf ); as->set_take_id ( buf );
Source::SourcePropertyChanged(as);
if (Config->get_auto_analyse_audio()) { if (Config->get_auto_analyse_audio()) {
Analyser::queue_source_for_analysis (as, true); Analyser::queue_source_for_analysis (as, true);
} }
@ -1232,6 +1230,11 @@ DiskWriter::transport_stopped_wallclock (struct tm& when, time_t twhen, bool abo
if (_midi_write_source) { if (_midi_write_source) {
midi_srcs.push_back (_midi_write_source); midi_srcs.push_back (_midi_write_source);
} }
(*chan)->write_source->stamp (twhen);
/* "re-announce the source to the world */
Source::SourcePropertyChanged ((*chan)->write_source);
} }
@ -1261,7 +1264,7 @@ DiskWriter::transport_stopped_wallclock (struct tm& when, time_t twhen, bool abo
midi_srcs.push_back (_midi_write_source); midi_srcs.push_back (_midi_write_source);
_midi_write_source->set_timeline_position (capture_info.front()->start); _midi_write_source->set_natural_position (capture_info.front()->start);
_midi_write_source->set_captured_for (_name); _midi_write_source->set_captured_for (_name);
char buf[128]; char buf[128];

View file

@ -116,8 +116,6 @@ FileSource::removable () const
int int
FileSource::init (const string& pathstr, bool must_exist) FileSource::init (const string& pathstr, bool must_exist)
{ {
_timeline_position = 0;
if (Stateful::loading_state_version < 3000) { if (Stateful::loading_state_version < 3000) {
if (!find_2X (_session, _type, pathstr, must_exist, _file_is_new, _channel, _path)) { if (!find_2X (_session, _type, pathstr, must_exist, _file_is_new, _channel, _path)) {
throw MissingSource (pathstr, _type); throw MissingSource (pathstr, _type);

View file

@ -119,7 +119,7 @@ Filter::finish (boost::shared_ptr<Region> region, SourceList& nsrcs, string regi
boost::shared_ptr<SMFSource> smfs = boost::dynamic_pointer_cast<SMFSource>(*si); boost::shared_ptr<SMFSource> smfs = boost::dynamic_pointer_cast<SMFSource>(*si);
if (smfs) { if (smfs) {
smfs->set_timeline_position (region->position()); smfs->set_natural_position (region->position());
smfs->flush (); smfs->flush ();
} }

View file

@ -184,7 +184,7 @@ static bool
create_mono_sources_for_writing (const vector<string>& new_paths, create_mono_sources_for_writing (const vector<string>& new_paths,
Session& sess, uint32_t samplerate, Session& sess, uint32_t samplerate,
vector<boost::shared_ptr<Source> >& newfiles, vector<boost::shared_ptr<Source> >& newfiles,
samplepos_t timeline_position) samplepos_t natural_position)
{ {
for (vector<string>::const_iterator i = new_paths.begin(); i != new_paths.end(); ++i) { for (vector<string>::const_iterator i = new_paths.begin(); i != new_paths.end(); ++i) {
@ -212,7 +212,7 @@ create_mono_sources_for_writing (const vector<string>& new_paths,
boost::shared_ptr<AudioFileSource> afs; boost::shared_ptr<AudioFileSource> afs;
if ((afs = boost::dynamic_pointer_cast<AudioFileSource>(source)) != 0) { if ((afs = boost::dynamic_pointer_cast<AudioFileSource>(source)) != 0) {
afs->set_timeline_position(timeline_position); afs->set_natural_position (natural_position);
} }
} }
return true; return true;

View file

@ -1285,7 +1285,7 @@ LuaBindings::common (lua_State* L)
.addFunction ("writable", &Source::writable) .addFunction ("writable", &Source::writable)
.addFunction ("has_been_analysed", &Source::has_been_analysed) .addFunction ("has_been_analysed", &Source::has_been_analysed)
.addFunction ("can_be_analysed", &Source::can_be_analysed) .addFunction ("can_be_analysed", &Source::can_be_analysed)
.addFunction ("timeline_position", &Source::timeline_position) .addFunction ("timeline_position", &Source::natural_position) /* duplicate */
.addFunction ("use_count", &Source::use_count) .addFunction ("use_count", &Source::use_count)
.addFunction ("used", &Source::used) .addFunction ("used", &Source::used)
.addFunction ("ancestor_name", &Source::ancestor_name) .addFunction ("ancestor_name", &Source::ancestor_name)

View file

@ -352,7 +352,7 @@ MidiSource::mark_write_starting_now (samplecnt_t position,
because it is not RT-safe. because it is not RT-safe.
*/ */
set_timeline_position(position); set_natural_position (position);
_capture_length = capture_length; _capture_length = capture_length;
_capture_loop_length = loop_length; _capture_loop_length = loop_length;
@ -417,7 +417,7 @@ MidiSource::write_to (const Lock& lock, boost::shared_ptr<MidiSource> newsrc, Te
{ {
Lock newsrc_lock (newsrc->mutex ()); Lock newsrc_lock (newsrc->mutex ());
newsrc->set_timeline_position (_timeline_position); newsrc->set_natural_position (_natural_position);
newsrc->copy_interpolation_from (this); newsrc->copy_interpolation_from (this);
newsrc->copy_automation_state_from (this); newsrc->copy_automation_state_from (this);

View file

@ -194,7 +194,7 @@ RegionFactory::create (boost::shared_ptr<Region> region, const SourceList& srcs,
if ((other = boost::dynamic_pointer_cast<AudioRegion>(region)) != 0) { if ((other = boost::dynamic_pointer_cast<AudioRegion>(region)) != 0) {
// XXX use me in caller where plist is setup, this is start i think srcs.front()->length (srcs.front()->timeline_position()) // XXX use me in caller where plist is setup, this is start i think srcs.front()->length (srcs.front()->natural_position())
ret = boost::shared_ptr<Region> (new AudioRegion (other, srcs)); ret = boost::shared_ptr<Region> (new AudioRegion (other, srcs));

View file

@ -6274,7 +6274,7 @@ Session::write_one_track (Track& track, samplepos_t start, samplepos_t end,
if (!endpoint || for_export) { if (!endpoint || for_export) {
ev.set_time(ev.time() - position); ev.set_time(ev.time() - position);
} }
ms->append_event_samples(lock, ev, ms->timeline_position()); ms->append_event_samples(lock, ev, ms->natural_position());
} }
} }
} }
@ -6328,7 +6328,7 @@ Session::write_one_track (Track& track, samplepos_t start, samplepos_t end,
PropertyList plist; PropertyList plist;
plist.add (Properties::start, 0); plist.add (Properties::start, 0);
plist.add (Properties::length, srcs.front()->length(srcs.front()->timeline_position())); plist.add (Properties::length, srcs.front()->length(srcs.front()->natural_position()));
plist.add (Properties::name, region_name_from_path (srcs.front()->name(), true)); plist.add (Properties::name, region_name_from_path (srcs.front()->name(), true));
result = RegionFactory::create (srcs, plist); result = RegionFactory::create (srcs, plist);

View file

@ -3411,7 +3411,7 @@ Session::cleanup_sources (CleanupReport& rep)
* capture files. * capture files.
*/ */
if (!i->second->used() && (i->second->length(i->second->timeline_position()) > 0)) { if (!i->second->used() && (i->second->length(i->second->natural_position()) > 0)) {
dead_sources.push_back (i->second); dead_sources.push_back (i->second);
i->second->drop_references (); i->second->drop_references ();
} }

View file

@ -350,7 +350,7 @@ SndFileSource::init_sndfile ()
if (destructive()) { if (destructive()) {
xfade_buf = new Sample[xfade_samples]; xfade_buf = new Sample[xfade_samples];
_timeline_position = header_position_offset; _natural_position = header_position_offset;
} }
AudioFileSource::HeaderPositionOffsetChanged.connect_same_thread (header_position_connection, boost::bind (&SndFileSource::handle_header_position_change, this)); AudioFileSource::HeaderPositionOffsetChanged.connect_same_thread (header_position_connection, boost::bind (&SndFileSource::handle_header_position_change, this));
@ -447,15 +447,22 @@ SndFileSource::open ()
if (_file_is_new && _length == 0 && writable() && !bwf_info_exists) { if (_file_is_new && _length == 0 && writable() && !bwf_info_exists) {
/* newly created files will not have a BWF header at this point in time. /* newly created files will not have a BWF header at this point in time.
* Import will have called Source::set_timeline_position() if one exists * Import will have called Source::set_natural_position() if one exists
* in the original. */ * in the original. */
header_position_offset = _timeline_position; header_position_offset = _natural_position;
} }
if (destructive()) {
/* Set our timeline position to either the time reference from a BWF header or the current /* Set our timeline position to either the time reference from a BWF header or the current
start of the session. start of the session.
*/ */
set_timeline_position (bwf_info_exists ? _broadcast_info->get_time_reference() : header_position_offset); set_natural_position (bwf_info_exists ? _broadcast_info->get_time_reference() : header_position_offset);
} else {
/* If a BWF header exists, set our _natural_position from it */
if (bwf_info_exists) {
set_natural_position (_broadcast_info->get_time_reference());
}
}
if (_length != 0 && !bwf_info_exists) { if (_length != 0 && !bwf_info_exists) {
delete _broadcast_info; delete _broadcast_info;
@ -668,7 +675,7 @@ SndFileSource::destructive_write_unlocked (Sample* data, samplecnt_t cnt)
_capture_end = false; _capture_end = false;
/* move to the correct location place */ /* move to the correct location place */
file_pos = capture_start_sample - _timeline_position; file_pos = capture_start_sample - _natural_position;
// split cnt in half // split cnt in half
samplecnt_t subcnt = cnt / 2; samplecnt_t subcnt = cnt / 2;
@ -700,7 +707,7 @@ SndFileSource::destructive_write_unlocked (Sample* data, samplecnt_t cnt)
_capture_end = false; _capture_end = false;
/* move to the correct location place */ /* move to the correct location place */
file_pos = capture_start_sample - _timeline_position; file_pos = capture_start_sample - _natural_position;
if (crossfade (data, cnt, 1) != cnt) { if (crossfade (data, cnt, 1) != cnt) {
return 0; return 0;
@ -742,7 +749,7 @@ SndFileSource::destructive_write_unlocked (Sample* data, samplecnt_t cnt)
int int
SndFileSource::update_header (samplepos_t when, struct tm& now, time_t tnow) SndFileSource::update_header (samplepos_t when, struct tm& now, time_t tnow)
{ {
set_timeline_position (when); set_natural_position (when);
if (_flags & Broadcast) { if (_flags & Broadcast) {
if (setup_broadcast_info (when, now, tnow)) { if (setup_broadcast_info (when, now, tnow)) {
@ -810,20 +817,20 @@ SndFileSource::setup_broadcast_info (samplepos_t /*when*/, struct tm& now, time_
/* now update header position taking header offset into account */ /* now update header position taking header offset into account */
set_header_timeline_position (); set_header_natural_position ();
return 0; return 0;
} }
void void
SndFileSource::set_header_timeline_position () SndFileSource::set_header_natural_position ()
{ {
if (!(_flags & Broadcast)) { if (!(_flags & Broadcast)) {
return; return;
} }
assert (_broadcast_info); assert (_broadcast_info);
_broadcast_info->set_time_reference (_timeline_position); _broadcast_info->set_time_reference (_natural_position);
if (_sndfile == 0 || !_broadcast_info->write_to_file (_sndfile)) { if (_sndfile == 0 || !_broadcast_info->write_to_file (_sndfile)) {
error << string_compose (_("cannot set broadcast info for audio file %1 (%2); dropping broadcast info for this file"), error << string_compose (_("cannot set broadcast info for audio file %1 (%2); dropping broadcast info for this file"),
@ -855,12 +862,6 @@ SndFileSource::write_float (Sample* data, samplepos_t sample_pos, samplecnt_t cn
return cnt; return cnt;
} }
samplepos_t
SndFileSource::natural_position() const
{
return _timeline_position;
}
void void
SndFileSource::clear_capture_marks () SndFileSource::clear_capture_marks ()
{ {
@ -873,7 +874,7 @@ void
SndFileSource::mark_capture_start (samplepos_t pos) SndFileSource::mark_capture_start (samplepos_t pos)
{ {
if (destructive()) { if (destructive()) {
if (pos < _timeline_position) { if (pos < _natural_position) {
_capture_start = false; _capture_start = false;
} else { } else {
_capture_start = true; _capture_start = true;
@ -1031,8 +1032,8 @@ SndFileSource::handle_header_position_change ()
error << string_compose(_("Filesource: start time is already set for existing file (%1): Cannot change start time."), _path ) << endmsg; error << string_compose(_("Filesource: start time is already set for existing file (%1): Cannot change start time."), _path ) << endmsg;
//in the future, pop up a dialog here that allows user to regenerate file with new start offset //in the future, pop up a dialog here that allows user to regenerate file with new start offset
} else if (writable()) { } else if (writable()) {
_timeline_position = header_position_offset; _natural_position = header_position_offset;
set_header_timeline_position (); //this will get flushed if/when the file is recorded to set_header_natural_position (); //this will get flushed if/when the file is recorded to
} }
} }
} }
@ -1056,14 +1057,14 @@ SndFileSource::setup_standard_crossfades (Session const & s, samplecnt_t rate)
} }
void void
SndFileSource::set_timeline_position (samplepos_t pos) SndFileSource::set_natural_position (samplepos_t pos)
{ {
// destructive track timeline postion does not change // destructive track timeline postion does not change
// except at instantion or when header_position_offset // except at instantion or when header_position_offset
// (session start) changes // (session start) changes
if (!destructive()) { if (!destructive()) {
AudioFileSource::set_timeline_position (pos); AudioFileSource::set_natural_position (pos);
} }
} }
@ -1149,4 +1150,3 @@ SndFileSource::set_path (const string& p)
{ {
FileSource::set_path (p); FileSource::set_path (p);
} }

View file

@ -59,7 +59,8 @@ Source::Source (Session& s, DataType type, const string& name, Flag flags)
: SessionObject(s, name) : SessionObject(s, name)
, _type(type) , _type(type)
, _flags(flags) , _flags(flags)
, _timeline_position(0) , _natural_position(0)
, _have_natural_position (false)
, _use_count (0) , _use_count (0)
, _level (0) , _level (0)
{ {
@ -72,7 +73,8 @@ Source::Source (Session& s, const XMLNode& node)
: SessionObject(s, "unnamed source") : SessionObject(s, "unnamed source")
, _type(DataType::AUDIO) , _type(DataType::AUDIO)
, _flags (Flag (Writable|CanRename)) , _flags (Flag (Writable|CanRename))
, _timeline_position(0) , _natural_position(0)
, _have_natural_position (false)
, _use_count (0) , _use_count (0)
, _level (0) , _level (0)
{ {
@ -111,7 +113,12 @@ Source::get_state ()
node->set_property ("id", id()); node->set_property ("id", id());
if (_timestamp != 0) { if (_timestamp != 0) {
node->set_property ("timestamp", (int64_t)_timestamp); int64_t t = _timestamp;
node->set_property ("timestamp", t);
}
if (_have_natural_position) {
node->set_property ("natural-position", _natural_position);
} }
return *node; return *node;
@ -135,7 +142,19 @@ Source::set_state (const XMLNode& node, int version)
int64_t t; int64_t t;
if (node.get_property ("timestamp", t)) { if (node.get_property ("timestamp", t)) {
_timestamp = t; _timestamp = (time_t) t;
}
samplepos_t ts;
if (node.get_property ("natural-position", ts)) {
_natural_position = ts;
_have_natural_position = true;
} else if (node.get_property ("timeline-position", ts)) {
/* some older versions of ardour might have stored this with
this property name.
*/
_natural_position = ts;
_have_natural_position = true;
} }
if (!node.get_property (X_("flags"), _flags)) { if (!node.get_property (X_("flags"), _flags)) {
@ -273,9 +292,10 @@ Source::mark_for_remove ()
} }
void void
Source::set_timeline_position (samplepos_t pos) Source::set_natural_position (samplepos_t pos)
{ {
_timeline_position = pos; _natural_position = pos;
_have_natural_position = true;
} }
void void
@ -332,4 +352,3 @@ Source::writable () const
{ {
return (_flags & Writable) && _session.writable(); return (_flags & Writable) && _session.writable();
} }

View file

@ -76,7 +76,7 @@ write_bbt_source_to_source (boost::shared_ptr<MidiSource> bbt_source, boost::sh
bbt_source->model()->set_percussive (old_percussive); bbt_source->model()->set_percussive (old_percussive);
source->mark_streaming_write_completed (source_lock); source->mark_streaming_write_completed (source_lock);
source->set_timeline_position (bbt_source->timeline_position()); source->set_natural_position (bbt_source->natural_position());
return true; return true;
} }