78814306cd956ec57b46eb13af5da306ef34abdc
[ardour.git] / libs / ardour / vst_search_path.cc
1 /*
2     Copyright (C) 2008 John Emmas
3
4     This program is free software; you can redistribute it and/or modify
5     it under the terms of the GNU General Public License as published by
6     the Free Software Foundation; either version 2 of the License, or
7     (at your option) any later version.
8
9     This program is distributed in the hope that it will be useful,
10     but WITHOUT ANY WARRANTY; without even the implied warranty of
11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12     GNU General Public License for more details.
13
14     You should have received a copy of the GNU General Public License
15     along with this program; if not, write to the Free Software
16     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17 */
18
19 #include <glib.h>
20 #include <glibmm.h>
21 #include <string.h>
22
23 #include "ardour/vst_search_path.h"
24
25 #ifdef PLATFORM_WINDOWS
26
27 #include "pbd/windows_special_dirs.h"
28
29 namespace ARDOUR {
30
31 const char*
32 vst_search_path ()
33 {
34         DWORD dwType = REG_SZ;  
35         HKEY hKey;
36         DWORD dwSize = PATH_MAX;  
37         char* p = 0;
38         char* user_home = 0;
39         char tmp[PATH_MAX+1];
40
41         if (ERROR_SUCCESS == RegOpenKeyExA (HKEY_CURRENT_USER, "Software\\VST", 0, KEY_READ, &hKey)) {
42                 // Look for the user's VST Registry entry
43                 if (ERROR_SUCCESS == RegQueryValueExA (hKey, "VSTPluginsPath", 0, &dwType, (LPBYTE)tmp, &dwSize)) {
44                         p = g_build_filename (Glib::locale_to_utf8(tmp).c_str(), 0);
45                 }
46                 RegCloseKey (hKey);
47                 
48                 if (p == 0) {
49                         if (ERROR_SUCCESS == RegOpenKeyExA (HKEY_LOCAL_MACHINE, "Software\\VST", 0, KEY_READ, &hKey)) {
50                                 // Look for a global VST Registry entry
51                                 if (ERROR_SUCCESS == RegQueryValueExA (hKey, "VSTPluginsPath", 0, &dwType, (LPBYTE)tmp, &dwSize))
52                                         p = g_build_filename (Glib::locale_to_utf8(tmp).c_str(), 0);
53                                 
54                                 RegCloseKey (hKey);
55                         }
56                         
57                         if (p == 0) {
58                                 char *pVSTx86 = 0;
59                                 char *pProgFilesX86 = get_win_special_folder (CSIDL_PROGRAM_FILESX86);
60                                 
61                                 if (pProgFilesX86) {
62                                         // Look for a VST folder under C:\Program Files (x86)
63                                         if (pVSTx86 = g_build_filename (pProgFilesX86, "Steinberg", "VSTPlugins", 0)) {
64                                                 if (Glib::file_test (pVSTx86, Glib::FILE_TEST_EXISTS))
65                                                         if (Glib::file_test (pVSTx86, Glib::FILE_TEST_IS_DIR))
66                                                                 p = g_build_filename (pVSTx86, 0);
67                                                 
68                                                 g_free (pVSTx86);
69                                         }
70                                         
71                                         g_free (pProgFilesX86);
72                                 }
73                         }
74
75                         if (p == 0) {
76                                 // Look for a VST folder under C:\Program Files
77                                 char *pVST = 0;
78                                 char *pProgFiles = get_win_special_folder (CSIDL_PROGRAM_FILES);
79                                 
80                                 if (pProgFiles) {
81                                         if (pVST = g_build_filename (pProgFiles, "Steinberg", "VSTPlugins", 0)) {
82                                                 if (Glib::file_test (pVST, Glib::FILE_TEST_EXISTS))
83                                                         if (Glib::file_test (pVST, Glib::FILE_TEST_IS_DIR))
84                                                                 p = g_build_filename (pVST, 0);
85                                                 g_free (pVST);
86                                         }
87                                         
88                                         g_free (pProgFiles);
89                                 }
90                         }
91                 }
92                 
93                 if (p == 0) {
94                         // If all else failed, assume the plugins are under "My Documents"
95                         user_home = g_get_user_special_dir (G_USER_DIRECTORY_DOCUMENTS);
96                         if (user_home) {
97                                 p = g_build_filename (user_home, "Plugins", "VST", 0);
98                         } else {
99                                 user_home = g_build_filename(g_get_home_dir(), "My Documents", 0);
100                                 if (user_home)
101                                         p = g_build_filename (user_home, "Plugins", "VST", 0);
102                         }
103                 } else {
104                         // Concatenate the registry path with the user's personal path
105
106                         user_home = g_get_user_special_dir (G_USER_DIRECTORY_DOCUMENTS);
107                         
108                         if (user_home) {
109                                 p = g_build_path (";", p, g_build_filename(user_home, "Plugins", "VST", 0), 0);
110                         } else {
111                                 user_home = g_build_filename(g_get_home_dir(), "My Documents", 0);
112                                 if (user_home) {
113                                         p = g_build_path (";", p, g_build_filename (user_home, "Plugins", "VST", 0), 0);
114                                 }
115                         }
116                 }
117         }
118
119         return p;
120 }
121
122 }  // namespace ARDOUR
123
124 #else 
125
126 /* Unix-like. Probably require some OS X specific breakdown if we ever add VST
127  * support on that platform.
128  */
129
130 namespace ARDOUR {
131
132 const char *
133 vst_search_path ()
134 {
135         return "/usr/local/lib/vst:/usr/lib/vst";
136 }
137
138 } // namespace ARDOUR
139
140 #endif /* PLATFORM_WINDOWS */
141