Unjumble the PT5 wav ordering in regions/tracks
authorDamien Zammit <damien@zamaudio.com>
Tue, 2 Feb 2016 05:49:12 +0000 (16:49 +1100)
committerRobin Gareus <robin@gareus.org>
Sat, 13 Feb 2016 08:50:52 +0000 (09:50 +0100)
by sorting alphanumerically and case insensitively

Signed-off-by: Damien Zammit <damien@zamaudio.com>
libs/ptformat/ptfformat.cc
libs/ptformat/ptfformat.h

index f233f51dfa0b864f224837523e76141adb8b22e5..99c89510dc9a84118f44a22169d1c892a96e047b 100644 (file)
@@ -630,6 +630,17 @@ PTFFormat::parserest5(void) {
        }
 }
 
+void
+PTFFormat::resort(std::vector<wav_t> *ws) {
+       int j = 0;
+       std::sort((*ws).begin(), (*ws).end());
+       for (std::vector<wav_t>::iterator i = (*ws).begin();
+                       i != (*ws).end(); ++i) {
+               (*i).index = j;
+               j++;
+       }
+}
+
 void
 PTFFormat::parseaudio5(void) {
        int i,k,l;
@@ -670,6 +681,7 @@ PTFFormat::parseaudio5(void) {
 
        wavnumber = 0;
        i+=16;
+       char ext[5];
        while (i < len && numberofwavs > 0) {
                i++;
                if (            (ptfunxored[i  ] == 0x5a) &&
@@ -684,11 +696,19 @@ PTFFormat::parseaudio5(void) {
                        wavname[l] = ptfunxored[i+l];
                        l++;
                }
-               i+=lengthofname + 4;
+               i+=lengthofname;
+               ext[0] = ptfunxored[i++];
+               ext[1] = ptfunxored[i++];
+               ext[2] = ptfunxored[i++];
+               ext[3] = ptfunxored[i++];
+               ext[4] = '\0';
+
                wavname[l] = 0;
-               if (foundin(wavname, ".wav")) {
+               if (foundin(wavname, ".L") || foundin(wavname, ".R")) {
+                       extension = string("");
+               } else if (foundin(wavname, ".wav") || foundin(ext, "WAVE")) {
                        extension = string(".wav");
-               } else if (foundin(wavname, ".aif")) {
+               } else if (foundin(wavname, ".aif") || foundin(ext, "AIFF")) {
                        extension = string(".aif");
                } else {
                        extension = string("");
@@ -707,6 +727,8 @@ PTFFormat::parseaudio5(void) {
                numberofwavs--;
                i += 7;
        }
+       resort(&actualwavs);
+       resort(&audiofiles);
 }
 
 void
index be7076dbfda7d274209c773f9fb945e849a2bf93..1d3dac2ba35b8ed66425b21864c13473fed8c629 100644 (file)
 #define PTFFORMAT_H
 
 #include <string>
+#include <cstring>
 #include <algorithm>
 #include <vector>
 #include <stdint.h>
-
 #include "ptformat/visibility.h"
 
 class LIBPTFORMAT_API PTFFormat {
@@ -39,6 +39,11 @@ public:
                int64_t     posabsolute;
                int64_t     length;
 
+               bool operator <(const struct wav& other) {
+                       return (strcasecmp(this->filename.c_str(),
+                                       other.filename.c_str()) < 0);
+               }
+
                bool operator ==(const struct wav& other) {
                        return (this->filename == other.filename ||
                                this->index == other.index);
@@ -125,6 +130,7 @@ private:
        void parserest10(void);
        void parseaudio5(void);
        void parseaudio(void);
+       void resort(std::vector<wav_t> *ws);
        std::vector<wav_t> actualwavs;
        float ratefactor;
        std::string extension;