Fixed pt import start offsets and samplerate mismatch offsets
authorDamien Zammit <damien@zamaudio.com>
Thu, 6 Aug 2015 07:29:37 +0000 (17:29 +1000)
committerDamien Zammit <damien@zamaudio.com>
Thu, 6 Aug 2015 07:35:17 +0000 (17:35 +1000)
Signed-off-by: Damien Zammit <damien@zamaudio.com>
gtk2_ardour/editor_pt_import.cc
libs/ptformat/ptfformat.cc
libs/ptformat/ptfformat.h

index 8689d94391c0b0954d3b2c7d81bf171f471785de..c1ae3a3bb150aeff216ba8d2e8612196fa2973c0 100644 (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;
index dde7367c6c16bb005085bf0ab45c3e2b2496cd26..42bb3f175ae3f7ac49a106d63a8d836c5832b791 100644 (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);
                                        }
index 0f60dc3335769591ac61fbd2164d425ddf6a9b89..394b727add7dfa9e0f762473d7cb8d5f7e41ab1b 100644 (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;
 };