commit 48eb45016b67547b02d2ac644cd2a147da7cf7b9
parent 55a1e21ebbb42a4778f26188a9f75aecb0c1210c
Author: falkTX <falktx@falktx.com>
Date: Thu, 13 Oct 2022 23:18:43 +0100
Make sure to disable denormals for standalone JACK threads
Signed-off-by: falkTX <falktx@falktx.com>
Diffstat:
1 file changed, 25 insertions(+), 0 deletions(-)
diff --git a/distrho/src/DistrhoPluginJACK.cpp b/distrho/src/DistrhoPluginJACK.cpp
@@ -49,6 +49,10 @@
# include <unistd.h>
#endif
+#ifdef __SSE2_MATH__
+# include <xmmintrin.h>
+#endif
+
#ifndef JACK_METADATA_ORDER
# define JACK_METADATA_ORDER "http://jackaudio.org/metadata/order"
#endif
@@ -216,6 +220,7 @@ public:
#endif
}
+ jackbridge_set_thread_init_callback(fClient, jackThreadInitCallback, this);
jackbridge_set_buffer_size_callback(fClient, jackBufferSizeCallback, this);
jackbridge_set_sample_rate_callback(fClient, jackSampleRateCallback, this);
jackbridge_set_process_callback(fClient, jackProcessCallback, this);
@@ -687,6 +692,26 @@ private:
#define thisPtr ((PluginJack*)ptr)
+ static void jackThreadInitCallback(void*)
+ {
+ #if defined(__SSE2_MATH__)
+ _mm_setcsr(_mm_getcsr() | 0x8040);
+ #elif defined(__aarch64__)
+ uint64_t c;
+ __asm__ __volatile__("mrs %0, fpcr \n"
+ "orr %0, %0, #0x1000000\n"
+ "msr fpcr, %0 \n"
+ "isb \n"
+ : "=r"(c) :: "memory");
+ #elif defined(__arm__)
+ uint32_t c;
+ __asm__ __volatile__("vmrs %0, fpscr \n"
+ "orr %0, %0, #0x1000000\n"
+ "vmsr fpscr, %0 \n"
+ : "=r"(c) :: "memory");
+ #endif
+ }
+
static int jackBufferSizeCallback(jack_nframes_t nframes, void* ptr)
{
thisPtr->jackBufferSize(nframes);