Possible fix for http://tracker.ardour.org/view.php?id=6332
authorJohn Emmas <johne53@tiscali.co.uk>
Thu, 16 Jul 2015 11:45:49 +0000 (12:45 +0100)
committerRobin Gareus <robin@gareus.org>
Thu, 16 Jul 2015 16:27:52 +0000 (18:27 +0200)
For sfdb stuff, use glib file functions in preference to ANSI or libsndfile handling. On Windows, we need functions which understand UTF-8 (so that we'll be able to import sound files, even in a non-English locale).

gtk2_ardour/sfdb_ui.cc
libs/ardour/sndfileimportable.cc
libs/ardour/sndfilesource.cc

index 699627365080a2a1e4c7867cea290db7aaf2f92d..1ab1faa206844d1d7ac9b6274fba37f8dafaf275 100644 (file)
@@ -29,7 +29,6 @@
 
 #include <unistd.h>
 #include <limits.h>
-#include <sys/stat.h>
 
 #include <gtkmm/box.h>
 #include <gtkmm/stock.h>
@@ -1255,8 +1254,8 @@ SoundFileBrowser::get_paths ()
                vector<string>::iterator i;
 
                for (i = filenames.begin(); i != filenames.end(); ++i) {
-                       struct stat buf;
-                       if ((!stat((*i).c_str(), &buf)) && S_ISREG(buf.st_mode)) {
+                       GStatBuf buf;
+                       if ((!g_stat((*i).c_str(), &buf)) && S_ISREG(buf.st_mode)) {
                                results.push_back (*i);
                        }
                }
@@ -1590,7 +1589,7 @@ SoundFileOmega::check_link_status (const Session* s, const vector<string>& paths
        std::string tmpdir(Glib::build_filename (s->session_directory().sound_path(), "linktest"));
        bool ret = false;
 
-       if (mkdir (tmpdir.c_str(), 0744)) {
+       if (g_mkdir (tmpdir.c_str(), 0744)) {
                if (errno != EEXIST) {
                        return false;
                }
@@ -1614,7 +1613,7 @@ SoundFileOmega::check_link_status (const Session* s, const vector<string>& paths
        ret = true;
 
   out:
-       rmdir (tmpdir.c_str());
+       g_rmdir (tmpdir.c_str());
        return ret;
 #endif
 }
index 5ccab2c0d281ec6367e6bace74940180c9bbbda9..ffc894b2d4be61a9bb1c015f3c2d5c0fe56c6914 100644 (file)
@@ -24,6 +24,9 @@
 #include "pbd/error.h"
 #include "ardour/sndfileimportable.h"
 
+#include <fcntl.h>
+#include <glib/gstdio.h>
+
 using namespace ARDOUR;
 using namespace std;
 
@@ -67,8 +70,12 @@ SndFileImportableSource::get_timecode_info (SNDFILE* sf, SF_BROADCAST_INFO* binf
 
 SndFileImportableSource::SndFileImportableSource (const string& path)
 {
+       int fd;
+       if ((-1) == (fd = g_open (path.c_str(), O_RDONLY, 0664)))
+               throw failed_constructor();
+
        memset(&sf_info, 0 , sizeof(sf_info));
-       in.reset( sf_open(path.c_str(), SFM_READ, &sf_info), sf_close);
+       in.reset( sf_open_fd(fd, SFM_READ, &sf_info, true), sf_close);
        if (!in) throw failed_constructor();
 
        SF_BROADCAST_INFO binfo;
index 5acfe7b119246983cce6e02fe7856333853a29a4..ca2c41d582b5bf8199fe21d943b83666f251a6e7 100644 (file)
@@ -28,6 +28,8 @@
 
 #include <sys/stat.h>
 
+#include <glib/gstdio.h>
+
 #ifdef PLATFORM_WINDOWS
 #include <glibmm/convert.h>
 #endif
@@ -39,6 +41,8 @@
 #include "ardour/utils.h"
 #include "ardour/session.h"
 
+#include <fcntl.h>
+
 #include "i18n.h"
 
 using namespace std;
@@ -921,11 +925,17 @@ SndFileSource::get_soundfile_info (const string& path, SoundFileInfo& info, stri
        SNDFILE *sf;
        SF_INFO sf_info;
        BroadcastInfo binfo;
+       char errbuf[1024];
+       int  fd;
 
        sf_info.format = 0; // libsndfile says to clear this before sf_open().
 
-       if ((sf = sf_open (const_cast<char*>(path.c_str()), SFM_READ, &sf_info)) == 0) {
-               char errbuf[256];
+       if ((-1) == (fd = g_open (path.c_str(), O_RDONLY, 0664))) {
+               sprintf (errbuf, "SndFileSource::get_soundfile_info - cannot open file \"%s\"", path.c_str()); 
+               return false;
+       }
+
+       if ((sf = sf_open_fd (fd, SFM_READ, &sf_info, true)) == 0) { 
                error_msg = sf_error_str (0, errbuf, sizeof (errbuf) - 1);
                return false;
        }