X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fglobals.cc;h=fa6f833d94eb29fe64980321e4f4a7228efdf9db;hb=8367b7cab344e75908744a95fda860c7fadff420;hp=0cda9ebdf404fe81773763aad7e8f8610cbeaf87;hpb=4f8c30de020ed00997776e1bdb6a1c97724c2c97;p=ardour.git diff --git a/libs/ardour/globals.cc b/libs/ardour/globals.cc index 0cda9ebdf4..fa6f833d94 100644 --- a/libs/ardour/globals.cc +++ b/libs/ardour/globals.cc @@ -37,6 +37,10 @@ #include #include +#ifdef PLATFORM_WINDOWS +#include // for LARGE_INTEGER +#endif + #ifdef WINDOWS_VST_SUPPORT #include #endif @@ -85,10 +89,13 @@ #include "ardour/audioregion.h" #include "ardour/buffer_manager.h" #include "ardour/control_protocol_manager.h" +#include "ardour/directory_names.h" +#include "ardour/event_type_map.h" #include "ardour/filesystem_paths.h" #include "ardour/midi_region.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/process_thread.h" @@ -99,6 +106,7 @@ #include "ardour/runtime_functions.h" #include "ardour/session_event.h" #include "ardour/source_factory.h" +#include "ardour/uri_map.h" #include "audiographer/routines.h" @@ -123,9 +131,15 @@ find_peaks_t ARDOUR::find_peaks = 0; apply_gain_to_buffer_t ARDOUR::apply_gain_to_buffer = 0; mix_buffers_with_gain_t ARDOUR::mix_buffers_with_gain = 0; mix_buffers_no_gain_t ARDOUR::mix_buffers_no_gain = 0; +copy_vector_t ARDOUR::copy_vector = 0; PBD::Signal1 ARDOUR::BootMessage; +PBD::Signal3 ARDOUR::PluginScanMessage; +PBD::Signal1 ARDOUR::PluginScanTimeout; PBD::Signal0 ARDOUR::GUIIdle; +PBD::Signal3 ARDOUR::CopyConfigurationFiles; + +static bool have_old_configuration_files = false; namespace ARDOUR { extern void setup_enum_writer (); @@ -147,7 +161,21 @@ setup_hardware_optimization (bool try_optimization) #if defined (ARCH_X86) && defined (BUILD_SSE_OPTIMIZATIONS) - if (fpu.has_sse()) { + if (fpu.has_avx()) { + + info << "Using AVX optimized routines" << endmsg; + + // AVX SET + compute_peak = x86_sse_avx_compute_peak; + find_peaks = x86_sse_avx_find_peaks; + apply_gain_to_buffer = x86_sse_avx_apply_gain_to_buffer; + mix_buffers_with_gain = x86_sse_avx_mix_buffers_with_gain; + mix_buffers_no_gain = x86_sse_avx_mix_buffers_no_gain; + copy_vector = x86_sse_avx_copy_vector; + + generic_mix_functions = false; + + } else if (fpu.has_sse()) { info << "Using SSE optimized routines" << endmsg; @@ -157,6 +185,7 @@ setup_hardware_optimization (bool try_optimization) apply_gain_to_buffer = x86_sse_apply_gain_to_buffer; mix_buffers_with_gain = x86_sse_mix_buffers_with_gain; mix_buffers_no_gain = x86_sse_mix_buffers_no_gain; + copy_vector = default_copy_vector; generic_mix_functions = false; @@ -174,6 +203,7 @@ setup_hardware_optimization (bool try_optimization) apply_gain_to_buffer = veclib_apply_gain_to_buffer; mix_buffers_with_gain = veclib_mix_buffers_with_gain; mix_buffers_no_gain = veclib_mix_buffers_no_gain; + copy_vector = default_copy_vector; generic_mix_functions = false; @@ -193,6 +223,7 @@ setup_hardware_optimization (bool try_optimization) apply_gain_to_buffer = default_apply_gain_to_buffer; mix_buffers_with_gain = default_mix_buffers_with_gain; mix_buffers_no_gain = default_mix_buffers_no_gain; + copy_vector = default_copy_vector; info << "No H/W specific optimizations in use" << endmsg; } @@ -209,7 +240,12 @@ lotsa_files_please () if (getrlimit (RLIMIT_NOFILE, &rl) == 0) { +#ifdef __APPLE__ + /* See the COMPATIBILITY note on the Apple setrlimit() man page */ + rl.rlim_cur = min ((rlim_t) OPEN_MAX, rl.rlim_max); +#else rl.rlim_cur = rl.rlim_max; +#endif if (setrlimit (RLIMIT_NOFILE, &rl) != 0) { if (rl.rlim_cur == RLIM_INFINITY) { @@ -228,6 +264,132 @@ lotsa_files_please () #endif } +static int +copy_configuration_files (string const & old_dir, string const & new_dir, int old_version) +{ + string old_name; + string new_name; + + /* ensure target directory exists */ + + if (g_mkdir_with_parents (new_dir.c_str(), 0755)) { + return -1; + } + + if (old_version == 3) { + + old_name = Glib::build_filename (old_dir, X_("recent")); + new_name = Glib::build_filename (new_dir, X_("recent")); + + copy_file (old_name, new_name); + + old_name = Glib::build_filename (old_dir, X_("sfdb")); + new_name = Glib::build_filename (new_dir, X_("sfdb")); + + copy_file (old_name, new_name); + + /* can only copy ardour.rc/config - UI config is not compatible */ + + /* users who have been using git/nightlies since the last + * release of 3.5 will have $CONFIG/config rather than + * $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)) { + old_name = Glib::build_filename (old_dir, X_("ardour.rc")); + } + + new_name = Glib::build_filename (new_dir, X_("config")); + + copy_file (old_name, new_name); + + /* copy templates and route templates */ + + old_name = Glib::build_filename (old_dir, X_("templates")); + new_name = Glib::build_filename (new_dir, X_("templates")); + + copy_recurse (old_name, new_name); + + old_name = Glib::build_filename (old_dir, X_("route_templates")); + new_name = Glib::build_filename (new_dir, X_("route_templates")); + + copy_recurse (old_name, new_name); + + /* presets */ + + 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 */ + + old_name = Glib::build_filename (old_dir, X_("plugin_statuses")); + 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")); + for (vector::iterator i = export_formats.begin(); i != export_formats.end(); ++i) { + std::string from = *i; + std::string to = Glib::build_filename (new_name, Glib::path_get_basename (*i)); + copy_file (from, to); + } + } + + return 0; +} + +void +ARDOUR::check_for_old_configuration_files () +{ + int current_version = atoi (X_(PROGRAM_VERSION)); + + if (current_version <= 1) { + return; + } + + int old_version = current_version - 1; + + string old_config_dir = user_config_directory (old_version); + /* pass in the current version explicitly to avoid creation */ + string current_config_dir = user_config_directory (current_version); + + if (!Glib::file_test (current_config_dir, Glib::FILE_TEST_IS_DIR)) { + if (Glib::file_test (old_config_dir, Glib::FILE_TEST_IS_DIR)) { + have_old_configuration_files = true; + } + } +} + +int +ARDOUR::handle_old_configuration_files (boost::function ui_handler) +{ + if (have_old_configuration_files) { + int current_version = atoi (X_(PROGRAM_VERSION)); + assert (current_version > 1); // established in check_for_old_configuration_files () + int old_version = current_version - 1; + string old_config_dir = user_config_directory (old_version); + string current_config_dir = user_config_directory (current_version); + + if (ui_handler (old_config_dir, current_config_dir, old_version)) { + copy_configuration_files (old_config_dir, current_config_dir, old_version); + return 1; + } + } + return 0; +} + bool ARDOUR::init (bool use_windows_vst, bool try_optimization, const char* localedir) { @@ -239,10 +401,12 @@ ARDOUR::init (bool use_windows_vst, bool try_optimization, const char* localedir #ifdef ENABLE_NLS (void) bindtextdomain(PACKAGE, localedir); + (void) bind_textdomain_codeset (PACKAGE, "UTF-8"); #endif SessionEvent::init_event_pool (); + Operations::make_operations_quarks (); SessionObject::make_property_quarks (); Region::make_property_quarks (); MidiRegion::make_property_quarks (); @@ -314,8 +478,12 @@ ARDOUR::init (bool use_windows_vst, bool try_optimization, const char* localedir SourceFactory::init (); Analyser::init (); - /* singleton - first object is "it" */ + /* singletons - first object is "it" */ (void) PluginManager::instance(); +#ifdef LV2_SUPPORT + (void) URIMap::instance(); +#endif + (void) EventTypeMap::instance(); ProcessThread::init (); /* the + 4 is a bit of a handwave. i don't actually know @@ -326,24 +494,6 @@ ARDOUR::init (bool use_windows_vst, bool try_optimization, const char* localedir PannerManager::instance().discover_panners(); - // Initialize parameter metadata - EventTypeMap::instance().new_parameter(NullAutomation); - EventTypeMap::instance().new_parameter(GainAutomation); - EventTypeMap::instance().new_parameter(PanAzimuthAutomation); - EventTypeMap::instance().new_parameter(PanElevationAutomation); - EventTypeMap::instance().new_parameter(PanWidthAutomation); - EventTypeMap::instance().new_parameter(PluginAutomation); - EventTypeMap::instance().new_parameter(SoloAutomation); - EventTypeMap::instance().new_parameter(MuteAutomation); - EventTypeMap::instance().new_parameter(MidiCCAutomation); - EventTypeMap::instance().new_parameter(MidiPgmChangeAutomation); - EventTypeMap::instance().new_parameter(MidiPitchBenderAutomation); - EventTypeMap::instance().new_parameter(MidiChannelPressureAutomation); - EventTypeMap::instance().new_parameter(FadeInAutomation); - EventTypeMap::instance().new_parameter(FadeOutAutomation); - EventTypeMap::instance().new_parameter(EnvelopeAutomation); - EventTypeMap::instance().new_parameter(MidiCCAutomation); - ARDOUR::AudioEngine::create (); libardour_initialized = true; @@ -363,12 +513,18 @@ ARDOUR::init_post_engine () /* find plugins */ - ARDOUR::PluginManager::instance().refresh (); + ARDOUR::PluginManager::instance().refresh (!Config->get_discover_vst_on_start()); } -int -ARDOUR::cleanup () +void +ARDOUR::cleanup () { + if (!libardour_initialized) { + return; + } + + ARDOUR::AudioEngine::destroy (); + delete Library; #ifdef HAVE_LRDF lrdf_cleanup (); @@ -381,8 +537,11 @@ ARDOUR::cleanup () #ifdef LXVST_SUPPORT vstfx_exit(); #endif + delete &PluginManager::instance(); + delete Config; PBD::cleanup (); - return 0; + + return; } void @@ -392,11 +551,9 @@ ARDOUR::find_bindings_files (map& files) Searchpath spath = ardour_config_search_path(); if (getenv ("ARDOUR_SAE")) { - Glib::PatternSpec pattern("*SAE-*.bindings"); - find_matching_files_in_search_path (spath, pattern, found); + find_files_matching_pattern (found, spath, "*SAE-*.bindings"); } else { - Glib::PatternSpec pattern("*.bindings"); - find_matching_files_in_search_path (spath, pattern, found); + find_files_matching_pattern (found, spath, "*.bindings"); } if (found.empty()) { @@ -532,8 +689,8 @@ ARDOUR::set_translations_enabled (bool yn) c = '0'; } - ::write (fd, &c, 1); - ::close (fd); + (void) ::write (fd, &c, 1); + (void) ::close (fd); return true; } @@ -544,7 +701,11 @@ ARDOUR::get_available_sync_options () { vector ret; - ret.push_back (JACK); + boost::shared_ptr backend = AudioEngine::instance()->current_backend(); + if (backend && backend->name() == "JACK") { + ret.push_back (Engine); + } + ret.push_back (MTC); ret.push_back (MIDIClock); ret.push_back (LTC); @@ -602,3 +763,26 @@ ARDOUR::get_microseconds () return (microseconds_t) ts.tv_sec * 1000000 + (ts.tv_nsec/1000); #endif } + +/** Return the number of bits per sample for a given sample format. + * + * This is closely related to sndfile_data_width() but does NOT + * return a "magic" value to differentiate between 32 bit integer + * and 32 bit floating point values. + */ + +int +ARDOUR::format_data_width (ARDOUR::SampleFormat format) +{ + + + + switch (format) { + case ARDOUR::FormatInt16: + return 16; + case ARDOUR::FormatInt24: + return 24; + default: + return 32; + } +}