ensure that each and every audioengine-related thread has a unique name
[ardour.git] / libs / ardour / globals.cc
index d9e0602f6ccb08693bc0ad9b747b85cc9c1e138d..9f4a1399b3d4ed30d24aedda2bc791843deb62f9 100644 (file)
 #include <time.h>
 
 #include <glib.h>
-#include <pbd/gstdio_compat.h>
+#include "pbd/gstdio_compat.h"
 
 #ifdef PLATFORM_WINDOWS
+#include <stdio.h> // for _setmaxstdio
 #include <windows.h> // for LARGE_INTEGER
 #endif
 
@@ -96,6 +97,7 @@
 #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"
@@ -273,6 +275,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
 }
 
@@ -497,6 +514,22 @@ 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
@@ -537,8 +570,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);