headless-chicken: various fixes
[ardour.git] / libs / ptformat / ptfformat.cc
index caf2c2f42a668a883d24d7c9e27419e60637fb77..1dba1ac31a6e7a11726e1640ce34f141a4f5398f 100644 (file)
@@ -15,6 +15,7 @@
 */
 
 #include <stdio.h>
+#include <stdlib.h>
 #include <string>
 #include <string.h>
 #include <assert.h>
@@ -233,6 +234,12 @@ PTFFormat::load(std::string path, int64_t targetsr) {
                unxor10();
        }
 
+       // Special case when ptx is exported to ptf in PT
+       if (v == 3) {
+               version = 11;
+               unxor_ptx_to_ptf();
+       }
+
        if (version == 0 || version == 5 || version == 7) {
                /* Haven't detected version yet so decipher */
                j = 0;
@@ -305,6 +312,28 @@ PTFFormat::unxor10(void)
        }
 }
 
+void
+PTFFormat::unxor_ptx_to_ptf(void)
+{
+       unsigned char keyy[16] = {      0x00,0x10,0x20,0x30,0x40,0x50,0x60,0x70,
+                                       0x80,0x90,0xa0,0xb0,0xc0,0xd0,0xe0,0xf0
+       };
+       uint64_t j;
+       uint8_t i;
+
+       for (i = 0, j = 0x10; j < len; j++,i++) {
+               ptfunxored[j] ^= keyy[i];
+               if ((j % 16) == 0) {
+                       i = 0;
+                       if (ptfunxored[j] % 2 == 0) {
+                               ptfunxored[j]++;
+                       } else {
+                               ptfunxored[j]--;
+                       }
+               }
+       }
+}
+
 int
 PTFFormat::parse(void) {
        if (version == 5) {