X-Git-Url: https://main.carlh.net/gitweb/?p=ardour.git;a=blobdiff_plain;f=libs%2Fardour%2Fglobals.cc;h=974247aef57cb08d26daebf280485cee9bc1da8e;hp=a76fae4feed8feed1974ffef6f8c1b7353bac6bf;hb=c8c6bca6587450ff64303dbc994a4cd28d6ce7aa;hpb=7ac691ec821c1986282ba9e25b3890dcf07e3e51 diff --git a/libs/ardour/globals.cc b/libs/ardour/globals.cc index a76fae4fee..974247aef5 100644 --- a/libs/ardour/globals.cc +++ b/libs/ardour/globals.cc @@ -38,9 +38,10 @@ #include #include -#include +#include "pbd/gstdio_compat.h" #ifdef PLATFORM_WINDOWS +#include // for _setmaxstdio #include // for LARGE_INTEGER #endif @@ -62,7 +63,7 @@ #ifdef check #undef check /* stupid Apple and their un-namespaced, generic Carbon macros */ -#endif +#endif #include #include @@ -79,7 +80,6 @@ #include "pbd/fpu.h" #include "pbd/file_utils.h" #include "pbd/enumwriter.h" -#include "pbd/basename.h" #include "midi++/port.h" #include "midi++/mmc.h" @@ -96,11 +96,13 @@ #include "ardour/event_type_map.h" #include "ardour/filesystem_paths.h" #include "ardour/midi_region.h" +#include "ardour/midi_ui.h" #include "ardour/midiport_manager.h" #include "ardour/mix.h" #include "ardour/operations.h" #include "ardour/panner_manager.h" #include "ardour/plugin_manager.h" +#include "ardour/presentation_info.h" #include "ardour/process_thread.h" #include "ardour/profile.h" #include "ardour/rc_configuration.h" @@ -114,10 +116,10 @@ #include "audiographer/routines.h" #if defined (__APPLE__) - #include // For Gestalt +#include #endif -#include "i18n.h" +#include "pbd/i18n.h" ARDOUR::RCConfiguration* ARDOUR::Config = 0; ARDOUR::RuntimeProfile* ARDOUR::Profile = 0; @@ -142,6 +144,8 @@ PBD::Signal1 ARDOUR::PluginScanTimeout; PBD::Signal0 ARDOUR::GUIIdle; PBD::Signal3 ARDOUR::CopyConfigurationFiles; +std::vector ARDOUR::reserved_io_names; + static bool have_old_configuration_files = false; namespace ARDOUR { @@ -166,15 +170,15 @@ setup_hardware_optimization (bool try_optimization) #ifdef PLATFORM_WINDOWS /* We have AVX-optimized code for Windows */ - + if (fpu->has_avx()) { -#else +#else /* AVX code doesn't compile on Linux yet */ - + if (false) { -#endif +#endif info << "Using AVX optimized routines" << endmsg; - + // AVX SET compute_peak = x86_sse_avx_compute_peak; find_peaks = x86_sse_avx_find_peaks; @@ -202,12 +206,8 @@ setup_hardware_optimization (bool try_optimization) } #elif defined (__APPLE__) && defined (BUILD_VECLIB_OPTIMIZATIONS) - SInt32 sysVersion = 0; - if (noErr != Gestalt(gestaltSystemVersion, &sysVersion)) - sysVersion = 0; - - if (sysVersion >= 0x00001040) { // Tiger at least + if (floor (kCFCoreFoundationVersionNumber) > kCFCoreFoundationVersionNumber10_4) { /* at least Tiger */ compute_peak = veclib_compute_peak; find_peaks = veclib_find_peaks; apply_gain_to_buffer = veclib_apply_gain_to_buffer; @@ -271,6 +271,21 @@ lotsa_files_please () } else { error << string_compose (_("Could not get system open files limit (%1)"), strerror (errno)) << endmsg; } +#else + /* this only affects stdio. 2048 is the maxium possible (512 the default). + * + * If we want more, we'll have to replaces the POSIX I/O interfaces with + * Win32 API calls (CreateFile, WriteFile, etc) which allows for 16K. + * + * see http://stackoverflow.com/questions/870173/is-there-a-limit-on-number-of-open-files-in-windows + * and http://bugs.mysql.com/bug.php?id=24509 + */ + int newmax = _setmaxstdio (2048); + if (newmax > 0) { + info << string_compose (_("Your system is configured to limit %1 to only %2 open files"), PROGRAM_NAME, newmax) << endmsg; + } else { + error << string_compose (_("Could not set system open files limit. Current limit is %1 open files"), _getmaxstdio) << endmsg; + } #endif } @@ -285,9 +300,9 @@ copy_configuration_files (string const & old_dir, string const & new_dir, int ol if (g_mkdir_with_parents (new_dir.c_str(), 0755)) { return -1; } - - if (old_version == 3) { - + + if (old_version >= 3) { + old_name = Glib::build_filename (old_dir, X_("recent")); new_name = Glib::build_filename (new_dir, X_("recent")); @@ -305,7 +320,7 @@ copy_configuration_files (string const & old_dir, string const & new_dir, int ol * $CONFIG/ardour.rc. Pick up the newer "old" config file, * to avoid confusion. */ - + string old_name = Glib::build_filename (old_dir, X_("config")); if (!Glib::file_test (old_name, Glib::FILE_TEST_EXISTS)) { @@ -332,7 +347,7 @@ copy_configuration_files (string const & old_dir, string const & new_dir, int ol old_name = Glib::build_filename (old_dir, X_("presets")); new_name = Glib::build_filename (new_dir, X_("presets")); - + copy_recurse (old_name, new_name); /* presets */ @@ -341,12 +356,12 @@ copy_configuration_files (string const & old_dir, string const & new_dir, int ol new_name = Glib::build_filename (new_dir, X_("plugin_statuses")); copy_file (old_name, new_name); - + /* export formats */ old_name = Glib::build_filename (old_dir, export_formats_dir_name); new_name = Glib::build_filename (new_dir, export_formats_dir_name); - + vector export_formats; g_mkdir_with_parents (Glib::build_filename (new_dir, export_formats_dir_name).c_str(), 0755); find_files_matching_pattern (export_formats, old_name, X_("*.format")); @@ -364,7 +379,7 @@ void ARDOUR::check_for_old_configuration_files () { int current_version = atoi (X_(PROGRAM_VERSION)); - + if (current_version <= 1) { return; } @@ -424,6 +439,7 @@ ARDOUR::init (bool use_windows_vst, bool try_optimization, const char* localedir RouteGroup::make_property_quarks (); Playlist::make_property_quarks (); AudioPlaylist::make_property_quarks (); + PresentationInfo::make_property_quarks (); /* this is a useful ready to use PropertyChange that many things need to check. This avoids having to compose @@ -495,17 +511,54 @@ ARDOUR::init (bool use_windows_vst, bool try_optimization, const char* localedir #endif (void) EventTypeMap::instance(); + ControlProtocolManager::instance().discover_control_protocols (); + + /* for each control protocol, check for a request buffer factory method + and if it exists, store it in the EventLoop list of such + methods. This allows the relevant threads to register themselves + with EventLoops so that signal emission can be RT-safe. + */ + + ControlProtocolManager::instance().register_request_buffer_factories (); + /* it would be nice if this could auto-register itself in the + constructor, since MidiControlUI is a singleton, but it can't be + created until after the engine is running. Therefore we have to + explicitly register it here. + */ + EventLoop::register_request_buffer_factory (X_("midiUI"), MidiControlUI::request_factory); + ProcessThread::init (); /* the + 4 is a bit of a handwave. i don't actually know how many more per-thread buffer sets we need above the h/w concurrency, but its definitely > 1 more. */ - BufferManager::init (hardware_concurrency() + 4); + BufferManager::init (hardware_concurrency() + 4); PannerManager::instance().discover_panners(); ARDOUR::AudioEngine::create (); + /* it is unfortunate that we need to include reserved names here that + refer to control surfaces. But there's no way to ensure a complete + lack of collisions without doing this, since the control surface + support may not even be active. Without adding an API to control + surface support that would list their port names, we do have to + list them here. + */ + + char const * const reserved[] = { + _("Monitor"), + _("Master"), + _("Control"), + _("Click"), + _("Mackie"), + 0 + }; + + for (int n = 0; reserved[n]; ++n) { + reserved_io_names.push_back (reserved[n]); + } + libardour_initialized = true; return true; @@ -514,8 +567,6 @@ ARDOUR::init (bool use_windows_vst, bool try_optimization, const char* localedir void ARDOUR::init_post_engine () { - ControlProtocolManager::instance().discover_control_protocols (); - XMLNode* node; if ((node = Config->control_protocol_state()) != 0) { ControlProtocolManager::instance().set_state (*node, Stateful::loading_state_version); @@ -527,7 +578,7 @@ ARDOUR::init_post_engine () } void -ARDOUR::cleanup () +ARDOUR::cleanup () { if (!libardour_initialized) { return; @@ -554,31 +605,6 @@ ARDOUR::cleanup () return; } -void -ARDOUR::find_bindings_files (map& files) -{ - vector found; - Searchpath spath = ardour_config_search_path(); - - if (getenv ("ARDOUR_SAE")) { - find_files_matching_pattern (found, spath, "*SAE-*.bindings"); - } else { - find_files_matching_pattern (found, spath, "*.bindings"); - } - - if (found.empty()) { - return; - } - - for (vector::iterator x = found.begin(); x != found.end(); ++x) { - std::string path(*x); - pair namepath; - namepath.second = path; - namepath.first = PBD::basename_nosuffix (path); - files.insert (namepath); - } -} - bool ARDOUR::no_auto_connect() { @@ -589,7 +615,7 @@ void ARDOUR::setup_fpu () { FPU* fpu = FPU::instance (); - + if (getenv ("ARDOUR_RUNNING_UNDER_VALGRIND")) { // valgrind doesn't understand this assembler stuff // September 10th, 2007 @@ -609,7 +635,7 @@ ARDOUR::setup_fpu () #ifdef DEBUG_DENORMAL_EXCEPTION /* This will raise a FP exception if a denormal is detected */ MXCSR &= ~_MM_MASK_DENORM; -#endif +#endif switch (Config->get_denormal_model()) { case DenormalNone: @@ -686,15 +712,15 @@ ARDOUR::set_translations_enabled (bool yn) if (fd < 0) { return false; } - + char c; - + if (yn) { c = '1'; } else { c = '0'; } - + (void) ::write (fd, &c, 1); (void) ::close (fd); @@ -729,7 +755,7 @@ ARDOUR::get_available_sync_options () #include #define CLOCK_REALTIME 0 #define CLOCK_MONOTONIC 0 -int +int clock_gettime (int /*clk_id*/, struct timespec *t) { static bool initialized = false; @@ -747,7 +773,7 @@ clock_gettime (int /*clk_id*/, struct timespec *t) return 0; } #endif - + microseconds_t ARDOUR::get_microseconds () {