summaryrefslogtreecommitdiff
path: root/libs
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2018-10-14 21:22:39 -0400
committerPaul Davis <paul@linuxaudiosystems.com>2018-10-14 21:22:39 -0400
commitd7fca7c828a2bec548fa4888f4cfe7a9c0ba7f8f (patch)
tree6aa960a669df3e4b55704ffa471010e974d4d485 /libs
parent0154c82fa3d1434b33ccb058a52b6741498e0373 (diff)
fix mixup with previous commit
Diffstat (limited to 'libs')
-rw-r--r--libs/ptformat/ptformat/ptfformat.h188
1 files changed, 188 insertions, 0 deletions
diff --git a/libs/ptformat/ptformat/ptfformat.h b/libs/ptformat/ptformat/ptfformat.h
new file mode 100644
index 0000000000..933d2be56e
--- /dev/null
+++ b/libs/ptformat/ptformat/ptfformat.h
@@ -0,0 +1,188 @@
+/*
+ * libptformat - a library to read ProTools sessions
+ *
+ * Copyright (C) 2015 Damien Zammit
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+#ifndef PTFFORMAT_H
+#define PTFFORMAT_H
+
+#include <string>
+#include <cstring>
+#include <algorithm>
+#include <vector>
+#include <stdint.h>
+#include "ptformat/visibility.h"
+
+class LIBPTFORMAT_API PTFFormat {
+public:
+ PTFFormat();
+ ~PTFFormat();
+
+ /* Return values: 0 success
+ -1 could not parse pt session
+ */
+ int load(std::string path, int64_t targetsr);
+
+ /* Return values: 0 success
+ -1 could not decrypt pt session
+ */
+ int unxor(std::string path);
+
+ struct wav_t {
+ std::string filename;
+ uint16_t index;
+
+ int64_t posabsolute;
+ int64_t length;
+
+ bool operator <(const struct wav_t& other) const {
+ return (strcasecmp(this->filename.c_str(),
+ other.filename.c_str()) < 0);
+ }
+
+ bool operator ==(const struct wav_t& other) const {
+ return (this->filename == other.filename ||
+ this->index == other.index);
+ }
+
+ };
+
+ struct midi_ev_t {
+ uint64_t pos;
+ uint64_t length;
+ uint8_t note;
+ uint8_t velocity;
+ };
+
+ typedef struct region {
+ std::string name;
+ uint16_t index;
+ int64_t startpos;
+ int64_t sampleoffset;
+ int64_t length;
+ wav_t wave;
+ std::vector<midi_ev_t> midi;
+
+ bool operator ==(const struct region& other) {
+ return (this->index == other.index);
+ }
+
+ bool operator <(const struct region& other) const {
+ return (strcasecmp(this->name.c_str(),
+ other.name.c_str()) < 0);
+ }
+ } region_t;
+
+ typedef struct compound {
+ uint16_t curr_index;
+ uint16_t unknown1;
+ uint16_t level;
+ uint16_t ontopof_index;
+ uint16_t next_index;
+ std::string name;
+ } compound_t;
+
+ typedef struct track {
+ std::string name;
+ uint16_t index;
+ uint8_t playlist;
+ region_t reg;
+
+ bool operator ==(const struct track& other) {
+ return (this->name == other.name);
+ }
+ } track_t;
+
+ std::vector<wav_t> audiofiles;
+ std::vector<region_t> regions;
+ std::vector<region_t> midiregions;
+ std::vector<compound_t> compounds;
+ std::vector<track_t> tracks;
+ std::vector<track_t> miditracks;
+
+ static bool regionexistsin(std::vector<region_t> reg, uint16_t index) {
+ std::vector<region_t>::iterator begin = reg.begin();
+ std::vector<region_t>::iterator finish = reg.end();
+ std::vector<region_t>::iterator found;
+
+ wav_t w = { std::string(""), 0, 0, 0 };
+ std::vector<midi_ev_t> m;
+ region_t r = { std::string(""), index, 0, 0, 0, w, m};
+
+ if ((found = std::find(begin, finish, r)) != finish) {
+ return true;
+ }
+ return false;
+ }
+
+ static bool wavexistsin(std::vector<wav_t> wv, uint16_t index) {
+ std::vector<wav_t>::iterator begin = wv.begin();
+ std::vector<wav_t>::iterator finish = wv.end();
+ std::vector<wav_t>::iterator found;
+
+ wav_t w = { std::string(""), index, 0, 0 };
+
+ if ((found = std::find(begin, finish, w)) != finish) {
+ return true;
+ }
+ return false;
+ }
+
+ int64_t sessionrate;
+ int64_t targetrate;
+ uint8_t version;
+ uint8_t *product;
+ std::string path;
+
+ unsigned char c0;
+ unsigned char c1;
+ unsigned char *ptfunxored;
+ uint64_t len;
+
+private:
+ bool jumpback(uint32_t *currpos, unsigned char *buf, const uint32_t maxoffset, const unsigned char *needle, const uint32_t needlelen);
+ bool jumpto(uint32_t *currpos, unsigned char *buf, const uint32_t maxoffset, const unsigned char *needle, const uint32_t needlelen);
+ bool foundin(std::string haystack, std::string needle);
+ int64_t foundat(unsigned char *haystack, uint64_t n, const char *needle);
+ int parse(void);
+ bool parse_version();
+ uint8_t gen_xor_delta(uint8_t xor_value, uint8_t mul, bool negative);
+ void setrates(void);
+ void cleanup(void);
+ void parse5header(void);
+ void parse7header(void);
+ void parse8header(void);
+ void parse9header(void);
+ void parse10header(void);
+ void parserest5(void);
+ void parserest89(void);
+ void parserest12(void);
+ void parseaudio5(void);
+ void parseaudio(void);
+ void parsemidi(void);
+ void parsemidi12(void);
+ void resort(std::vector<wav_t>& ws);
+ void resort(std::vector<region_t>& rs);
+ void filter(std::vector<region_t>& rs);
+ std::vector<wav_t> actualwavs;
+ float ratefactor;
+ std::string extension;
+};
+
+
+#endif