fix mixup with previous commit
authorPaul Davis <paul@linuxaudiosystems.com>
Mon, 15 Oct 2018 01:22:39 +0000 (21:22 -0400)
committerPaul Davis <paul@linuxaudiosystems.com>
Mon, 15 Oct 2018 01:22:39 +0000 (21:22 -0400)
libs/ptformat/ptformat/ptfformat.h [new file with mode: 0644]

diff --git a/libs/ptformat/ptformat/ptfformat.h b/libs/ptformat/ptformat/ptfformat.h
new file mode 100644 (file)
index 0000000..933d2be
--- /dev/null
@@ -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