2 Copyright (C) 2001-2007 Paul Davis
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.
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.
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.
23 #include <sigc++/bind.h>
24 #include <gtkmm/settings.h>
25 #include <glibmm/ustring.h>
27 #include <pbd/error.h>
28 #include <pbd/textreceiver.h>
29 #include <pbd/failed_constructor.h>
30 #include <pbd/pthread_utils.h>
32 #include <jack/jack.h>
34 #include <ardour/version.h>
35 #include <ardour/ardour.h>
36 #include <ardour/audioengine.h>
38 #include <gtkmm/main.h>
39 #include <gtkmm2ext/popup.h>
40 #include <gtkmm2ext/utils.h>
42 #include "svn_revision.h"
44 #include "ardour_ui.h"
51 using namespace ARDOUR_COMMAND_LINE;
52 using namespace ARDOUR;
56 TextReceiver text_receiver ("ardour");
58 extern int curvetest (string);
60 static ARDOUR_UI *ui = 0;
61 static const char* localedir = LOCALEDIR;
65 #include <mach-o/dyld.h>
66 #include <sys/param.h>
70 fixup_bundle_environment ()
72 if (!getenv ("ARDOUR_BUNDLED")) {
76 char execpath[MAXPATHLEN+1];
77 uint32_t pathsz = sizeof (execpath);
79 _NSGetExecutablePath (execpath, &pathsz);
81 Glib::ustring exec_path (execpath);
82 Glib::ustring dir_path = Glib::path_get_dirname (exec_path);
84 const char *cstr = getenv ("PATH");
86 /* ensure that we find any bundled executables (e.g. JACK),
87 and find them before any instances of the same name
96 setenv ("PATH", path.c_str(), 1);
99 path += "/../Resources";
101 path += "/../Resources/Surfaces";
103 path += "/../Resources/Panners";
105 setenv ("ARDOUR_MODULE_PATH", path.c_str(), 1);
108 path += "/../Resources/icons:";
110 path += "/../Resources/pixmaps:";
112 path += "/../Resources/share:";
114 path += "/../Resources";
116 setenv ("ARDOUR_PATH", path.c_str(), 1);
117 setenv ("ARDOUR_CONFIG_PATH", path.c_str(), 1);
118 setenv ("ARDOUR_DATA_PATH", path.c_str(), 1);
120 cstr = getenv ("LADSPA_PATH");
128 path += "/../Plugins";
130 setenv ("LADSPA_PATH", path.c_str(), 1);
132 cstr = getenv ("VAMP_PATH");
140 path += "/../Frameworks";
142 setenv ("VAMP_PATH", path.c_str(), 1);
144 cstr = getenv ("ARDOUR_CONTROL_SURFACE_PATH");
152 path += "/../Surfaces";
154 setenv ("ARDOUR_CONTROL_SURFACE_PATH", path.c_str(), 1);
156 cstr = getenv ("LV2_PATH");
164 path += "/../Plugins";
166 setenv ("LV2_PATH", path.c_str(), 1);
169 path += "/../Frameworks/clearlooks";
171 setenv ("GTK_PATH", path.c_str(), 1);
174 path += "/../Resources/locale";
176 localedir = strdup (path.c_str());
178 /* write a pango.rc file and tell pango to use it. we'd love
179 to put this into the Ardour.app bundle and leave it there,
180 but the user may not have write permission. so ...
182 we also have to make sure that the user ardour directory
186 if (g_mkdir_with_parents (ARDOUR::get_user_ardour_path().c_str(), 0755) < 0) {
187 error << string_compose (_("cannot create user ardour folder %1 (%2)"), ARDOUR::get_user_ardour_path(), strerror (errno))
191 path = Glib::build_filename (ARDOUR::get_user_ardour_path(), "pango.rc");
193 std::ofstream pangorc (path.c_str());
195 error << string_compose (_("cannot open pango.rc file %1") , path) << endmsg;
197 pangorc << "[Pango]\nModuleFiles=";
201 mpath += "/../Resources/pango.modules";
203 pangorc << mpath << endl;
206 setenv ("PANGO_RC_FILE", path.c_str(), 1);
210 // gettext charset aliases
212 setenv ("CHARSETALIASDIR", path.c_str(), 1);
217 path += "/../Resources/fonts.conf";
219 setenv ("FONTCONFIG_FILE", path.c_str(), 1);
221 // GDK Pixbuf loader module file
224 path += "/../Resources/gdk-pixbuf.loaders";
226 setenv ("GDK_PIXBUF_MODULE_FILE", path.c_str(), 1);
227 cerr << "Set GDK_PIXBUF_MODULE_FILE to " << path << endl;
229 if (getenv ("ARDOUR_WITH_JACK")) {
233 path += "/../Frameworks";
235 setenv ("JACK_DRIVER_DIR", path.c_str(), 1);
242 sigpipe_handler (int sig)
244 cerr << _("SIGPIPE received - JACK has probably died") << endl;
248 /* this is called from the entry point of a wine-compiled
249 executable that is linked against gtk2_ardour built
253 int ardour_main (int argc, char *argv[])
255 int main (int argc, char* argv[])
258 vector<Glib::ustring> null_file_list;
261 fixup_bundle_environment ();
267 (void) bindtextdomain (PACKAGE, localedir);
268 /* our i18n translations are all in UTF-8, so make sure
269 that even if the user locale doesn't specify UTF-8,
270 we use that when handling them.
272 (void) bind_textdomain_codeset (PACKAGE,"UTF-8");
273 (void) textdomain (PACKAGE);
275 pthread_setcanceltype (PTHREAD_CANCEL_ASYNCHRONOUS, 0);
277 // catch error message system signals ();
279 text_receiver.listen_to (error);
280 text_receiver.listen_to (info);
281 text_receiver.listen_to (fatal);
282 text_receiver.listen_to (warning);
284 if (parse_opts (argc, argv)) {
288 if (curvetest_file) {
289 return curvetest (curvetest_file);
292 cout << _("Ardour/GTK ")
294 << _("\n (built using ")
295 << ardour_svn_revision
297 << _(" and GCC version ") << __VERSION__
307 cerr << _("Copyright (C) 1999-2008 Paul Davis") << endl
308 << _("Some portions Copyright (C) Steve Harris, Ari Johnson, Brett Viren, Joel Baker") << endl
310 << _("Ardour comes with ABSOLUTELY NO WARRANTY") << endl
311 << _("not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.") << endl
312 << _("This is free software, and you are welcome to redistribute it ") << endl
313 << _("under certain conditions; see the source for copying conditions.")
317 /* some GUI objects need this */
321 if (::signal (SIGPIPE, sigpipe_handler)) {
322 cerr << _("Cannot install SIGPIPE error handler") << endl;
326 ui = new ARDOUR_UI (&argc, &argv);
327 } catch (failed_constructor& err) {
328 error << _("could not create ARDOUR GUI") << endmsg;
332 ui->run (text_receiver);
336 pthread_cancel_all ();
340 } // end of extern C block