#include <errno.h>
#include <time.h>
+#include <glib.h>
+#include <pbd/gstdio_compat.h>
+
#ifdef PLATFORM_WINDOWS
#include <windows.h> // for LARGE_INTEGER
#endif
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<void,std::string> ARDOUR::BootMessage;
PBD::Signal3<void,std::string,std::string,bool> ARDOUR::PluginScanMessage;
PBD::Signal0<void> ARDOUR::GUIIdle;
PBD::Signal3<bool,std::string,std::string,int> ARDOUR::CopyConfigurationFiles;
+static bool have_old_configuration_files = false;
+
namespace ARDOUR {
extern void setup_enum_writer ();
}
if (try_optimization) {
- FPU fpu;
+ FPU* fpu = FPU::instance();
#if defined (ARCH_X86) && defined (BUILD_SSE_OPTIMIZATIONS)
- if (fpu.has_sse()) {
+#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
+ 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;
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;
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;
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;
}
#endif
}
-int
-ARDOUR::copy_configuration_files (string const & old_dir, string const & new_dir, int old_version)
+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, "recent");
- new_name = Glib::build_filename (new_dir, "recent");
+ old_name = Glib::build_filename (old_dir, X_("recent"));
+ new_name = Glib::build_filename (new_dir, X_("recent"));
copy_file (old_name, new_name);
- /* can only copy ardour.rc - UI config is not compatible */
+ 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"));
+ }
- old_name = Glib::build_filename (old_dir, "ardour.rc");
- new_name = Glib::build_filename (new_dir, "config");
+ 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, "templates");
- new_name = Glib::build_filename (new_dir, "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, "route_templates");
- new_name = Glib::build_filename (new_dir, "route_templates");
+ 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, "presets");
- new_name = Glib::build_filename (new_dir, "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, "plugin_statuses");
- new_name = Glib::build_filename (new_dir, "plugin_statuses");
+ 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);
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, "*.format");
+ find_files_matching_pattern (export_formats, old_name, X_("*.format"));
for (vector<string>::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));
return 0;
}
-static void
-maybe_copy_old_configuration_files ()
+void
+ARDOUR::check_for_old_configuration_files ()
{
- int version = atoi (X_(PROGRAM_VERSION));
-
- if (version <= 1) {
+ int current_version = atoi (X_(PROGRAM_VERSION));
+
+ if (current_version <= 1) {
return;
}
- version--;
+ int old_version = current_version - 1;
- string old_config_dir = user_config_directory (version);
+ 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 (old_config_dir, Glib::FILE_TEST_IS_DIR)) {
- string current_config_dir = user_config_directory ();
- boost::optional<bool> r = CopyConfigurationFiles (old_config_dir, current_config_dir, version); /* EMIT SIGNAL */
- if (r) {
- if (r.get()) {
- copy_configuration_files (old_config_dir, current_config_dir, 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<bool (std::string const&, std::string const&, int)> 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
// allow ardour the absolute maximum number of open files
lotsa_files_please ();
- maybe_copy_old_configuration_files ();
-
#ifdef HAVE_LRDF
lrdf_init();
#endif
void
ARDOUR::setup_fpu ()
{
-
+ FPU* fpu = FPU::instance ();
+
if (getenv ("ARDOUR_RUNNING_UNDER_VALGRIND")) {
// valgrind doesn't understand this assembler stuff
// September 10th, 2007
#if defined(ARCH_X86) && defined(USE_XMMINTRIN)
int MXCSR;
- FPU fpu;
-
- /* XXX use real code to determine if the processor supports
- DenormalsAreZero and FlushToZero
- */
- if (!fpu.has_flush_to_zero() && !fpu.has_denormals_are_zero()) {
+ if (!fpu->has_flush_to_zero() && !fpu->has_denormals_are_zero()) {
return;
}
break;
case DenormalFTZ:
- if (fpu.has_flush_to_zero()) {
+ if (fpu->has_flush_to_zero()) {
MXCSR |= _MM_FLUSH_ZERO_ON;
}
break;
case DenormalDAZ:
MXCSR &= ~_MM_FLUSH_ZERO_ON;
- if (fpu.has_denormals_are_zero()) {
+ if (fpu->has_denormals_are_zero()) {
MXCSR |= 0x40;
}
break;
case DenormalFTZDAZ:
- if (fpu.has_flush_to_zero()) {
- if (fpu.has_denormals_are_zero()) {
+ if (fpu->has_flush_to_zero()) {
+ if (fpu->has_denormals_are_zero()) {
MXCSR |= _MM_FLUSH_ZERO_ON | 0x40;
} else {
MXCSR |= _MM_FLUSH_ZERO_ON;
bool
ARDOUR::translations_are_enabled ()
{
- int fd = ::open (ARDOUR::translation_enable_path().c_str(), O_RDONLY);
+ int fd = g_open (ARDOUR::translation_enable_path().c_str(), O_RDONLY, 0444);
if (fd < 0) {
return translate_by_default;
ARDOUR::set_translations_enabled (bool yn)
{
string i18n_enabler = ARDOUR::translation_enable_path();
- int fd = ::open (i18n_enabler.c_str(), O_WRONLY|O_CREAT|O_TRUNC, 0644);
+ int fd = g_open (i18n_enabler.c_str(), O_WRONLY|O_CREAT|O_TRUNC, 0644);
if (fd < 0) {
return false;