Fix portability of Session::source_search_path
This commit is contained in:
parent
f08d9591e6
commit
43f7813b24
|
@ -288,7 +288,7 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir)
|
|||
|
||||
/* and ambiguous files */
|
||||
|
||||
ARDOUR::FileSource::AmbiguousFileName.connect_same_thread (forever_connections, boost::bind (&ARDOUR_UI::ambiguous_file, this, _1, _2, _3));
|
||||
ARDOUR::FileSource::AmbiguousFileName.connect_same_thread (forever_connections, boost::bind (&ARDOUR_UI::ambiguous_file, this, _1, _2));
|
||||
|
||||
/* lets get this party started */
|
||||
|
||||
|
@ -4050,7 +4050,7 @@ ARDOUR_UI::missing_file (Session*s, std::string str, DataType type)
|
|||
}
|
||||
|
||||
int
|
||||
ARDOUR_UI::ambiguous_file (std::string file, std::string /*path*/, std::vector<std::string> hits)
|
||||
ARDOUR_UI::ambiguous_file (std::string file, std::vector<std::string> hits)
|
||||
{
|
||||
AmbiguousFileDialog dialog (file, hits);
|
||||
|
||||
|
|
|
@ -713,7 +713,7 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr
|
|||
void fontconfig_dialog ();
|
||||
|
||||
int missing_file (ARDOUR::Session*s, std::string str, ARDOUR::DataType type);
|
||||
int ambiguous_file (std::string file, std::string path, std::vector<std::string> hits);
|
||||
int ambiguous_file (std::string file, std::vector<std::string> hits);
|
||||
|
||||
bool click_button_clicked (GdkEventButton *);
|
||||
|
||||
|
|
|
@ -19,12 +19,17 @@
|
|||
#include "pbd/compose.h"
|
||||
#include "pbd/replace_all.h"
|
||||
#include "pbd/strsplit.h"
|
||||
#include "pbd/search_path.h"
|
||||
|
||||
#include "ardour/session.h"
|
||||
|
||||
#include "missing_file_dialog.h"
|
||||
#include "i18n.h"
|
||||
|
||||
#ifdef SearchPath
|
||||
#undef SearchPath
|
||||
#endif
|
||||
|
||||
using namespace Gtk;
|
||||
using namespace std;
|
||||
using namespace ARDOUR;
|
||||
|
@ -56,14 +61,18 @@ MissingFileDialog::MissingFileDialog (Session* s, const std::string& path, DataT
|
|||
break;
|
||||
}
|
||||
|
||||
string dirstr;
|
||||
vector<string> source_dirs = s->source_search_path (type);
|
||||
vector<string>::iterator i = source_dirs.begin();
|
||||
ostringstream oss;
|
||||
oss << *i << endl;
|
||||
|
||||
dirstr = s->source_search_path (type);
|
||||
replace_all (dirstr, ":", "\n");
|
||||
while (++i != source_dirs.end()) {
|
||||
oss << *i << endl;
|
||||
}
|
||||
|
||||
msg.set_justify (JUSTIFY_CENTER);
|
||||
msg.set_markup (string_compose (_("%1 cannot find the %2 file\n\n<i>%3</i>\n\nin any of these folders:\n\n\
|
||||
<tt>%4</tt>\n\n"), PROGRAM_NAME, typestr, Glib::Markup::escape_text(path), Glib::Markup::escape_text (dirstr)));
|
||||
<tt>%4</tt>\n\n"), PROGRAM_NAME, typestr, Glib::Markup::escape_text(path), Glib::Markup::escape_text (oss.str())));
|
||||
|
||||
HBox* hbox = manage (new HBox);
|
||||
hbox->pack_start (msg, false, true);
|
||||
|
|
|
@ -79,7 +79,7 @@ public:
|
|||
|
||||
virtual void set_path (const std::string&);
|
||||
|
||||
static PBD::Signal3<int,std::string,std::string,std::vector<std::string> > AmbiguousFileName;
|
||||
static PBD::Signal2<int,std::string,std::vector<std::string> > AmbiguousFileName;
|
||||
|
||||
protected:
|
||||
FileSource (Session& session, DataType type,
|
||||
|
|
|
@ -820,7 +820,7 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi
|
|||
void request_resume_timecode_transmission ();
|
||||
bool timecode_transmission_suspended () const;
|
||||
|
||||
std::string source_search_path(DataType) const;
|
||||
std::vector<std::string> source_search_path(DataType) const;
|
||||
void ensure_search_path_includes (const std::string& path, DataType type);
|
||||
|
||||
std::list<std::string> unknown_processors () const;
|
||||
|
|
|
@ -51,7 +51,7 @@ using namespace ARDOUR;
|
|||
using namespace PBD;
|
||||
using namespace Glib;
|
||||
|
||||
PBD::Signal3<int,std::string,std::string,std::vector<std::string> > FileSource::AmbiguousFileName;
|
||||
PBD::Signal2<int,std::string,std::vector<std::string> > FileSource::AmbiguousFileName;
|
||||
|
||||
FileSource::FileSource (Session& session, DataType type, const string& path, const string& origin, Source::Flag flag)
|
||||
: Source(session, type, path, flag)
|
||||
|
@ -240,19 +240,15 @@ FileSource::find (Session& s, DataType type, const string& path, bool must_exist
|
|||
isnew = false;
|
||||
|
||||
if (!Glib::path_is_absolute (path)) {
|
||||
vector<string> dirs;
|
||||
vector<string> hits;
|
||||
string fullpath;
|
||||
std::vector<std::string> dirs = s.source_search_path (type);
|
||||
|
||||
string search_path = s.source_search_path (type);
|
||||
|
||||
if (search_path.length() == 0) {
|
||||
if (dirs.size() == 0) {
|
||||
error << _("FileSource: search path not set") << endmsg;
|
||||
goto out;
|
||||
}
|
||||
|
||||
split (search_path, dirs, ':');
|
||||
|
||||
hits.clear ();
|
||||
|
||||
for (vector<string>::iterator i = dirs.begin(); i != dirs.end(); ++i) {
|
||||
|
@ -296,7 +292,7 @@ FileSource::find (Session& s, DataType type, const string& path, bool must_exist
|
|||
|
||||
/* more than one match: ask the user */
|
||||
|
||||
int which = FileSource::AmbiguousFileName (path, search_path, de_duped_hits).get_value_or (-1);
|
||||
int which = FileSource::AmbiguousFileName (path, de_duped_hits).get_value_or (-1);
|
||||
|
||||
if (which < 0) {
|
||||
goto out;
|
||||
|
@ -310,8 +306,7 @@ FileSource::find (Session& s, DataType type, const string& path, bool must_exist
|
|||
|
||||
if (must_exist) {
|
||||
error << string_compose(
|
||||
_("Filesource: cannot find required file (%1): while searching %2"),
|
||||
path, search_path) << endmsg;
|
||||
_("Filesource: cannot find required file (%1)"), path) << endmsg;
|
||||
goto out;
|
||||
} else {
|
||||
isnew = true;
|
||||
|
@ -357,8 +352,6 @@ bool
|
|||
FileSource::find_2X (Session& s, DataType type, const string& path, bool must_exist,
|
||||
bool& isnew, uint16_t& chan, string& found_path)
|
||||
{
|
||||
string search_path = s.source_search_path (type);
|
||||
|
||||
string pathstr = path;
|
||||
string::size_type pos;
|
||||
bool ret = false;
|
||||
|
@ -369,18 +362,17 @@ FileSource::find_2X (Session& s, DataType type, const string& path, bool must_ex
|
|||
|
||||
/* non-absolute pathname: find pathstr in search path */
|
||||
|
||||
vector<string> dirs;
|
||||
vector<string> dirs = s.source_search_path (type);
|
||||
|
||||
int cnt;
|
||||
string fullpath;
|
||||
string keeppath;
|
||||
|
||||
if (search_path.length() == 0) {
|
||||
if (dirs.size() == 0) {
|
||||
error << _("FileSource: search path not set") << endmsg;
|
||||
goto out;
|
||||
}
|
||||
|
||||
split (search_path, dirs, ':');
|
||||
|
||||
cnt = 0;
|
||||
|
||||
for (vector<string>::iterator i = dirs.begin(); i != dirs.end(); ++i) {
|
||||
|
@ -437,16 +429,15 @@ FileSource::find_2X (Session& s, DataType type, const string& path, bool must_ex
|
|||
if (cnt > 1) {
|
||||
|
||||
error << string_compose (
|
||||
_("FileSource: \"%1\" is ambigous when searching %2\n\t"),
|
||||
pathstr, search_path) << endmsg;
|
||||
_("FileSource: \"%1\" is ambigous when searching\n\t"), pathstr) << endmsg;
|
||||
goto out;
|
||||
|
||||
} else if (cnt == 0) {
|
||||
|
||||
if (must_exist) {
|
||||
error << string_compose(
|
||||
_("Filesource: cannot find required file (%1): while searching %2"),
|
||||
pathstr, search_path) << endmsg;
|
||||
_("Filesource: cannot find required file (%1): while searching")
|
||||
, pathstr) << endmsg;
|
||||
goto out;
|
||||
} else {
|
||||
isnew = true;
|
||||
|
|
|
@ -44,8 +44,8 @@
|
|||
#include "pbd/stacktrace.h"
|
||||
#include "pbd/file_utils.h"
|
||||
#include "pbd/convert.h"
|
||||
#include "pbd/strsplit.h"
|
||||
#include "pbd/unwind.h"
|
||||
#include "pbd/search_path.h"
|
||||
|
||||
#include "ardour/amp.h"
|
||||
#include "ardour/analyser.h"
|
||||
|
@ -94,6 +94,10 @@
|
|||
|
||||
#include "i18n.h"
|
||||
|
||||
#ifdef SearchPath
|
||||
#undef SearchPath
|
||||
#endif
|
||||
|
||||
namespace ARDOUR {
|
||||
class MidiSource;
|
||||
class Processor;
|
||||
|
@ -4420,18 +4424,18 @@ Session::end_time_changed (framepos_t old)
|
|||
}
|
||||
}
|
||||
|
||||
string
|
||||
std::vector<std::string>
|
||||
Session::source_search_path (DataType type) const
|
||||
{
|
||||
vector<string> s;
|
||||
SearchPath sp;
|
||||
|
||||
if (session_dirs.size() == 1) {
|
||||
switch (type) {
|
||||
case DataType::AUDIO:
|
||||
s.push_back (_session_dir->sound_path());
|
||||
sp.push_back (_session_dir->sound_path());
|
||||
break;
|
||||
case DataType::MIDI:
|
||||
s.push_back (_session_dir->midi_path());
|
||||
sp.push_back (_session_dir->midi_path());
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
|
@ -4439,10 +4443,10 @@ Session::source_search_path (DataType type) const
|
|||
SessionDirectory sdir (i->path);
|
||||
switch (type) {
|
||||
case DataType::AUDIO:
|
||||
s.push_back (sdir.sound_path());
|
||||
sp.push_back (sdir.sound_path());
|
||||
break;
|
||||
case DataType::MIDI:
|
||||
s.push_back (sdir.midi_path());
|
||||
sp.push_back (sdir.midi_path());
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -4451,49 +4455,30 @@ Session::source_search_path (DataType type) const
|
|||
if (type == DataType::AUDIO) {
|
||||
const string sound_path_2X = _session_dir->sound_path_2X();
|
||||
if (Glib::file_test (sound_path_2X, Glib::FILE_TEST_EXISTS|Glib::FILE_TEST_IS_DIR)) {
|
||||
if (find (s.begin(), s.end(), sound_path_2X) == s.end()) {
|
||||
s.push_back (sound_path_2X);
|
||||
if (find (sp.begin(), sp.end(), sound_path_2X) == sp.end()) {
|
||||
sp.push_back (sound_path_2X);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* now check the explicit (possibly user-specified) search path
|
||||
*/
|
||||
|
||||
vector<string> dirs;
|
||||
// now check the explicit (possibly user-specified) search path
|
||||
|
||||
switch (type) {
|
||||
case DataType::AUDIO:
|
||||
split (config.get_audio_search_path (), dirs, ':');
|
||||
sp += SearchPath(config.get_audio_search_path ());
|
||||
break;
|
||||
case DataType::MIDI:
|
||||
split (config.get_midi_search_path (), dirs, ':');
|
||||
sp += SearchPath(config.get_midi_search_path ());
|
||||
break;
|
||||
}
|
||||
|
||||
for (vector<string>::iterator i = dirs.begin(); i != dirs.end(); ++i) {
|
||||
if (find (s.begin(), s.end(), *i) == s.end()) {
|
||||
s.push_back (*i);
|
||||
}
|
||||
}
|
||||
|
||||
string search_path;
|
||||
|
||||
for (vector<string>::iterator si = s.begin(); si != s.end(); ++si) {
|
||||
if (!search_path.empty()) {
|
||||
search_path += ':';
|
||||
}
|
||||
search_path += *si;
|
||||
}
|
||||
|
||||
return search_path;
|
||||
return sp;
|
||||
}
|
||||
|
||||
void
|
||||
Session::ensure_search_path_includes (const string& path, DataType type)
|
||||
{
|
||||
string search_path;
|
||||
vector<string> dirs;
|
||||
SearchPath sp;
|
||||
|
||||
if (path == ".") {
|
||||
return;
|
||||
|
@ -4501,16 +4486,14 @@ Session::ensure_search_path_includes (const string& path, DataType type)
|
|||
|
||||
switch (type) {
|
||||
case DataType::AUDIO:
|
||||
search_path = config.get_audio_search_path ();
|
||||
sp += SearchPath(config.get_audio_search_path ());
|
||||
break;
|
||||
case DataType::MIDI:
|
||||
search_path = config.get_midi_search_path ();
|
||||
sp += SearchPath (config.get_midi_search_path ());
|
||||
break;
|
||||
}
|
||||
|
||||
split (search_path, dirs, ':');
|
||||
|
||||
for (vector<string>::iterator i = dirs.begin(); i != dirs.end(); ++i) {
|
||||
for (vector<std::string>::iterator i = sp.begin(); i != sp.end(); ++i) {
|
||||
/* No need to add this new directory if it has the same inode as
|
||||
an existing one; checking inode rather than name prevents duplicated
|
||||
directories when we are using symlinks.
|
||||
|
@ -4522,18 +4505,14 @@ Session::ensure_search_path_includes (const string& path, DataType type)
|
|||
}
|
||||
}
|
||||
|
||||
if (!search_path.empty()) {
|
||||
search_path += ':';
|
||||
}
|
||||
|
||||
search_path += path;
|
||||
sp += path;
|
||||
|
||||
switch (type) {
|
||||
case DataType::AUDIO:
|
||||
config.set_audio_search_path (search_path);
|
||||
config.set_audio_search_path (sp.to_string());
|
||||
break;
|
||||
case DataType::MIDI:
|
||||
config.set_midi_search_path (search_path);
|
||||
config.set_midi_search_path (sp.to_string());
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue