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/svn_revision.h>
35 #include <ardour/version.h>
36 #include <ardour/ardour.h>
37 #include <ardour/audioengine.h>
39 #include <gtkmm/main.h>
40 #include <gtkmm2ext/popup.h>
41 #include <gtkmm2ext/utils.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);
121 path += "/../Resources";
122 setenv ("ARDOUR_INSTANT_XML_PATH", path.c_str(), 1);
124 cstr = getenv ("LADSPA_PATH");
132 path += "/../Plugins";
134 setenv ("LADSPA_PATH", path.c_str(), 1);
136 cstr = getenv ("VAMP_PATH");
144 path += "/../Frameworks";
146 setenv ("VAMP_PATH", path.c_str(), 1);
148 cstr = getenv ("ARDOUR_CONTROL_SURFACE_PATH");
156 path += "/../Surfaces";
158 setenv ("ARDOUR_CONTROL_SURFACE_PATH", path.c_str(), 1);
160 cstr = getenv ("LV2_PATH");
168 path += "/../Plugins";
170 setenv ("LV2_PATH", path.c_str(), 1);
173 path += "/../Frameworks/clearlooks";
175 setenv ("GTK_PATH", path.c_str(), 1);
178 path += "/../Resources/locale";
180 localedir = strdup (path.c_str());
182 /* write a pango.rc file and tell pango to use it. we'd love
183 to put this into the Ardour.app bundle and leave it there,
184 but the user may not have write permission. so ...
186 we also have to make sure that the user ardour directory
190 if (g_mkdir_with_parents (ARDOUR::get_user_ardour_path().c_str(), 0755) < 0) {
191 error << string_compose (_("cannot create user ardour folder %1 (%2)"), ARDOUR::get_user_ardour_path(), strerror (errno))
195 path = Glib::build_filename (ARDOUR::get_user_ardour_path(), "pango.rc");
197 std::ofstream pangorc (path.c_str());
199 error << string_compose (_("cannot open pango.rc file %1") , path) << endmsg;
201 pangorc << "[Pango]\nModuleFiles=";
205 mpath += "/../Resources/pango.modules";
207 pangorc << mpath << endl;
210 setenv ("PANGO_RC_FILE", path.c_str(), 1);
214 // gettext charset aliases
216 setenv ("CHARSETALIASDIR", path.c_str(), 1);
221 path += "/../Resources/fonts.conf";
223 setenv ("FONTCONFIG_FILE", path.c_str(), 1);
225 // GDK Pixbuf loader module file
228 path += "/../Resources/gdk-pixbuf.loaders";
230 setenv ("GDK_PIXBUF_MODULE_FILE", path.c_str(), 1);
231 cerr << "Set GDK_PIXBUF_MODULE_FILE to " << path << endl;
233 if (getenv ("ARDOUR_WITH_JACK")) {
237 path += "/../Frameworks";
239 setenv ("JACK_DRIVER_DIR", path.c_str(), 1);
246 sigpipe_handler (int sig)
248 cerr << _("SIGPIPE received - JACK has probably died") << endl;
252 /* this is called from the entry point of a wine-compiled
253 executable that is linked against gtk2_ardour built
257 int ardour_main (int argc, char *argv[])
259 int main (int argc, char* argv[])
262 vector<Glib::ustring> null_file_list;
265 fixup_bundle_environment ();
271 (void) bindtextdomain (PACKAGE, localedir);
272 /* our i18n translations are all in UTF-8, so make sure
273 that even if the user locale doesn't specify UTF-8,
274 we use that when handling them.
276 (void) bind_textdomain_codeset (PACKAGE,"UTF-8");
277 (void) textdomain (PACKAGE);
279 pthread_setcanceltype (PTHREAD_CANCEL_ASYNCHRONOUS, 0);
281 // catch error message system signals ();
283 text_receiver.listen_to (error);
284 text_receiver.listen_to (info);
285 text_receiver.listen_to (fatal);
286 text_receiver.listen_to (warning);
288 if (parse_opts (argc, argv)) {
292 if (curvetest_file) {
293 return curvetest (curvetest_file);
296 cout << _("Ardour/GTK ")
298 << _("\n (built using ")
301 << _(" and GCC version ") << __VERSION__
311 cerr << _("Copyright (C) 1999-2008 Paul Davis") << endl
312 << _("Some portions Copyright (C) Steve Harris, Ari Johnson, Brett Viren, Joel Baker") << endl
314 << _("Ardour comes with ABSOLUTELY NO WARRANTY") << endl
315 << _("not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.") << endl
316 << _("This is free software, and you are welcome to redistribute it ") << endl
317 << _("under certain conditions; see the source for copying conditions.")
321 /* some GUI objects need this */
325 if (::signal (SIGPIPE, sigpipe_handler)) {
326 cerr << _("Cannot install SIGPIPE error handler") << endl;
330 ui = new ARDOUR_UI (&argc, &argv);
331 } catch (failed_constructor& err) {
332 error << _("could not create ARDOUR GUI") << endmsg;
336 ui->run (text_receiver);
340 pthread_cancel_all ();
344 } // end of extern C block