From 48eb45016b67547b02d2ac644cd2a147da7cf7b9 Mon Sep 17 00:00:00 2001 From: falkTX Date: Thu, 13 Oct 2022 23:19:10 +0100 Subject: [PATCH] Make sure to disable denormals for standalone JACK threads Signed-off-by: falkTX --- distrho/src/DistrhoPluginJACK.cpp | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/distrho/src/DistrhoPluginJACK.cpp b/distrho/src/DistrhoPluginJACK.cpp index 12121382..94c9c300 100644 --- a/distrho/src/DistrhoPluginJACK.cpp +++ b/distrho/src/DistrhoPluginJACK.cpp @@ -49,6 +49,10 @@ # include #endif +#ifdef __SSE2_MATH__ +# include +#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);