diff options
Diffstat (limited to 'libs')
-rw-r--r-- | libs/ardour/ardour/smf_source.h | 2 | ||||
-rw-r--r-- | libs/ardour/smf_source.cc | 18 |
2 files changed, 18 insertions, 2 deletions
diff --git a/libs/ardour/ardour/smf_source.h b/libs/ardour/ardour/smf_source.h index b94ffb250f..26437c6c24 100644 --- a/libs/ardour/ardour/smf_source.h +++ b/libs/ardour/ardour/smf_source.h @@ -45,7 +45,7 @@ public: virtual ~SMFSource (); - bool safe_file_extension (const std::string& path) const { + bool safe_file_extension (const std::string& path) const { return safe_midi_file_extension(path); } diff --git a/libs/ardour/smf_source.cc b/libs/ardour/smf_source.cc index e0462efb08..626676ea83 100644 --- a/libs/ardour/smf_source.cc +++ b/libs/ardour/smf_source.cc @@ -24,6 +24,7 @@ #include <sys/stat.h> #include <unistd.h> #include <errno.h> +#include <regex.h> #include "pbd/pathscanner.h" #include "pbd/stl_delete.h" @@ -449,7 +450,22 @@ SMFSource::mark_midi_streaming_write_completed (Evoral::Sequence<Evoral::Musical bool SMFSource::safe_midi_file_extension (const string& file) { - return (file.rfind(".mid") != string::npos) || (file.rfind (".MID") != string::npos); + static regex_t compiled_pattern; + static bool compile = true; + const int nmatches = 2; + regmatch_t matches[nmatches]; + + if (compile && regcomp (&compiled_pattern, "[mM][iI][dD]$", REG_EXTENDED)) { + return false; + } else { + compile = false; + } + + if (regexec (&compiled_pattern, file.c_str(), nmatches, matches, 0)) { + return false; + } + + return true; } void |