DPF

DISTRHO Plugin Framework
Log | Files | Refs | Submodules | README | LICENSE

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:
Mdistrho/src/DistrhoPluginJACK.cpp | 25+++++++++++++++++++++++++
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);