reworked variant of john’s soundfile locale fix
authorRobin Gareus <robin@gareus.org>
Fri, 17 Jul 2015 14:03:24 +0000 (16:03 +0200)
committerRobin Gareus <robin@gareus.org>
Fri, 17 Jul 2015 14:03:24 +0000 (16:03 +0200)
see 87b89a6

IMPORTANT NOTE: In theory, the correct glibmm function should have been Glib::filename_from_utf8() but I couldn't make that work on Windows and
ended up using Glib::locale_from_utf8() instead. sfdb import will therefore
need to get re-tested on the other platforms (especially in a non-English locale).

If this fix doesn't work we should probably revert to the previous strategy
but using the global specifier "::g_open()" explicitly…
… and only on PLATFORM_WINDOWS  (POSIX #define g_open open) fails regardless.

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..040771b1439a362bbbffc0d83c75ac77287d4c25 100644 (file)
@@ -24,6 +24,8 @@
 #include "pbd/error.h"
 #include "ardour/sndfileimportable.h"
 
+#include <glibmm/convert.h>
+
 using namespace ARDOUR;
 using namespace std;
 
@@ -68,7 +70,7 @@ SndFileImportableSource::get_timecode_info (SNDFILE* sf, SF_BROADCAST_INFO* binf
 SndFileImportableSource::SndFileImportableSource (const string& path)
 {
        memset(&sf_info, 0 , sizeof(sf_info));
-       in.reset( sf_open(path.c_str(), SFM_READ, &sf_info), sf_close);
+       in.reset( sf_open(Glib::locale_from_utf8(path).c_str(), SFM_READ, &sf_info), sf_close);
        if (!in) throw failed_constructor();
 
        SF_BROADCAST_INFO binfo;
index 5acfe7b119246983cce6e02fe7856333853a29a4..07e189618e4b59e864be64640ed2ca060da3f03e 100644 (file)
@@ -28,9 +28,7 @@
 
 #include <sys/stat.h>
 
-#ifdef PLATFORM_WINDOWS
 #include <glibmm/convert.h>
-#endif
 #include <glibmm/fileutils.h>
 #include <glibmm/miscutils.h>
 
@@ -924,8 +922,8 @@ SndFileSource::get_soundfile_info (const string& path, SoundFileInfo& info, stri
 
        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 ((sf = sf_open (const_cast<char*>(Glib::locale_from_utf8(path).c_str()), SFM_READ, &sf_info)) == 0) {
+               char errbuf[1024];
                error_msg = sf_error_str (0, errbuf, sizeof (errbuf) - 1);
                return false;
        }