auditioner always runs at normal speed, independent of transport speed
[ardour.git] / libs / ardour / globals.cc
index 0a1d0cd085406dd66920e8b15a6cef90ff013ed1..00d448985f555fadb6cb1ee25930f9bc7a738b4c 100644 (file)
@@ -41,6 +41,7 @@
 #include "pbd/gstdio_compat.h"
 
 #ifdef PLATFORM_WINDOWS
 #include "pbd/gstdio_compat.h"
 
 #ifdef PLATFORM_WINDOWS
+#include <stdio.h> // for _setmaxstdio
 #include <windows.h> // for LARGE_INTEGER
 #endif
 
 #include <windows.h> // for LARGE_INTEGER
 #endif
 
 #include "pbd/fpu.h"
 #include "pbd/file_utils.h"
 #include "pbd/enumwriter.h"
 #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"
 
 
 #include "midi++/port.h"
 #include "midi++/mmc.h"
 
+#include "LuaBridge/LuaBridge.h"
+
 #include "ardour/analyser.h"
 #include "ardour/audio_library.h"
 #include "ardour/audio_backend.h"
 #include "ardour/analyser.h"
 #include "ardour/audio_library.h"
 #include "ardour/audio_backend.h"
 #include "ardour/event_type_map.h"
 #include "ardour/filesystem_paths.h"
 #include "ardour/midi_region.h"
 #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/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"
 #include "ardour/process_thread.h"
 #include "ardour/profile.h"
 #include "ardour/rc_configuration.h"
 #include "ardour/runtime_functions.h"
 #include "ardour/session_event.h"
 #include "ardour/source_factory.h"
 #include "ardour/runtime_functions.h"
 #include "ardour/session_event.h"
 #include "ardour/source_factory.h"
+#ifdef LV2_SUPPORT
 #include "ardour/uri_map.h"
 #include "ardour/uri_map.h"
-
+#endif
 #include "audiographer/routines.h"
 
 #if defined (__APPLE__)
 #include "audiographer/routines.h"
 
 #if defined (__APPLE__)
-       #include <Carbon/Carbon.h> // For Gestalt
+#include <CoreFoundation/CoreFoundation.h>
 #endif
 
 #endif
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 ARDOUR::RCConfiguration* ARDOUR::Config = 0;
 ARDOUR::RuntimeProfile* ARDOUR::Profile = 0;
 
 ARDOUR::RCConfiguration* ARDOUR::Config = 0;
 ARDOUR::RuntimeProfile* ARDOUR::Profile = 0;
@@ -142,7 +147,7 @@ PBD::Signal1<void,int> ARDOUR::PluginScanTimeout;
 PBD::Signal0<void> ARDOUR::GUIIdle;
 PBD::Signal3<bool,std::string,std::string,int> ARDOUR::CopyConfigurationFiles;
 
 PBD::Signal0<void> ARDOUR::GUIIdle;
 PBD::Signal3<bool,std::string,std::string,int> ARDOUR::CopyConfigurationFiles;
 
-std::vector<std::string> ARDOUR::reserved_io_names;
+std::map<std::string, bool> ARDOUR::reserved_io_names;
 
 static bool have_old_configuration_files = false;
 
 
 static bool have_old_configuration_files = false;
 
@@ -204,12 +209,8 @@ setup_hardware_optimization (bool try_optimization)
                }
 
 #elif defined (__APPLE__) && defined (BUILD_VECLIB_OPTIMIZATIONS)
                }
 
 #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;
                        compute_peak           = veclib_compute_peak;
                        find_peaks             = veclib_find_peaks;
                        apply_gain_to_buffer   = veclib_apply_gain_to_buffer;
@@ -273,6 +274,21 @@ lotsa_files_please ()
        } else {
                error << string_compose (_("Could not get system open files limit (%1)"), strerror (errno)) << endmsg;
        }
        } 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
 }
 
 #endif
 }
 
@@ -288,7 +304,7 @@ copy_configuration_files (string const & old_dir, string const & new_dir, int ol
                return -1;
        }
 
                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"));
 
                old_name = Glib::build_filename (old_dir, X_("recent"));
                new_name = Glib::build_filename (new_dir, X_("recent"));
@@ -409,6 +425,12 @@ ARDOUR::init (bool use_windows_vst, bool try_optimization, const char* localedir
                return true;
        }
 
                return true;
        }
 
+#ifndef NDEBUG
+       if (getenv("LUA_METATABLES")) {
+               luabridge::Security::setHideMetatables (false);
+       }
+#endif
+
        if (!PBD::init()) return false;
 
 #ifdef ENABLE_NLS
        if (!PBD::init()) return false;
 
 #ifdef ENABLE_NLS
@@ -426,6 +448,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 ();
        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
 
        /* this is a useful ready to use PropertyChange that many
           things need to check. This avoids having to compose
@@ -497,6 +520,22 @@ ARDOUR::init (bool use_windows_vst, bool try_optimization, const char* localedir
 #endif
        (void) EventTypeMap::instance();
 
 #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
         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
@@ -514,20 +553,24 @@ ARDOUR::init (bool use_windows_vst, bool try_optimization, const char* localedir
           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.
           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.
+
+          We also need to know if the given I/O is an actual route.
+          For routes (e.g. "master"), bus creation needs to be allowed the first time,
+          while for pure I/O (e.g. "Click") track/bus creation must always fail.
        */
 
        */
 
-       char const * const reserved[] = {
-               _("Monitor"),
-               _("Master"),
-               _("Control"),
-               _("Click"),
-               _("Mackie"),
-               0
-       };
-
-       for (int n = 0; reserved[n]; ++n) {
-               reserved_io_names.push_back (reserved[n]);
-       }
+       reserved_io_names[_("Monitor")] = true;
+       reserved_io_names[_("Master")] = true;
+       reserved_io_names["auditioner"] = true; // auditioner.cc  Track (s, "auditioner",...)
+
+       /* pure I/O */
+       reserved_io_names[X_("Click")] = false; // session.cc ClickIO (*this, X_("Click")
+       reserved_io_names[_("Control")] = false;
+       reserved_io_names[_("Mackie")] = false;
+       reserved_io_names[_("FaderPort Recv")] = false;
+       reserved_io_names[_("FaderPort Send")] = false;
+       reserved_io_names[_("FaderPort8 Recv")] = false;
+       reserved_io_names[_("FaderPort8 Send")] = false;
 
        libardour_initialized = true;
 
 
        libardour_initialized = true;
 
@@ -537,8 +580,6 @@ ARDOUR::init (bool use_windows_vst, bool try_optimization, const char* localedir
 void
 ARDOUR::init_post_engine ()
 {
 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);
        XMLNode* node;
        if ((node = Config->control_protocol_state()) != 0) {
                ControlProtocolManager::instance().set_state (*node, Stateful::loading_state_version);
@@ -556,13 +597,13 @@ ARDOUR::cleanup ()
                return;
        }
 
                return;
        }
 
+       delete &ControlProtocolManager::instance();
        ARDOUR::AudioEngine::destroy ();
 
        delete Library;
 #ifdef HAVE_LRDF
        lrdf_cleanup ();
 #endif
        ARDOUR::AudioEngine::destroy ();
 
        delete Library;
 #ifdef HAVE_LRDF
        lrdf_cleanup ();
 #endif
-       delete &ControlProtocolManager::instance();
 #ifdef WINDOWS_VST_SUPPORT
        fst_exit ();
 #endif
 #ifdef WINDOWS_VST_SUPPORT
        fst_exit ();
 #endif
@@ -577,31 +618,6 @@ ARDOUR::cleanup ()
        return;
 }
 
        return;
 }
 
-void
-ARDOUR::find_bindings_files (map<string,string>& files)
-{
-       vector<std::string> 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<std::string>::iterator x = found.begin(); x != found.end(); ++x) {
-               std::string path(*x);
-               pair<string,string> namepath;
-               namepath.second = path;
-               namepath.first = PBD::basename_nosuffix (path);
-               files.insert (namepath);
-       }
-}
-
 bool
 ARDOUR::no_auto_connect()
 {
 bool
 ARDOUR::no_auto_connect()
 {
@@ -721,6 +737,7 @@ ARDOUR::set_translations_enabled (bool yn)
        (void) ::write (fd, &c, 1);
        (void) ::close (fd);
 
        (void) ::write (fd, &c, 1);
        (void) ::close (fd);
 
+       Config->ParameterChanged ("enable-translation");
        return true;
 }
 
        return true;
 }