From 6796e1fd563b0ad132c55e72812f64538406552f Mon Sep 17 00:00:00 2001 From: Damien Zammit Date: Sat, 16 Apr 2016 16:31:44 +1000 Subject: ptformat: Make PT import more resilient to bad user choices and display messages 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 --- gtk2_ardour/editor_pt_import.cc | 11 +++++++++++ libs/ptformat/ptfformat.cc | 21 +++++++++++++++++++-- libs/ptformat/ptfformat.h | 2 +- 3 files changed, 31 insertions(+), 3 deletions(-) diff --git a/gtk2_ardour/editor_pt_import.cc b/gtk2_ardour/editor_pt_import.cc index 15723c3b27..3639fcf877 100644 --- a/gtk2_ardour/editor_pt_import.cc +++ b/gtk2_ardour/editor_pt_import.cc @@ -121,6 +121,7 @@ Editor::do_ptimport (std::string ptpath, vector 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::iterator a = ptf.regions.begin(); a != ptf.regions.end(); ++a) { for (vector::iterator p = ptfwavpair.begin(); diff --git a/libs/ptformat/ptfformat.cc b/libs/ptformat/ptfformat.cc index 048c174918..8c3452c868 100644 --- a/libs/ptformat/ptfformat.cc +++ b/libs/ptformat/ptfformat.cc @@ -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 diff --git a/libs/ptformat/ptfformat.h b/libs/ptformat/ptfformat.h index 1ae362d672..785544daa0 100644 --- a/libs/ptformat/ptfformat.h +++ b/libs/ptformat/ptfformat.h @@ -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); -- cgit v1.2.3