2 Copyright (C) 2000 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.
20 #include "libardour-config.h"
27 #include <cstdio> // Needed so that libraptor (included in lrdf) won't complain
30 #include <sys/types.h>
32 #ifndef PLATFORM_WINDOWS
33 #include <sys/resource.h>
41 #include "pbd/gstdio_compat.h"
43 #ifdef PLATFORM_WINDOWS
44 #include <stdio.h> // for _setmaxstdio
45 #include <windows.h> // for LARGE_INTEGER
48 #ifdef WINDOWS_VST_SUPPORT
53 #include "ardour/linux_vst_support.h"
56 #ifdef AUDIOUNIT_SUPPORT
57 #include "ardour/audio_unit.h"
60 #if defined(__SSE__) || defined(USE_XMMINTRIN)
61 #include <xmmintrin.h>
65 #undef check /* stupid Apple and their un-namespaced, generic Carbon macros */
68 #include <glibmm/fileutils.h>
69 #include <glibmm/miscutils.h>
76 #include "pbd/error.h"
79 #include "pbd/strsplit.h"
81 #include "pbd/file_utils.h"
82 #include "pbd/enumwriter.h"
84 #include "midi++/port.h"
85 #include "midi++/mmc.h"
87 #include "LuaBridge/LuaBridge.h"
89 #include "ardour/analyser.h"
90 #include "ardour/audio_library.h"
91 #include "ardour/audio_backend.h"
92 #include "ardour/audioengine.h"
93 #include "ardour/audioplaylist.h"
94 #include "ardour/audioregion.h"
95 #include "ardour/buffer_manager.h"
96 #include "ardour/control_protocol_manager.h"
97 #include "ardour/directory_names.h"
98 #include "ardour/event_type_map.h"
99 #include "ardour/filesystem_paths.h"
100 #include "ardour/midi_region.h"
101 #include "ardour/midi_ui.h"
102 #include "ardour/midiport_manager.h"
103 #include "ardour/mix.h"
104 #include "ardour/operations.h"
105 #include "ardour/panner_manager.h"
106 #include "ardour/plugin_manager.h"
107 #include "ardour/presentation_info.h"
108 #include "ardour/process_thread.h"
109 #include "ardour/profile.h"
110 #include "ardour/rc_configuration.h"
111 #include "ardour/region.h"
112 #include "ardour/route_group.h"
113 #include "ardour/runtime_functions.h"
114 #include "ardour/session_event.h"
115 #include "ardour/source_factory.h"
117 #include "ardour/uri_map.h"
119 #include "audiographer/routines.h"
121 #if defined (__APPLE__)
122 #include <CoreFoundation/CoreFoundation.h>
125 #include "pbd/i18n.h"
127 ARDOUR::RCConfiguration* ARDOUR::Config = 0;
128 ARDOUR::RuntimeProfile* ARDOUR::Profile = 0;
129 ARDOUR::AudioLibrary* ARDOUR::Library = 0;
131 using namespace ARDOUR;
135 bool libardour_initialized = false;
137 compute_peak_t ARDOUR::compute_peak = 0;
138 find_peaks_t ARDOUR::find_peaks = 0;
139 apply_gain_to_buffer_t ARDOUR::apply_gain_to_buffer = 0;
140 mix_buffers_with_gain_t ARDOUR::mix_buffers_with_gain = 0;
141 mix_buffers_no_gain_t ARDOUR::mix_buffers_no_gain = 0;
142 copy_vector_t ARDOUR::copy_vector = 0;
144 PBD::Signal1<void,std::string> ARDOUR::BootMessage;
145 PBD::Signal3<void,std::string,std::string,bool> ARDOUR::PluginScanMessage;
146 PBD::Signal1<void,int> ARDOUR::PluginScanTimeout;
147 PBD::Signal0<void> ARDOUR::GUIIdle;
148 PBD::Signal3<bool,std::string,std::string,int> ARDOUR::CopyConfigurationFiles;
150 std::map<std::string, bool> ARDOUR::reserved_io_names;
152 static bool have_old_configuration_files = false;
155 extern void setup_enum_writer ();
158 /* this is useful for quite a few things that want to check
159 if any bounds-related property has changed
161 PBD::PropertyChange ARDOUR::bounds_change;
164 setup_hardware_optimization (bool try_optimization)
166 bool generic_mix_functions = true;
168 if (try_optimization) {
170 FPU* fpu = FPU::instance();
172 #if defined (ARCH_X86) && defined (BUILD_SSE_OPTIMIZATIONS)
174 #ifdef PLATFORM_WINDOWS
175 /* We have AVX-optimized code for Windows */
177 if (fpu->has_avx()) {
179 /* AVX code doesn't compile on Linux yet */
183 info << "Using AVX optimized routines" << endmsg;
186 compute_peak = x86_sse_avx_compute_peak;
187 find_peaks = x86_sse_avx_find_peaks;
188 apply_gain_to_buffer = x86_sse_avx_apply_gain_to_buffer;
189 mix_buffers_with_gain = x86_sse_avx_mix_buffers_with_gain;
190 mix_buffers_no_gain = x86_sse_avx_mix_buffers_no_gain;
191 copy_vector = x86_sse_avx_copy_vector;
193 generic_mix_functions = false;
195 } else if (fpu->has_sse()) {
197 info << "Using SSE optimized routines" << endmsg;
200 compute_peak = x86_sse_compute_peak;
201 find_peaks = x86_sse_find_peaks;
202 apply_gain_to_buffer = x86_sse_apply_gain_to_buffer;
203 mix_buffers_with_gain = x86_sse_mix_buffers_with_gain;
204 mix_buffers_no_gain = x86_sse_mix_buffers_no_gain;
205 copy_vector = default_copy_vector;
207 generic_mix_functions = false;
211 #elif defined (__APPLE__) && defined (BUILD_VECLIB_OPTIMIZATIONS)
213 if (floor (kCFCoreFoundationVersionNumber) > kCFCoreFoundationVersionNumber10_4) { /* at least Tiger */
214 compute_peak = veclib_compute_peak;
215 find_peaks = veclib_find_peaks;
216 apply_gain_to_buffer = veclib_apply_gain_to_buffer;
217 mix_buffers_with_gain = veclib_mix_buffers_with_gain;
218 mix_buffers_no_gain = veclib_mix_buffers_no_gain;
219 copy_vector = default_copy_vector;
221 generic_mix_functions = false;
223 info << "Apple VecLib H/W specific optimizations in use" << endmsg;
227 /* consider FPU denormal handling to be "h/w optimization" */
232 if (generic_mix_functions) {
234 compute_peak = default_compute_peak;
235 find_peaks = default_find_peaks;
236 apply_gain_to_buffer = default_apply_gain_to_buffer;
237 mix_buffers_with_gain = default_mix_buffers_with_gain;
238 mix_buffers_no_gain = default_mix_buffers_no_gain;
239 copy_vector = default_copy_vector;
241 info << "No H/W specific optimizations in use" << endmsg;
244 AudioGrapher::Routines::override_compute_peak (compute_peak);
245 AudioGrapher::Routines::override_apply_gain_to_buffer (apply_gain_to_buffer);
249 lotsa_files_please ()
251 #ifndef PLATFORM_WINDOWS
254 if (getrlimit (RLIMIT_NOFILE, &rl) == 0) {
257 /* See the COMPATIBILITY note on the Apple setrlimit() man page */
258 rl.rlim_cur = min ((rlim_t) OPEN_MAX, rl.rlim_max);
260 rl.rlim_cur = rl.rlim_max;
263 if (setrlimit (RLIMIT_NOFILE, &rl) != 0) {
264 if (rl.rlim_cur == RLIM_INFINITY) {
265 error << _("Could not set system open files limit to \"unlimited\"") << endmsg;
267 error << string_compose (_("Could not set system open files limit to %1"), rl.rlim_cur) << endmsg;
270 if (rl.rlim_cur != RLIM_INFINITY) {
271 info << string_compose (_("Your system is configured to limit %1 to only %2 open files"), PROGRAM_NAME, rl.rlim_cur) << endmsg;
275 error << string_compose (_("Could not get system open files limit (%1)"), strerror (errno)) << endmsg;
278 /* this only affects stdio. 2048 is the maxium possible (512 the default).
280 * If we want more, we'll have to replaces the POSIX I/O interfaces with
281 * Win32 API calls (CreateFile, WriteFile, etc) which allows for 16K.
283 * see http://stackoverflow.com/questions/870173/is-there-a-limit-on-number-of-open-files-in-windows
284 * and http://bugs.mysql.com/bug.php?id=24509
286 int newmax = _setmaxstdio (2048);
288 info << string_compose (_("Your system is configured to limit %1 to only %2 open files"), PROGRAM_NAME, newmax) << endmsg;
290 error << string_compose (_("Could not set system open files limit. Current limit is %1 open files"), _getmaxstdio()) << endmsg;
296 copy_configuration_files (string const & old_dir, string const & new_dir, int old_version)
301 /* ensure target directory exists */
303 if (g_mkdir_with_parents (new_dir.c_str(), 0755)) {
307 if (old_version >= 3) {
309 old_name = Glib::build_filename (old_dir, X_("recent"));
310 new_name = Glib::build_filename (new_dir, X_("recent"));
312 copy_file (old_name, new_name);
314 old_name = Glib::build_filename (old_dir, X_("sfdb"));
315 new_name = Glib::build_filename (new_dir, X_("sfdb"));
317 copy_file (old_name, new_name);
319 /* can only copy ardour.rc/config - UI config is not compatible */
321 /* users who have been using git/nightlies since the last
322 * release of 3.5 will have $CONFIG/config rather than
323 * $CONFIG/ardour.rc. Pick up the newer "old" config file,
324 * to avoid confusion.
327 string old_name = Glib::build_filename (old_dir, X_("config"));
329 if (!Glib::file_test (old_name, Glib::FILE_TEST_EXISTS)) {
330 old_name = Glib::build_filename (old_dir, X_("ardour.rc"));
333 new_name = Glib::build_filename (new_dir, X_("config"));
335 copy_file (old_name, new_name);
337 /* copy templates and route templates */
339 old_name = Glib::build_filename (old_dir, X_("templates"));
340 new_name = Glib::build_filename (new_dir, X_("templates"));
342 copy_recurse (old_name, new_name);
344 old_name = Glib::build_filename (old_dir, X_("route_templates"));
345 new_name = Glib::build_filename (new_dir, X_("route_templates"));
347 copy_recurse (old_name, new_name);
351 old_name = Glib::build_filename (old_dir, X_("presets"));
352 new_name = Glib::build_filename (new_dir, X_("presets"));
354 copy_recurse (old_name, new_name);
358 old_name = Glib::build_filename (old_dir, X_("plugin_statuses")); /* until 6.0 */
359 new_name = Glib::build_filename (new_dir, plugin_metadata_dir_name, X_("plugin_statuses"));
360 copy_file (old_name, new_name); /* can fail silently */
362 old_name = Glib::build_filename (old_dir, plugin_metadata_dir_name, X_("plugin_statuses"));
363 copy_file (old_name, new_name);
367 old_name = Glib::build_filename (old_dir, plugin_metadata_dir_name, X_("plugin_tags"));
368 new_name = Glib::build_filename (new_dir, plugin_metadata_dir_name, X_("plugin_tags"));
370 copy_file (old_name, new_name);
374 old_name = Glib::build_filename (old_dir, export_formats_dir_name);
375 new_name = Glib::build_filename (new_dir, export_formats_dir_name);
377 vector<string> export_formats;
378 g_mkdir_with_parents (Glib::build_filename (new_dir, export_formats_dir_name).c_str(), 0755);
379 find_files_matching_pattern (export_formats, old_name, X_("*.format"));
380 for (vector<string>::iterator i = export_formats.begin(); i != export_formats.end(); ++i) {
381 std::string from = *i;
382 std::string to = Glib::build_filename (new_name, Glib::path_get_basename (*i));
383 copy_file (from, to);
391 ARDOUR::check_for_old_configuration_files ()
393 int current_version = atoi (X_(PROGRAM_VERSION));
395 if (current_version <= 1) {
399 int old_version = current_version - 1;
401 string old_config_dir = user_config_directory (old_version);
402 /* pass in the current version explicitly to avoid creation */
403 string current_config_dir = user_config_directory (current_version);
405 if (!Glib::file_test (current_config_dir, Glib::FILE_TEST_IS_DIR)) {
406 if (Glib::file_test (old_config_dir, Glib::FILE_TEST_IS_DIR)) {
407 have_old_configuration_files = true;
413 ARDOUR::handle_old_configuration_files (boost::function<bool (std::string const&, std::string const&, int)> ui_handler)
415 if (have_old_configuration_files) {
416 int current_version = atoi (X_(PROGRAM_VERSION));
417 assert (current_version > 1); // established in check_for_old_configuration_files ()
418 int old_version = current_version - 1;
419 string old_config_dir = user_config_directory (old_version);
420 string current_config_dir = user_config_directory (current_version);
422 if (ui_handler (old_config_dir, current_config_dir, old_version)) {
423 copy_configuration_files (old_config_dir, current_config_dir, old_version);
431 ARDOUR::init (bool use_windows_vst, bool try_optimization, const char* localedir)
433 if (libardour_initialized) {
438 if (getenv("LUA_METATABLES")) {
439 luabridge::Security::setHideMetatables (false);
443 if (!PBD::init()) return false;
446 (void) bindtextdomain(PACKAGE, localedir);
447 (void) bind_textdomain_codeset (PACKAGE, "UTF-8");
450 SessionEvent::init_event_pool ();
452 Operations::make_operations_quarks ();
453 SessionObject::make_property_quarks ();
454 Region::make_property_quarks ();
455 MidiRegion::make_property_quarks ();
456 AudioRegion::make_property_quarks ();
457 RouteGroup::make_property_quarks ();
458 Playlist::make_property_quarks ();
459 AudioPlaylist::make_property_quarks ();
460 PresentationInfo::make_property_quarks ();
462 /* this is a useful ready to use PropertyChange that many
463 things need to check. This avoids having to compose
464 it every time we want to check for any of the relevant
468 bounds_change.add (ARDOUR::Properties::start);
469 bounds_change.add (ARDOUR::Properties::position);
470 bounds_change.add (ARDOUR::Properties::length);
472 /* provide a state version for the few cases that need it and are not
473 driven by reading state from disk (e.g. undo/redo)
476 Stateful::current_state_version = CURRENT_SESSION_FILE_VERSION;
478 ARDOUR::setup_enum_writer ();
480 // allow ardour the absolute maximum number of open files
481 lotsa_files_please ();
486 Library = new AudioLibrary;
488 BootMessage (_("Loading configuration"));
490 Config = new RCConfiguration;
492 if (Config->load_state ()) {
496 Config->set_use_windows_vst (use_windows_vst);
498 Config->set_use_lxvst(true);
501 Profile = new RuntimeProfile;
504 #ifdef WINDOWS_VST_SUPPORT
505 if (Config->get_use_windows_vst() && fst_init (0)) {
511 if (Config->get_use_lxvst() && vstfx_init (0)) {
516 #ifdef AUDIOUNIT_SUPPORT
517 AUPluginInfo::load_cached_info ();
520 setup_hardware_optimization (try_optimization);
522 SourceFactory::init ();
525 /* singletons - first object is "it" */
526 (void) PluginManager::instance();
528 (void) URIMap::instance();
530 (void) EventTypeMap::instance();
532 ControlProtocolManager::instance().discover_control_protocols ();
534 /* for each control protocol, check for a request buffer factory method
535 and if it exists, store it in the EventLoop list of such
536 methods. This allows the relevant threads to register themselves
537 with EventLoops so that signal emission can be RT-safe.
540 ControlProtocolManager::instance().register_request_buffer_factories ();
541 /* it would be nice if this could auto-register itself in the
542 constructor, since MidiControlUI is a singleton, but it can't be
543 created until after the engine is running. Therefore we have to
544 explicitly register it here.
546 EventLoop::register_request_buffer_factory (X_("midiUI"), MidiControlUI::request_factory);
548 ProcessThread::init ();
549 /* the + 4 is a bit of a handwave. i don't actually know
550 how many more per-thread buffer sets we need above
551 the h/w concurrency, but its definitely > 1 more.
553 BufferManager::init (hardware_concurrency() + 4);
555 PannerManager::instance().discover_panners();
557 ARDOUR::AudioEngine::create ();
559 /* it is unfortunate that we need to include reserved names here that
560 refer to control surfaces. But there's no way to ensure a complete
561 lack of collisions without doing this, since the control surface
562 support may not even be active. Without adding an API to control
563 surface support that would list their port names, we do have to
566 We also need to know if the given I/O is an actual route.
567 For routes (e.g. "master"), bus creation needs to be allowed the first time,
568 while for pure I/O (e.g. "Click") track/bus creation must always fail.
571 reserved_io_names[_("Monitor")] = true;
572 reserved_io_names[_("Master")] = true;
573 reserved_io_names["auditioner"] = true; // auditioner.cc Track (s, "auditioner",...)
576 reserved_io_names[X_("Click")] = false; // session.cc ClickIO (*this, X_("Click")
577 reserved_io_names[_("Control")] = false;
578 reserved_io_names[_("Mackie")] = false;
579 reserved_io_names[_("FaderPort Recv")] = false;
580 reserved_io_names[_("FaderPort Send")] = false;
581 reserved_io_names[_("FaderPort8 Recv")] = false;
582 reserved_io_names[_("FaderPort8 Send")] = false;
583 reserved_io_names[_("FaderPort16 Recv")] = false;
584 reserved_io_names[_("FaderPort16 Send")] = false;
586 libardour_initialized = true;
592 ARDOUR::init_post_engine ()
595 if ((node = Config->control_protocol_state()) != 0) {
596 ControlProtocolManager::instance().set_state (*node, Stateful::loading_state_version);
601 ARDOUR::PluginManager::instance().refresh (!Config->get_discover_vst_on_start());
607 if (!libardour_initialized) {
611 delete &ControlProtocolManager::instance();
612 ARDOUR::AudioEngine::destroy ();
618 #ifdef WINDOWS_VST_SUPPORT
625 delete &PluginManager::instance();
633 ARDOUR::no_auto_connect()
635 return getenv ("ARDOUR_NO_AUTOCONNECT") != 0;
641 FPU* fpu = FPU::instance ();
643 if (getenv ("ARDOUR_RUNNING_UNDER_VALGRIND")) {
644 // valgrind doesn't understand this assembler stuff
645 // September 10th, 2007
649 #if defined(ARCH_X86) && defined(USE_XMMINTRIN)
653 if (!fpu->has_flush_to_zero() && !fpu->has_denormals_are_zero()) {
657 MXCSR = _mm_getcsr();
659 #ifdef DEBUG_DENORMAL_EXCEPTION
660 /* This will raise a FP exception if a denormal is detected */
661 MXCSR &= ~_MM_MASK_DENORM;
664 switch (Config->get_denormal_model()) {
666 MXCSR &= ~(_MM_FLUSH_ZERO_ON | 0x40);
670 if (fpu->has_flush_to_zero()) {
671 MXCSR |= _MM_FLUSH_ZERO_ON;
676 MXCSR &= ~_MM_FLUSH_ZERO_ON;
677 if (fpu->has_denormals_are_zero()) {
683 if (fpu->has_flush_to_zero()) {
684 if (fpu->has_denormals_are_zero()) {
685 MXCSR |= _MM_FLUSH_ZERO_ON | 0x40;
687 MXCSR |= _MM_FLUSH_ZERO_ON;
698 /* this can be changed to modify the translation behaviour for
699 cases where the user has never expressed a preference.
701 static const bool translate_by_default = true;
704 ARDOUR::translation_enable_path ()
706 return Glib::build_filename (user_config_directory(), ".translate");
710 ARDOUR::translations_are_enabled ()
712 int fd = g_open (ARDOUR::translation_enable_path().c_str(), O_RDONLY, 0444);
715 return translate_by_default;
721 if (::read (fd, &c, 1) == 1 && c == '1') {
731 ARDOUR::set_translations_enabled (bool yn)
733 string i18n_enabler = ARDOUR::translation_enable_path();
734 int fd = g_open (i18n_enabler.c_str(), O_WRONLY|O_CREAT|O_TRUNC, 0644);
748 (void) ::write (fd, &c, 1);
751 Config->ParameterChanged ("enable-translation");
757 ARDOUR::get_available_sync_options ()
759 vector<SyncSource> ret;
761 boost::shared_ptr<AudioBackend> backend = AudioEngine::instance()->current_backend();
762 if (backend && backend->name() == "JACK") {
763 ret.push_back (Engine);
767 ret.push_back (MIDIClock);
773 /** Return a monotonic value for the number of microseconds that have elapsed
774 * since an arbitrary zero origin.
778 /* Thanks Apple for not implementing this basic SUSv2, POSIX.1-2001 function
780 #include <mach/mach_time.h>
781 #define CLOCK_REALTIME 0
782 #define CLOCK_MONOTONIC 0
784 clock_gettime (int /*clk_id*/, struct timespec *t)
786 static bool initialized = false;
787 static mach_timebase_info_data_t timebase;
789 mach_timebase_info(&timebase);
793 time = mach_absolute_time();
794 double nseconds = ((double)time * (double)timebase.numer)/((double)timebase.denom);
795 double seconds = ((double)time * (double)timebase.numer)/((double)timebase.denom * 1e9);
797 t->tv_nsec = nseconds;
803 ARDOUR::get_microseconds ()
805 #ifdef PLATFORM_WINDOWS
806 microseconds_t ret = 0;
807 LARGE_INTEGER freq, time;
809 if (QueryPerformanceFrequency(&freq))
810 if (QueryPerformanceCounter(&time))
811 ret = (microseconds_t)((time.QuadPart * 1000000) / freq.QuadPart);
816 if (clock_gettime (CLOCK_MONOTONIC, &ts) != 0) {
820 return (microseconds_t) ts.tv_sec * 1000000 + (ts.tv_nsec/1000);
824 /** Return the number of bits per sample for a given sample format.
826 * This is closely related to sndfile_data_width() but does NOT
827 * return a "magic" value to differentiate between 32 bit integer
828 * and 32 bit floating point values.
832 ARDOUR::format_data_width (ARDOUR::SampleFormat format)
838 case ARDOUR::FormatInt16:
840 case ARDOUR::FormatInt24: