From 1d6e8f6681bb1f9ef16904016bf515c23e93efc9 Mon Sep 17 00:00:00 2001 From: Damien Zammit Date: Thu, 6 Aug 2015 17:29:37 +1000 Subject: Fixed pt import start offsets and samplerate mismatch offsets Signed-off-by: Damien Zammit --- gtk2_ardour/editor_pt_import.cc | 2 +- libs/ptformat/ptfformat.cc | 49 +++++++++++++++++++++-------------------- libs/ptformat/ptfformat.h | 7 ++++-- 3 files changed, 31 insertions(+), 27 deletions(-) diff --git a/gtk2_ardour/editor_pt_import.cc b/gtk2_ardour/editor_pt_import.cc index 8689d94391..c1ae3a3bb1 100644 --- a/gtk2_ardour/editor_pt_import.cc +++ b/gtk2_ardour/editor_pt_import.cc @@ -127,7 +127,7 @@ Editor::do_ptimport (std::string ptpath, vector ptfwavpair; vector ptfregpair; - if (ptf.load(ptpath) == -1) { + if (ptf.load(ptpath, _session->frame_rate()) == -1) { MessageDialog msg (_("Doesn't seem to be a valid PT session file (.ptf only currently supported)")); msg.run (); return; diff --git a/libs/ptformat/ptfformat.cc b/libs/ptformat/ptfformat.cc index dde7367c6c..42bb3f175a 100644 --- a/libs/ptformat/ptfformat.cc +++ b/libs/ptformat/ptfformat.cc @@ -102,7 +102,7 @@ PTFFormat::foundin(std::string haystack, std::string needle) { -1 could not open file as ptf */ int -PTFFormat::load(std::string path) { +PTFFormat::load(std::string path, int64_t targetsr) { FILE *fp; unsigned char xxor[256]; unsigned char ct; @@ -254,6 +254,7 @@ PTFFormat::load(std::string path) { break; } fclose(fp); + this->targetrate = targetsr; parse(); return 0; } @@ -264,15 +265,25 @@ PTFFormat::parse(void) { if (this->version == 8) { parse8header(); + setrates(); parserest(); } else if (this->version == 9) { parse9header(); + setrates(); parserest(); } else { // Should not occur } } +void +PTFFormat::setrates(void) { + this->ratefactor = 1.f; + if (sessionrate != 0) { + this->ratefactor = (float)this->targetrate / this->sessionrate; + } +} + void PTFFormat::parse8header(void) { int k; @@ -502,8 +513,8 @@ PTFFormat::parserest(void) { wav_t f = { filename, 0, - (int64_t)start, - (int64_t)length, + (int64_t)(start*this->ratefactor), + (int64_t)(length*this->ratefactor), }; f.index = findex; @@ -519,9 +530,9 @@ PTFFormat::parserest(void) { region_t r = { name, rindex, - start, - sampleoffset, - length, + (int64_t)(start*this->ratefactor), + (int64_t)(sampleoffset*this->ratefactor), + (int64_t)(length*this->ratefactor), f }; this->regions.push_back(r); @@ -533,9 +544,9 @@ PTFFormat::parserest(void) { region_t r = { name, rindex, - start, - sampleoffset, - length, + (int64_t)(start*this->ratefactor), + (int64_t)(sampleoffset*this->ratefactor), + (int64_t)(length*this->ratefactor), f }; this->regions.push_back(r); @@ -612,23 +623,13 @@ PTFFormat::parserest(void) { if ((found = std::find(begin, finish, tr.reg)) != finish) { tr.reg = (*found); } - startbytes = (ptfunxored[l+3] & 0xf0) >> 4; - i = l+16; offset = 0; - switch (startbytes) { - case 4: - offset |= (uint32_t)(ptfunxored[i+3] << 24); - case 3: - offset |= (uint32_t)(ptfunxored[i+2] << 16); - case 2: - offset |= (uint32_t)(ptfunxored[i+1] << 8); - case 1: - offset |= (uint32_t)(ptfunxored[i]); - default: - break; - } - tr.reg.startpos = (int64_t)offset; + offset |= (uint32_t)(ptfunxored[i+3] << 24); + offset |= (uint32_t)(ptfunxored[i+2] << 16); + offset |= (uint32_t)(ptfunxored[i+1] << 8); + offset |= (uint32_t)(ptfunxored[i]); + tr.reg.startpos = (int64_t)(offset*this->ratefactor); if (tr.reg.length > 0) { this->tracks.push_back(tr); } diff --git a/libs/ptformat/ptfformat.h b/libs/ptformat/ptfformat.h index 0f60dc3335..394b727add 100644 --- a/libs/ptformat/ptfformat.h +++ b/libs/ptformat/ptfformat.h @@ -28,7 +28,7 @@ public: /* Return values: 0 success -1 could not open file as ptf */ - int load(std::string path); + int load(std::string path, int64_t targetsr); typedef struct wav { std::string filename; @@ -110,7 +110,8 @@ public: return false; } - uint32_t sessionrate; + int64_t sessionrate; + int64_t targetrate; uint8_t version; unsigned char c0; @@ -121,10 +122,12 @@ public: private: bool foundin(std::string haystack, std::string needle); void parse(void); + void setrates(void); void parse8header(void); void parse9header(void); void parserest(void); std::vector actualwavs; + float ratefactor; }; -- cgit v1.2.3