diff options
author | Damien Zammit <damien@zamaudio.com> | 2015-08-06 17:29:37 +1000 |
---|---|---|
committer | Damien Zammit <damien@zamaudio.com> | 2015-08-06 17:35:17 +1000 |
commit | 1d6e8f6681bb1f9ef16904016bf515c23e93efc9 (patch) | |
tree | bf0f02bcde7cb0a044bb11fc4b246b3ed4b96f15 /libs/ptformat | |
parent | b75a38089be96109cec2943dbd10902df048bc8b (diff) |
Fixed pt import start offsets and samplerate mismatch offsets
Signed-off-by: Damien Zammit <damien@zamaudio.com>
Diffstat (limited to 'libs/ptformat')
-rw-r--r-- | libs/ptformat/ptfformat.cc | 49 | ||||
-rw-r--r-- | libs/ptformat/ptfformat.h | 7 |
2 files changed, 30 insertions, 26 deletions
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,9 +265,11 @@ PTFFormat::parse(void) { if (this->version == 8) { parse8header(); + setrates(); parserest(); } else if (this->version == 9) { parse9header(); + setrates(); parserest(); } else { // Should not occur @@ -274,6 +277,14 @@ PTFFormat::parse(void) { } 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<wav_t> actualwavs; + float ratefactor; }; |