summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDamien Zammit <damien@zamaudio.com>2017-09-17 12:30:37 +1000
committerDamien Zammit <damien@zamaudio.com>2017-09-17 12:30:37 +1000
commit1fd8b25aa9eb5d6bf9ed67ea02d7f290e98db2bf (patch)
tree54bbedeb256668d8a05b9e62d28cfe6e18046f13
parentf9aff37623ba17a80371572fcba38515ea9b78ca (diff)
Signed-off-by: Damien Zammit <damien@zamaudio.com>
-rw-r--r--gtk2_ardour/editor_pt_import.cc3
-rw-r--r--libs/ptformat/ptfformat.cc78
-rw-r--r--libs/ptformat/ptfformat.h1
3 files changed, 78 insertions, 4 deletions
diff --git a/gtk2_ardour/editor_pt_import.cc b/gtk2_ardour/editor_pt_import.cc
index 55c3b0b43c..a8278d007a 100644
--- a/gtk2_ardour/editor_pt_import.cc
+++ b/gtk2_ardour/editor_pt_import.cc
@@ -299,6 +299,9 @@ Editor::do_ptimport (std::string ptpath,
}
existing_track = at.back();
std::string trackname;
+ if ( a->name.empty () ) {
+ trackname = string_compose ("Audio %1", a->index);
+ }
try {
trackname = Glib::convert_with_fallback (a->name, "UTF-8", "UTF-8", "_");
} catch (Glib::ConvertError& err) {
diff --git a/libs/ptformat/ptfformat.cc b/libs/ptformat/ptfformat.cc
index 8a2f0f2c23..3004ef2c0a 100644
--- a/libs/ptformat/ptfformat.cc
+++ b/libs/ptformat/ptfformat.cc
@@ -111,17 +111,16 @@ PTFFormat::load(std::string path, int64_t targetsr) {
xor_type = ptfunxored[0x12];
xor_value = ptfunxored[0x13];
+ xor_len = 256;
// xor_type 0x01 = ProTools 5, 6, 7, 8 and 9
// xor_type 0x05 = ProTools 10, 11, 12
switch(xor_type) {
case 0x01:
xor_delta = gen_xor_delta(xor_value, 53, false);
- xor_len = 256;
break;
case 0x05:
xor_delta = gen_xor_delta(xor_value, 11, true);
- xor_len = 128;
break;
default:
fclose(fp);
@@ -138,7 +137,7 @@ PTFFormat::load(std::string path, int64_t targetsr) {
i = 0x14;
fseek(fp, i, SEEK_SET);
while (fread(&ct, 1, 1, fp) != 0) {
- uint8_t xor_index = (xor_type == 0x01) ? i & 0xff : (i >> 12) & 0x7f;
+ uint8_t xor_index = (xor_type == 0x01) ? i & 0xff : (i >> 12) & 0xff;
ptfunxored[i++] = ct ^ xxor[xor_index];
}
fclose(fp);
@@ -278,7 +277,7 @@ PTFFormat::parse(void) {
setrates();
if (sessionrate < 44100 || sessionrate > 192000)
return -1;
- parseaudio();
+ parseaudio10();
parserest10();
parsemidi();
} else {
@@ -796,6 +795,77 @@ PTFFormat::parsemidi(void) {
}
void
+PTFFormat::parseaudio10(void) {
+ uint64_t i,j,k,l;
+ uint8_t charlen;
+
+ // Find end of wav file list
+ k = 0;
+ while (k < len) {
+ if ( (ptfunxored[k ] == 0xff) &&
+ (ptfunxored[k+1] == 0xff) &&
+ (ptfunxored[k+2] == 0xff) &&
+ (ptfunxored[k+3] == 0xff)) {
+ break;
+ }
+ k++;
+ }
+
+ // Find actual wav names
+ uint16_t numberofwavs = 0;
+ uint16_t n = 0;
+ char wavname[256];
+ for (i = k; i > 2; i--) {
+ if ( (ptfunxored[i ] == 0x01) &&
+ (ptfunxored[i-1] == 0x5a)) {
+
+ numberofwavs = 0;
+ numberofwavs |= (uint32_t)(ptfunxored[i-2] << 24);
+ numberofwavs |= (uint32_t)(ptfunxored[i-3] << 16);
+ numberofwavs |= (uint32_t)(ptfunxored[i-4] << 8);
+ numberofwavs |= (uint32_t)(ptfunxored[i-5]);
+ break;
+ }
+ }
+ if (numberofwavs == 0)
+ return;
+
+ // Skip over "Audio Files"
+ j = i + 17;
+ charlen = ptfunxored[j];
+ j += 4;
+ j += charlen + 9;
+
+ // Get wav filenames
+ while (n < numberofwavs) {
+ charlen = ptfunxored[j];
+ j += 4;
+ l = 0;
+ while (l < charlen) {
+ wavname[l] = ptfunxored[j];
+ l++;
+ j++;
+ }
+ j += 9;
+ wavname[l] = 0;
+ std::string wave = string(wavname);
+ wav_t f = { wave, n, 0, 0 };
+
+ if (foundin(wave, string(".grp"))) {
+ continue;
+ }
+
+ if (foundin(wavname, ".wav")) {
+ extension = string(".wav");
+ } else if (foundin(wavname, ".aif")) {
+ extension = string(".aif");
+ }
+ actualwavs.push_back(f);
+ n++;
+ }
+}
+
+void
PTFFormat::parseaudio(void) {
uint64_t i,j,k,l;
diff --git a/libs/ptformat/ptfformat.h b/libs/ptformat/ptfformat.h
index e5f4ed94bd..7a3eb40d37 100644
--- a/libs/ptformat/ptfformat.h
+++ b/libs/ptformat/ptfformat.h
@@ -141,6 +141,7 @@ private:
void parserest89(void);
void parserest10(void);
void parseaudio5(void);
+ void parseaudio10(void);
void parseaudio(void);
void parsemidi(void);
void resort(std::vector<wav_t>& ws);