diff options
Diffstat (limited to 'libs/ardour')
-rw-r--r-- | libs/ardour/ardour/caimportable.h | 1 | ||||
-rw-r--r-- | libs/ardour/ardour/importable_source.h | 1 | ||||
-rw-r--r-- | libs/ardour/ardour/lv2_plugin.h | 1 | ||||
-rw-r--r-- | libs/ardour/ardour/resampled_source.h | 1 | ||||
-rw-r--r-- | libs/ardour/ardour/sndfileimportable.h | 4 | ||||
-rw-r--r-- | libs/ardour/ardour/sndfilesource.h | 2 | ||||
-rw-r--r-- | libs/ardour/ardour/source.h | 2 | ||||
-rw-r--r-- | libs/ardour/import.cc | 5 | ||||
-rw-r--r-- | libs/ardour/sndfileimportable.cc | 36 |
9 files changed, 47 insertions, 6 deletions
diff --git a/libs/ardour/ardour/caimportable.h b/libs/ardour/ardour/caimportable.h index bb3e2ae191..2cc20d21b7 100644 --- a/libs/ardour/ardour/caimportable.h +++ b/libs/ardour/ardour/caimportable.h @@ -38,6 +38,7 @@ class CAImportableSource : public ImportableSource { nframes_t length() const; nframes_t samplerate() const; void seek (nframes_t pos); + nframes64_t natural_position() const { return 0; } protected: mutable CAAudioFile af; diff --git a/libs/ardour/ardour/importable_source.h b/libs/ardour/ardour/importable_source.h index f55c9a5711..26c840b60f 100644 --- a/libs/ardour/ardour/importable_source.h +++ b/libs/ardour/ardour/importable_source.h @@ -36,6 +36,7 @@ public: virtual nframes_t length() const = 0; virtual nframes_t samplerate() const = 0; virtual void seek (nframes_t pos) = 0; + virtual nframes64_t natural_position() const = 0; }; } diff --git a/libs/ardour/ardour/lv2_plugin.h b/libs/ardour/ardour/lv2_plugin.h index 219712799c..e354599485 100644 --- a/libs/ardour/ardour/lv2_plugin.h +++ b/libs/ardour/ardour/lv2_plugin.h @@ -176,6 +176,7 @@ struct LV2World { SLV2Value srate; SLV2Value gtk_gui; SLV2Value external_gui; + SLV2Value logarithmic; }; diff --git a/libs/ardour/ardour/resampled_source.h b/libs/ardour/ardour/resampled_source.h index c8fff0d594..1f6947aeac 100644 --- a/libs/ardour/ardour/resampled_source.h +++ b/libs/ardour/ardour/resampled_source.h @@ -40,6 +40,7 @@ class ResampledImportableSource : public ImportableSource nframes_t length() const { return source->length(); } nframes_t samplerate() const { return source->samplerate(); } void seek (nframes_t pos) { source->seek (pos); } + nframes64_t natural_position() const { return source->natural_position(); } static const uint32_t blocksize; diff --git a/libs/ardour/ardour/sndfileimportable.h b/libs/ardour/ardour/sndfileimportable.h index 9eb67c0dea..42ce83c0ee 100644 --- a/libs/ardour/ardour/sndfileimportable.h +++ b/libs/ardour/ardour/sndfileimportable.h @@ -38,11 +38,13 @@ class SndFileImportableSource : public ImportableSource { nframes_t length() const; nframes_t samplerate() const; void seek (nframes_t pos); + nframes64_t natural_position() const; protected: SF_INFO sf_info; boost::shared_ptr<SNDFILE> in; - + nframes_t timecode; + int64_t get_timecode_info (SNDFILE*, SF_BROADCAST_INFO*, bool&); }; } diff --git a/libs/ardour/ardour/sndfilesource.h b/libs/ardour/ardour/sndfilesource.h index 7d04e7de25..d3c6cdb85a 100644 --- a/libs/ardour/ardour/sndfilesource.h +++ b/libs/ardour/ardour/sndfilesource.h @@ -46,7 +46,7 @@ class SndFileSource : public AudioFileSource { int update_header (sframes_t when, struct tm&, time_t); int flush_header (); - sframes_t natural_position () const; + nframes64_t natural_position () const; sframes_t last_capture_start_frame() const; void mark_capture_start (sframes_t); diff --git a/libs/ardour/ardour/source.h b/libs/ardour/ardour/source.h index 968a92a804..d6c68edf90 100644 --- a/libs/ardour/ardour/source.h +++ b/libs/ardour/ardour/source.h @@ -66,7 +66,7 @@ class Source : public SessionObject, public boost::noncopyable virtual const Glib::ustring& path() const = 0; - virtual sframes_t natural_position() const { return 0; } + virtual nframes64_t natural_position() const { return 0; } void mark_for_remove(); diff --git a/libs/ardour/import.cc b/libs/ardour/import.cc index 735127e588..23ad3a23ad 100644 --- a/libs/ardour/import.cc +++ b/libs/ardour/import.cc @@ -211,7 +211,8 @@ map_existing_mono_sources (const vector<string>& new_paths, Session& /*sess*/, static bool create_mono_sources_for_writing (const vector<string>& new_paths, Session& sess, - uint samplerate, vector<boost::shared_ptr<Source> >& newfiles) + uint samplerate, vector<boost::shared_ptr<Source> >& newfiles, + nframes64_t timeline_position) { for (vector<string>::const_iterator i = new_paths.begin(); i != new_paths.end(); ++i) @@ -436,7 +437,7 @@ Session::import_audiofiles (ImportStatus& status) fatal << "THIS IS NOT IMPLEMENTED YET, IT SHOULD NEVER GET CALLED!!! DYING!" << endl; status.cancel = !map_existing_mono_sources (new_paths, *this, frame_rate(), newfiles, this); } else { - status.cancel = !create_mono_sources_for_writing (new_paths, *this, frame_rate(), newfiles); + status.cancel = !create_mono_sources_for_writing (new_paths, *this, frame_rate(), newfiles, source->natural_position()); } // copy on cancel/failure so that any files that were created will be removed below diff --git a/libs/ardour/sndfileimportable.cc b/libs/ardour/sndfileimportable.cc index 3328eddb23..d741dd008b 100644 --- a/libs/ardour/sndfileimportable.cc +++ b/libs/ardour/sndfileimportable.cc @@ -1,14 +1,42 @@ #include "ardour/sndfileimportable.h" #include <sndfile.h> #include <iostream> +#include <cstring> using namespace ARDOUR; using namespace std; +/* FIXME: this was copied from sndfilesource.cc, at some point these should be merged */ +int64_t +SndFileImportableSource::get_timecode_info (SNDFILE* sf, SF_BROADCAST_INFO* binfo, bool& exists) +{ + if (sf_command (sf, SFC_GET_BROADCAST_INFO, binfo, sizeof (*binfo)) != SF_TRUE) { + exists = false; + return 0; + } + + exists = true; + int64_t ret = (uint32_t) binfo->time_reference_high; + ret <<= 32; + ret |= (uint32_t) binfo->time_reference_low; + return ret; +} + SndFileImportableSource::SndFileImportableSource (const string& path) - : in (sf_open (path.c_str(), SFM_READ, &sf_info), sf_close) { + memset(&sf_info, 0 , sizeof(sf_info)); + in.reset( sf_open(path.c_str(), SFM_READ, &sf_info), sf_close); if (!in) throw failed_constructor(); + + SF_BROADCAST_INFO binfo; + bool timecode_exists; + + memset (&binfo, 0, sizeof (binfo)); + timecode = get_timecode_info (in.get(), &binfo, timecode_exists); + + if (!timecode_exists) { + timecode = 0; + } } SndFileImportableSource::~SndFileImportableSource () @@ -46,3 +74,9 @@ SndFileImportableSource::seek (nframes_t /*pos*/) { sf_seek (in.get(), 0, SEEK_SET); } + +nframes64_t +SndFileImportableSource::natural_position () const +{ + return timecode; +} |