X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fsndfileimportable.cc;h=cc68f3ea01ebce146a7b72b13de57e898e21b8cd;hb=9e0d03020ff47773f7d1c0414de1c74e6c9e0dac;hp=71d3342dbc83c509553d0192a507b244b008bbac;hpb=e0aaed6d65f160c328cb8b56d7c6552ee15d65e2;p=ardour.git diff --git a/libs/ardour/sndfileimportable.cc b/libs/ardour/sndfileimportable.cc index 71d3342dbc..cc68f3ea01 100644 --- a/libs/ardour/sndfileimportable.cc +++ b/libs/ardour/sndfileimportable.cc @@ -1,14 +1,42 @@ #include "ardour/sndfileimportable.h" #include #include +#include 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 () @@ -16,7 +44,7 @@ SndFileImportableSource::~SndFileImportableSource () } nframes_t -SndFileImportableSource::read (Sample* buffer, nframes_t nframes) +SndFileImportableSource::read (Sample* buffer, nframes_t nframes) { nframes_t per_channel = nframes / sf_info.channels; per_channel = sf_readf_float (in.get(), buffer, per_channel); @@ -24,13 +52,13 @@ SndFileImportableSource::read (Sample* buffer, nframes_t nframes) } uint -SndFileImportableSource::channels () const +SndFileImportableSource::channels () const { return sf_info.channels; } nframes_t -SndFileImportableSource::length () const +SndFileImportableSource::length () const { return sf_info.frames; } @@ -42,7 +70,13 @@ SndFileImportableSource::samplerate() const } void -SndFileImportableSource::seek (nframes_t pos) +SndFileImportableSource::seek (nframes_t /*pos*/) { sf_seek (in.get(), 0, SEEK_SET); } + +nframes64_t +SndFileImportableSource::natural_position () const +{ + return timecode; +}