summaryrefslogtreecommitdiff
path: root/ptformat
diff options
context:
space:
mode:
authorDamien Zammit <damien@zamaudio.com>2019-06-20 21:12:29 +1000
committerDamien Zammit <damien@zamaudio.com>2019-06-20 21:12:29 +1000
commit12faf930828aad1beca8f9f548a2d2469537ced6 (patch)
tree79fd3e60df9dc53046e93dc9f4f4a4097209009e /ptformat
parentdc8816c3378b1aea2b5cec5fa831d0d1316a5677 (diff)
Add recursive routine to clear blocks in cleanup()
Diffstat (limited to 'ptformat')
-rw-r--r--ptformat/ptfformat.h283
1 files changed, 0 insertions, 283 deletions
diff --git a/ptformat/ptfformat.h b/ptformat/ptfformat.h
index 59b6995..40d6025 100644
--- a/ptformat/ptfformat.h
+++ b/ptformat/ptfformat.h
@@ -1,283 +0,0 @@
-/*
- * 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"
-
-#define BITCODE "0010111100101011"
-#define ZMARK '\x5a'
-#define ZERO_TICKS 0xe8d4a51000ULL
-#define MAX_CONTENT_TYPE 0x3000
-#define MAX_CHANNELS_PER_TRACK 8
-
-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 track {
- std::string name;
- uint16_t index;
- uint8_t playlist;
- region_t reg;
-
- bool operator <(const struct track& other) const {
- return (this->index < other.index);
- }
-
- bool operator ==(const struct track& other) {
- return (this->index == other.index);
- }
- } track_t;
-
- bool find_track(uint16_t index, std::vector<track_t>::iterator& ti) {
- std::vector<track_t>::iterator begin = tracks.begin();
- std::vector<track_t>::iterator finish = tracks.end();
- std::vector<track_t>::iterator found;
-
- // Create dummy track with index
- wav_t w = { std::string(""), 0, 0, 0 };
- std::vector<midi_ev_t> m;
- region_t r = { std::string(""), 0, 0, 0, 0, w, m};
- track_t t = { std::string(""), index, 0, r};
-
- if ((found = std::find(begin, finish, t)) != finish) {
- ti = found;
- return true;
- }
- return false;
- }
-
- bool find_region(uint16_t index, std::vector<region_t>::iterator& ri) {
- std::vector<region_t>::iterator begin = regions.begin();
- std::vector<region_t>::iterator finish = regions.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) {
- ri = found;
- return true;
- }
- return false;
- }
-
- bool find_miditrack(uint16_t index, std::vector<track_t>::iterator& ti) {
- std::vector<track_t>::iterator begin = miditracks.begin();
- std::vector<track_t>::iterator finish = miditracks.end();
- std::vector<track_t>::iterator found;
-
- // Create dummy track with index
- wav_t w = { std::string(""), 0, 0, 0 };
- std::vector<midi_ev_t> m;
- region_t r = { std::string(""), 0, 0, 0, 0, w, m};
- track_t t = { std::string(""), index, 0, r};
-
- if ((found = std::find(begin, finish, t)) != finish) {
- ti = found;
- return true;
- }
- return false;
- }
-
- bool find_midiregion(uint16_t index, std::vector<region_t>::iterator& ri) {
- std::vector<region_t>::iterator begin = midiregions.begin();
- std::vector<region_t>::iterator finish = midiregions.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) {
- ri = found;
- return true;
- }
- return false;
- }
-
- bool find_wav(uint16_t index, std::vector<wav_t>::iterator& wi) {
- std::vector<wav_t>::iterator begin = audiofiles.begin();
- std::vector<wav_t>::iterator finish = audiofiles.end();
- std::vector<wav_t>::iterator found;
-
- wav_t w = { std::string(""), index, 0, 0 };
-
- if ((found = std::find(begin, finish, w)) != finish) {
- wi = found;
- return true;
- }
- return false;
- }
-
- 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;
- }
-
- std::vector<wav_t> audiofiles;
- std::vector<region_t> regions;
- std::vector<region_t> midiregions;
- std::vector<track_t> tracks;
- std::vector<track_t> miditracks;
-
- std::string path;
- unsigned char *ptfunxored;
- uint64_t len;
- int64_t sessionrate;
- uint8_t version;
-
-private:
- struct block_t;
-
- struct block_t {
- uint8_t zmark; // 'Z'
- uint16_t block_type; // type of block
- uint32_t block_size; // size of block
- uint16_t content_type; // type of content
- uint32_t offset; // offset in file
- std::vector<block_t> child; // vector of child blocks
- };
- std::vector<block_t> blocks;
-
- unsigned char c0;
- unsigned char c1;
- uint8_t *product;
- bool is_bigendian;
- int64_t targetrate;
- float ratefactor;
-
- 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);
- uint16_t u_endian_read2(unsigned char *buf, bool);
- uint32_t u_endian_read3(unsigned char *buf, bool);
- uint32_t u_endian_read4(unsigned char *buf, bool);
- uint64_t u_endian_read5(unsigned char *buf, bool);
- uint64_t u_endian_read8(unsigned char *buf, bool);
-
- char *parsestring(uint32_t pos);
- std::string get_content_description(uint16_t ctype);
- int parse(void);
- void parseblocks(void);
- bool parseheader(void);
- bool parserest(void);
- bool parseaudio(void);
- bool parsemidi(void);
- void dump(void);
- bool parse_block_at(uint32_t pos, struct block_t *b, int level);
- void dump_block(struct block_t& b, int level);
- bool parse_version();
- void parse_region_info(uint32_t j, block_t& blk, region_t& r);
- void parse_three_point(uint32_t j, uint64_t& start, uint64_t& offset, uint64_t& length);
- uint8_t gen_xor_delta(uint8_t xor_value, uint8_t mul, bool negative);
- void setrates(void);
- void cleanup(void);
-};
-
-#endif