Fixed pt import start offsets and samplerate mismatch offsets

Signed-off-by: Damien Zammit <damien@zamaudio.com>
This commit is contained in:
Damien Zammit 2015-08-06 17:29:37 +10:00
parent b75a38089b
commit 1d6e8f6681
3 changed files with 31 additions and 27 deletions

View File

@ -127,7 +127,7 @@ Editor::do_ptimport (std::string ptpath,
vector<ptflookup_t> ptfwavpair;
vector<ptflookup_t> 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;

View File

@ -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);
}

View File

@ -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;
};