Update ptformat to upstream 72bd66b
[ardour.git] / libs / ptformat / ptfformat.h
index e8267bcf59c7c439f2a3cb516801f8730cf82eff..4d7e7fd6628fdc217214ecbbf992859c9f44db71 100644 (file)
 #define PTFFORMAT_H
 
 #include <string>
+#include <cstring>
 #include <algorithm>
 #include <vector>
 #include <stdint.h>
+#include "ptformat/visibility.h"
 
-class PTFFormat {
+class LIBPTFORMAT_API PTFFormat {
 public:
        PTFFormat();
        ~PTFFormat();
@@ -30,19 +32,31 @@ public:
        */
        int load(std::string path, int64_t targetsr);
 
-       typedef struct wav {
+       struct wav_t {
                std::string filename;
                uint16_t    index;
 
                int64_t     posabsolute;
                int64_t     length;
 
-               bool operator ==(const struct wav& other) {
-                       return (this->filename != std::string("") &&
+               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);
                }
 
-       } wav_t;
+       };
+
+       struct midi_ev_t {
+               uint64_t pos;
+               uint64_t length;
+               uint8_t note;
+               uint8_t velocity;
+       };
 
        typedef struct region {
                std::string name;
@@ -51,6 +65,7 @@ public:
                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);
@@ -78,7 +93,8 @@ public:
                std::vector<region_t>::iterator found;
 
                wav_t w = { std::string(""), 0, 0, 0 };
-               region_t r = { std::string(""), index, 0, 0, 0, w };
+               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;
@@ -102,16 +118,20 @@ public:
        int64_t sessionrate;
        int64_t targetrate;
        uint8_t version;
+       uint8_t *product;
+
 
        unsigned char c0;
        unsigned char c1;
        unsigned char *ptfunxored;
-       int len;
+       uint64_t len;
 
 private:
        bool foundin(std::string haystack, std::string needle);
-       void parse(void);
-       void unxor10(void);
+       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 parse5header(void);
        void parse7header(void);
@@ -123,6 +143,8 @@ private:
        void parserest10(void);
        void parseaudio5(void);
        void parseaudio(void);
+       void parsemidi(void);
+       void resort(std::vector<wav_t>& ws);
        std::vector<wav_t> actualwavs;
        float ratefactor;
        std::string extension;