From 1fd8b25aa9eb5d6bf9ed67ea02d7f290e98db2bf Mon Sep 17 00:00:00 2001 From: Damien Zammit Date: Sun, 17 Sep 2017 12:30:37 +1000 Subject: WIP ptx Signed-off-by: Damien Zammit --- gtk2_ardour/editor_pt_import.cc | 3 ++ libs/ptformat/ptfformat.cc | 78 ++++++++++++++++++++++++++++++++++++++--- libs/ptformat/ptfformat.h | 1 + 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 { @@ -795,6 +794,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& ws); -- cgit v1.2.3