#include <time.h>
#include <glib.h>
-#include <glib/gstdio.h>
+#include "pbd/gstdio_compat.h"
#ifdef PLATFORM_WINDOWS
+#include <stdio.h> // for _setmaxstdio
#include <windows.h> // for LARGE_INTEGER
#endif
#ifdef check
#undef check /* stupid Apple and their un-namespaced, generic Carbon macros */
-#endif
+#endif
#include <glibmm/fileutils.h>
#include <glibmm/miscutils.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 "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"
PBD::Signal0<void> ARDOUR::GUIIdle;
PBD::Signal3<bool,std::string,std::string,int> ARDOUR::CopyConfigurationFiles;
+std::vector<std::string> ARDOUR::reserved_io_names;
+
static bool have_old_configuration_files = false;
namespace ARDOUR {
#if defined (ARCH_X86) && defined (BUILD_SSE_OPTIMIZATIONS)
-#if 0 /* AVX code doesn't compile on Linux yet, don't use generic code instead */
-
+#ifdef PLATFORM_WINDOWS
+ /* We have AVX-optimized code for Windows */
+
if (fpu->has_avx()) {
-
+#else
+ /* AVX code doesn't compile on Linux yet */
+
+ if (false) {
+#endif
info << "Using AVX optimized routines" << endmsg;
// AVX SET
generic_mix_functions = false;
- } else
-#endif
- if (fpu->has_sse()) {
+ } else if (fpu->has_sse()) {
info << "Using SSE optimized routines" << 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
}
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"));
* $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_("presets"));
new_name = Glib::build_filename (new_dir, X_("presets"));
-
+
copy_recurse (old_name, new_name);
/* presets */
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<string> 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"));
ARDOUR::check_for_old_configuration_files ()
{
int current_version = atoi (X_(PROGRAM_VERSION));
-
+
if (current_version <= 1) {
return;
}
#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;
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);
}
void
-ARDOUR::cleanup ()
+ARDOUR::cleanup ()
{
if (!libardour_initialized) {
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()
{
ARDOUR::setup_fpu ()
{
FPU* fpu = FPU::instance ();
-
+
if (getenv ("ARDOUR_RUNNING_UNDER_VALGRIND")) {
// valgrind doesn't understand this assembler stuff
// September 10th, 2007
#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:
if (fd < 0) {
return false;
}
-
+
char c;
-
+
if (yn) {
c = '1';
} else {
c = '0';
}
-
+
(void) ::write (fd, &c, 1);
(void) ::close (fd);
#include <mach/mach_time.h>
#define CLOCK_REALTIME 0
#define CLOCK_MONOTONIC 0
-int
+int
clock_gettime (int /*clk_id*/, struct timespec *t)
{
static bool initialized = false;
return 0;
}
#endif
-
+
microseconds_t
ARDOUR::get_microseconds ()
{