ptformat: Make PT import more resilient to bad user choices and display messages
authorDamien Zammit <damien@zamaudio.com>
Sat, 16 Apr 2016 06:31:44 +0000 (16:31 +1000)
committerRobin Gareus <robin@gareus.org>
Sat, 16 Apr 2016 10:21:12 +0000 (12:21 +0200)
Previously, libptformat would attempt to parse all kinds of files,
now the library stops parsing when the version number and session rate
is outside valid ranges, returning an error code to the caller.

If there is a valid PT file detected, but some audio files are missing,
Ardour now pops up an error message to inform the user that some files
may be missing from the import.  A success message is displayed otherwise.

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

index 15723c3b27972e5bca9e8c67e4084a19d4597d48..3639fcf877f5fc468b794b69184e11b9bbe8365e 100644 (file)
@@ -121,6 +121,7 @@ Editor::do_ptimport (std::string ptpath,
        vector<string> to_import;
        string fullpath;
        bool ok = false;
+       bool onefailed = false;
        PTFFormat ptf;
        framepos_t pos = -1;
 
@@ -165,9 +166,19 @@ Editor::do_ptimport (std::string ptpath,
 
                        ptfwavpair.push_back(p);
                        imported.push_back(import_status.sources.back());
+               } else {
+                       onefailed = true;
                }
        }
 
+       if (onefailed) {
+               MessageDialog msg (_("Failed to load one or more of the audio files, but continuing to attempt import."));
+               msg.run ();
+       } else {
+               MessageDialog msg (_("Success! Import should complete soon."));
+               msg.run ();
+       }
+
        for (vector<PTFFormat::region_t>::iterator a = ptf.regions.begin();
                        a != ptf.regions.end(); ++a) {
                for (vector<ptflookup_t>::iterator p = ptfwavpair.begin();
index 048c17491829e76a907cd33d3dd4117ccaee8f96..8c3452c8682d1fe93d472d897e467362cdc66aa8 100644 (file)
@@ -113,6 +113,7 @@ PTFFormat::load(std::string path, int64_t targetsr) {
        uint64_t i;
        uint64_t j;
        int inv;
+       int err;
 
        if (! (fp = fopen(path.c_str(), "rb"))) {
                return -1;
@@ -257,8 +258,12 @@ PTFFormat::load(std::string path, int64_t targetsr) {
                }
        }
 
+       if (version < 5 || version > 12)
+               return -1;
        targetrate = targetsr;
-       parse();
+       err = parse();
+       if (err)
+               return -1;
        return 0;
 }
 
@@ -298,36 +303,48 @@ PTFFormat::unxor10(void)
        }
 }
 
-void
+int
 PTFFormat::parse(void) {
        if (version == 5) {
                parse5header();
                setrates();
+               if (sessionrate < 44100 || sessionrate > 192000)
+                 return -1;
                parseaudio5();
                parserest5();
        } else if (version == 7) {
                parse7header();
                setrates();
+               if (sessionrate < 44100 || sessionrate > 192000)
+                 return -1;
                parseaudio();
                parserest89();
        } else if (version == 8) {
                parse8header();
                setrates();
+               if (sessionrate < 44100 || sessionrate > 192000)
+                 return -1;
                parseaudio();
                parserest89();
        } else if (version == 9) {
                parse9header();
                setrates();
+               if (sessionrate < 44100 || sessionrate > 192000)
+                 return -1;
                parseaudio();
                parserest89();
        } else if (version == 10 || version == 11 || version == 12) {
                parse10header();
                setrates();
+               if (sessionrate < 44100 || sessionrate > 192000)
+                 return -1;
                parseaudio();
                parserest10();
        } else {
                // Should not occur
+               return -1;
        }
+       return 0;
 }
 
 void
index 1ae362d672798d091a5e18c03d32228e8cfc55bb..785544daa054e53ff851b4c0e6ddcb91c38e016b 100644 (file)
@@ -117,7 +117,7 @@ public:
 
 private:
        bool foundin(std::string haystack, std::string needle);
-       void parse(void);
+       int parse(void);
        void unxor10(void);
        void setrates(void);
        void parse5header(void);