| 
							- /*
 -  * Thread-safe fftw
 -  * Copyright (C) 2018-2019 Filipe Coelho <falktx@falktx.com>
 -  *
 -  * This program is free software; you can redistribute it and/or
 -  * modify it under the terms of the GNU General Public License as
 -  * published by the Free Software Foundation; either version 2 of
 -  * the License, or any later version.
 -  *
 -  * This program is distributed in the hope that it will be useful,
 -  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 -  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 -  * GNU General Public License for more details.
 -  *
 -  * For a full copy of the GNU General Public License see the doc/GPL.txt file.
 -  */
 - 
 - #ifndef THREAD_SAFE_FFTW_HPP_INCLUDED
 - #define THREAD_SAFE_FFTW_HPP_INCLUDED
 - 
 - #include "CarlaDefines.h"
 - 
 - #ifdef CARLA_OS_UNIX
 - // --------------------------------------------------------------------------------------------------------------------
 - // Thread-safe fftw
 - 
 - #include "CarlaLibUtils.hpp"
 - 
 - class ThreadSafeFFTW
 - {
 - public:
 -     typedef void (*void_func)(void);
 - 
 -     struct Deinitializer {
 -         Deinitializer(ThreadSafeFFTW& s)
 -             : tsfftw(s) {}
 - 
 -         ~Deinitializer()
 -         {
 -             tsfftw.deinit();
 -         }
 - 
 -         ThreadSafeFFTW& tsfftw;
 -     };
 - 
 -     ThreadSafeFFTW()
 -         : initialized(false),
 -           libfftw3(nullptr),
 -           libfftw3f(nullptr),
 -           libfftw3l(nullptr),
 -           libfftw3q(nullptr) {}
 - 
 -     ~ThreadSafeFFTW()
 -     {
 -         CARLA_SAFE_ASSERT(libfftw3 == nullptr);
 -     }
 - 
 -     void init()
 -     {
 -         if (initialized)
 -             return;
 -         initialized = true;
 - 
 -         if ((libfftw3 = lib_open("libfftw3_threads.so.3")) != nullptr)
 -             if (const void_func func = lib_symbol<void_func>(libfftw3, "fftw_make_planner_thread_safe"))
 -                 func();
 - 
 -         if ((libfftw3f = lib_open("libfftw3f_threads.so.3")) != nullptr)
 -             if (const void_func func = lib_symbol<void_func>(libfftw3f, "fftwf_make_planner_thread_safe"))
 -                 func();
 - 
 -         if ((libfftw3l = lib_open("libfftw3l_threads.so.3")) != nullptr)
 -             if (const void_func func = lib_symbol<void_func>(libfftw3l, "fftwl_make_planner_thread_safe"))
 -                 func();
 - 
 -         if ((libfftw3q = lib_open("libfftw3q_threads.so.3")) != nullptr)
 -             if (const void_func func = lib_symbol<void_func>(libfftw3q, "fftwq_make_planner_thread_safe"))
 -                 func();
 -     }
 - 
 -     void deinit()
 -     {
 -         if (! initialized)
 -             return;
 -         initialized = false;
 - 
 -         if (libfftw3 != nullptr)
 -         {
 -             lib_close(libfftw3);
 -             libfftw3 = nullptr;
 -         }
 - 
 -         if (libfftw3f != nullptr)
 -         {
 -             lib_close(libfftw3f);
 -             libfftw3f = nullptr;
 -         }
 - 
 -         if (libfftw3l != nullptr)
 -         {
 -             lib_close(libfftw3l);
 -             libfftw3l = nullptr;
 -         }
 - 
 -         if (libfftw3q != nullptr)
 -         {
 -             lib_close(libfftw3q);
 -             libfftw3q = nullptr;
 -         }
 -     }
 - 
 - private:
 -     bool initialized;
 -     lib_t libfftw3;
 -     lib_t libfftw3f;
 -     lib_t libfftw3l;
 -     lib_t libfftw3q;
 - 
 -     CARLA_DECLARE_NON_COPY_CLASS(ThreadSafeFFTW)
 - };
 - #endif
 - 
 - // --------------------------------------------------------------------------------------------------------------------
 - 
 - #endif // THREAD_SAFE_FFTW_HPP_INCLUDED
 
 
  |