2 Copyright (C) 2011 Tim Mayberry
3 Copyright (C) 2013 Paul Davis
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
25 #include "pbd/pathexpand.h"
27 #include "ardour/search_paths.h"
28 #include "ardour/directory_names.h"
29 #include "ardour/filesystem_paths.h"
31 #ifdef PLATFORM_WINDOWS
33 #include <shlobj.h> // CSIDL_*
34 #include "pbd/windows_special_dirs.h"
38 const char * const backend_env_variable_name = "ARDOUR_BACKEND_PATH";
39 const char * const surfaces_env_variable_name = "ARDOUR_SURFACES_PATH";
40 const char * const export_env_variable_name = "ARDOUR_EXPORT_FORMATS_PATH";
41 const char * const theme_env_variable_name = "ARDOUR_THEMES_PATH";
42 const char * const ladspa_env_variable_name = "LADSPA_PATH";
43 const char * const midi_patch_env_variable_name = "ARDOUR_MIDI_PATCH_PATH";
44 const char * const panner_env_variable_name = "ARDOUR_PANNER_PATH";
52 backend_search_path ()
54 Searchpath spath(user_config_directory ());
55 spath += ardour_dll_directory ();
56 spath.add_subdirectory_to_paths(backend_dir_name);
58 spath += Searchpath(Glib::getenv(backend_env_variable_name));
63 control_protocol_search_path ()
65 Searchpath spath(user_config_directory ());
66 spath += ardour_dll_directory ();
67 spath.add_subdirectory_to_paths (surfaces_dir_name);
69 spath += Searchpath(Glib::getenv(surfaces_env_variable_name));
76 Searchpath spath (ardour_data_search_path ());
77 spath.add_subdirectory_to_paths (theme_dir_name);
79 spath += Searchpath(Glib::getenv(theme_env_variable_name));
84 export_formats_search_path ()
86 Searchpath spath (ardour_data_search_path());
87 spath.add_subdirectory_to_paths (export_formats_dir_name);
89 bool export_formats_path_defined = false;
90 Searchpath spath_env (Glib::getenv(export_env_variable_name, export_formats_path_defined));
92 if (export_formats_path_defined) {
100 ladspa_search_path ()
102 Searchpath spath_env (Glib::getenv(ladspa_env_variable_name));
104 Searchpath spath (user_config_directory ());
106 spath += ardour_dll_directory ();
107 spath.add_subdirectory_to_paths (ladspa_dir_name);
109 #ifndef PLATFORM_WINDOWS
110 spath.push_back ("/usr/local/lib64/ladspa");
111 spath.push_back ("/usr/local/lib/ladspa");
112 spath.push_back ("/usr/lib64/ladspa");
113 spath.push_back ("/usr/lib/ladspa");
117 spath.push_back (path_expand ("~/Library/Audio/Plug-Ins/LADSPA"));
118 spath.push_back ("/Library/Audio/Plug-Ins/LADSPA");
121 return spath_env + spath;
125 lv2_bundled_search_path ()
127 Searchpath spath( ardour_dll_directory () );
128 spath.add_subdirectory_to_paths ("LV2");
134 midi_patch_search_path ()
136 Searchpath spath (ardour_data_search_path());
137 spath.add_subdirectory_to_paths(midi_patch_dir_name);
139 bool midi_patch_path_defined = false;
140 Searchpath spath_env (Glib::getenv(midi_patch_env_variable_name, midi_patch_path_defined));
142 if (midi_patch_path_defined) {
150 panner_search_path ()
152 Searchpath spath(user_config_directory ());
154 spath += ardour_dll_directory ();
155 spath.add_subdirectory_to_paths(panner_dir_name);
156 spath += Searchpath(Glib::getenv(panner_env_variable_name));
162 template_search_path ()
164 Searchpath spath (ardour_data_search_path());
165 spath.add_subdirectory_to_paths(templates_dir_name);
170 route_template_search_path ()
172 Searchpath spath (ardour_data_search_path());
173 spath.add_subdirectory_to_paths(route_templates_dir_name);
180 Searchpath spath (ardour_data_search_path());
181 spath.add_subdirectory_to_paths(lua_dir_name);
186 #ifdef PLATFORM_WINDOWS
191 DWORD dwType = REG_SZ;
193 DWORD dwSize = PATH_MAX;
196 char tmp[PATH_MAX+1];
198 if (ERROR_SUCCESS == RegOpenKeyExA (HKEY_CURRENT_USER, "Software\\VST", 0, KEY_READ, &hKey)) {
199 // Look for the user's VST Registry entry
200 if (ERROR_SUCCESS == RegQueryValueExA (hKey, "VSTPluginsPath", 0, &dwType, (LPBYTE)tmp, &dwSize))
201 p = g_build_filename (Glib::locale_to_utf8(tmp).c_str(), NULL);
207 if (ERROR_SUCCESS == RegOpenKeyExA (HKEY_LOCAL_MACHINE, "Software\\VST", 0, KEY_READ, &hKey))
209 // Look for a global VST Registry entry
210 if (ERROR_SUCCESS == RegQueryValueExA (hKey, "VSTPluginsPath", 0, &dwType, (LPBYTE)tmp, &dwSize))
211 p = g_build_filename (Glib::locale_to_utf8(tmp).c_str(), NULL);
218 #if ( (defined __i386__) || (defined _M_IX86) )
220 std::string pProgFilesX86 = PBD::get_win_special_folder_path (CSIDL_PROGRAM_FILESX86);
222 if (!pProgFilesX86.empty()) {
223 // Look for a VST folder under C:\Program Files (x86)
224 if ((pVSTx86 = g_build_filename (pProgFilesX86.c_str(), "Steinberg", "VSTPlugins", NULL)))
226 if (Glib::file_test (pVSTx86, Glib::FILE_TEST_EXISTS))
227 if (Glib::file_test (pVSTx86, Glib::FILE_TEST_IS_DIR))
228 p = g_build_filename (pVSTx86, NULL);
234 // Look for a VST folder under C:\Program Files
236 std::string pProgFiles = PBD::get_win_special_folder_path (CSIDL_PROGRAM_FILES);
238 if (!pProgFiles.empty()) {
239 if ((pVST = g_build_filename (pProgFiles.c_str(), "Steinberg", "VSTPlugins", NULL))) {
240 if (Glib::file_test (pVST, Glib::FILE_TEST_EXISTS))
241 if (Glib::file_test (pVST, Glib::FILE_TEST_IS_DIR))
242 p = g_build_filename (pVST, NULL);
251 // If all else failed, assume the plugins are under "My Documents"
252 user_home = (char*) g_get_user_special_dir (G_USER_DIRECTORY_DOCUMENTS);
254 p = g_build_filename (user_home, "Plugins", "VST", NULL);
256 user_home = g_build_filename(g_get_home_dir(), "My Documents", NULL);
258 p = g_build_filename (user_home, "Plugins", "VST", NULL);
261 // Concatenate the registry path with the user's personal path
262 user_home = (char*) g_get_user_special_dir (G_USER_DIRECTORY_DOCUMENTS);
265 p = g_build_path (";", p, g_build_filename(user_home, "Plugins", "VST", NULL), NULL);
267 user_home = g_build_filename(g_get_home_dir(), "My Documents", NULL);
270 p = g_build_path (";", p, g_build_filename (user_home, "Plugins", "VST", NULL), NULL);
280 /* Unix-like. Probably require some OS X specific breakdown if we ever add VST
281 * support on that platform.
287 return "/usr/local/lib/vst:/usr/lib/vst";
290 #endif // PLATFORM_WINDOWS
292 } // namespace ARDOUR