summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDamien Zammit <damien@zamaudio.com>2015-08-06 17:29:37 +1000
committerDamien Zammit <damien@zamaudio.com>2015-08-06 17:35:17 +1000
commit1d6e8f6681bb1f9ef16904016bf515c23e93efc9 (patch)
treebf0f02bcde7cb0a044bb11fc4b246b3ed4b96f15
parentb75a38089be96109cec2943dbd10902df048bc8b (diff)
Fixed pt import start offsets and samplerate mismatch offsets
Signed-off-by: Damien Zammit <damien@zamaudio.com>
-rw-r--r--gtk2_ardour/editor_pt_import.cc2
-rw-r--r--libs/ptformat/ptfformat.cc49
-rw-r--r--libs/ptformat/ptfformat.h7
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<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;
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;
};