DPF

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

DistrhoUtils.cpp (5163B)


      1 /*
      2  * DISTRHO Plugin Framework (DPF)
      3  * Copyright (C) 2012-2024 Filipe Coelho <falktx@falktx.com>
      4  *
      5  * Permission to use, copy, modify, and/or distribute this software for any purpose with
      6  * or without fee is hereby granted, provided that the above copyright notice and this
      7  * permission notice appear in all copies.
      8  *
      9  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD
     10  * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN
     11  * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
     12  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
     13  * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
     14  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
     15  */
     16 
     17 #ifndef DISTRHO_IS_STANDALONE
     18 # error Wrong build configuration
     19 #endif
     20 
     21 #include "../extra/String.hpp"
     22 #include "../DistrhoStandaloneUtils.hpp"
     23 
     24 #ifdef DISTRHO_OS_WINDOWS
     25 # include <windows.h>
     26 #else
     27 # ifndef STATIC_BUILD
     28 #  include <dlfcn.h>
     29 # endif
     30 # include <limits.h>
     31 # include <stdlib.h>
     32 #endif
     33 
     34 #ifdef DISTRHO_OS_WINDOWS
     35 # if DISTRHO_IS_STANDALONE || defined(STATIC_BUILD)
     36 static constexpr const HINSTANCE hInstance = nullptr;
     37 # else
     38 static HINSTANCE hInstance = nullptr;
     39 
     40 DISTRHO_PLUGIN_EXPORT
     41 BOOL WINAPI DllMain(HINSTANCE hInst, DWORD reason, LPVOID)
     42 {
     43     if (reason == DLL_PROCESS_ATTACH)
     44         hInstance = hInst;
     45     return 1;
     46 }
     47 # endif
     48 #endif
     49 
     50 START_NAMESPACE_DISTRHO
     51 
     52 // --------------------------------------------------------------------------------------------------------------------
     53 
     54 const char* getBinaryFilename()
     55 {
     56     static String filename;
     57 
     58   #ifndef STATIC_BUILD
     59     if (filename.isNotEmpty())
     60         return filename;
     61 
     62    #ifdef DISTRHO_OS_WINDOWS
     63     CHAR filenameBuf[MAX_PATH];
     64     filenameBuf[0] = '\0';
     65     GetModuleFileNameA(hInstance, filenameBuf, sizeof(filenameBuf));
     66     filename = filenameBuf;
     67    #else
     68     Dl_info info;
     69     dladdr((void*)getBinaryFilename, &info);
     70     char filenameBuf[PATH_MAX];
     71     filename = realpath(info.dli_fname, filenameBuf);
     72    #endif
     73   #endif
     74 
     75     return filename;
     76 }
     77 
     78 const char* getPluginFormatName() noexcept
     79 {
     80 #if defined(DISTRHO_PLUGIN_TARGET_AU)
     81     return "AudioUnit";
     82 #elif defined(DISTRHO_PLUGIN_TARGET_CARLA)
     83     return "Carla";
     84 #elif defined(DISTRHO_PLUGIN_TARGET_JACK)
     85    #if defined(DISTRHO_OS_WASM)
     86     return "Wasm/Standalone";
     87    #elif defined(HAVE_JACK)
     88     return "JACK/Standalone";
     89    #else
     90     return "Standalone";
     91    #endif
     92 #elif defined(DISTRHO_PLUGIN_TARGET_LADSPA)
     93     return "LADSPA";
     94 #elif defined(DISTRHO_PLUGIN_TARGET_DSSI)
     95     return "DSSI";
     96 #elif defined(DISTRHO_PLUGIN_TARGET_LV2)
     97     return "LV2";
     98 #elif defined(DISTRHO_PLUGIN_TARGET_VST2)
     99     return "VST2";
    100 #elif defined(DISTRHO_PLUGIN_TARGET_VST3)
    101     return "VST3";
    102 #elif defined(DISTRHO_PLUGIN_TARGET_CLAP)
    103     return "CLAP";
    104 #elif defined(DISTRHO_PLUGIN_TARGET_STATIC) && defined(DISTRHO_PLUGIN_TARGET_STATIC_NAME)
    105     return DISTRHO_PLUGIN_TARGET_STATIC_NAME;
    106 #else
    107     return "Unknown";
    108 #endif
    109 }
    110 
    111 const char* getResourcePath(const char* const bundlePath) noexcept
    112 {
    113     DISTRHO_SAFE_ASSERT_RETURN(bundlePath != nullptr, nullptr);
    114 
    115    #if defined(DISTRHO_PLUGIN_TARGET_AU) || defined(DISTRHO_PLUGIN_TARGET_JACK) || defined(DISTRHO_PLUGIN_TARGET_VST2) || defined(DISTRHO_PLUGIN_TARGET_CLAP)
    116     static String resourcePath;
    117 
    118     if (resourcePath.isEmpty())
    119     {
    120         resourcePath = bundlePath;
    121        #ifdef DISTRHO_OS_MAC
    122         resourcePath += "/Contents/Resources";
    123        #else
    124         resourcePath += DISTRHO_OS_SEP_STR "resources";
    125        #endif
    126     }
    127 
    128     return resourcePath.buffer();
    129    #elif defined(DISTRHO_PLUGIN_TARGET_LV2)
    130     static String resourcePath;
    131 
    132     if (resourcePath.isEmpty())
    133     {
    134         resourcePath = bundlePath;
    135         resourcePath += DISTRHO_OS_SEP_STR "resources";
    136     }
    137 
    138     return resourcePath.buffer();
    139    #elif defined(DISTRHO_PLUGIN_TARGET_VST3)
    140     static String resourcePath;
    141 
    142     if (resourcePath.isEmpty())
    143     {
    144         resourcePath = bundlePath;
    145         resourcePath += "/Contents/Resources";
    146     }
    147 
    148     return resourcePath.buffer();
    149    #endif
    150 
    151     return nullptr;
    152 }
    153 
    154 #ifndef DISTRHO_PLUGIN_TARGET_JACK
    155 // all these are null for non-standalone targets
    156 bool isUsingNativeAudio() noexcept { return false; }
    157 bool supportsAudioInput() { return false; }
    158 bool supportsBufferSizeChanges() { return false; }
    159 bool supportsMIDI() { return false; }
    160 bool isAudioInputEnabled() { return false; }
    161 bool isMIDIEnabled() { return false; }
    162 uint getBufferSize() { return 0; }
    163 bool requestAudioInput() { return false; }
    164 bool requestBufferSizeChange(uint) { return false; }
    165 bool requestMIDI() { return false; }
    166 #endif
    167 
    168 /* define webview start */
    169 #ifdef DPF_USING_LD_LINUX_WEBVIEW
    170 int dpf_webview_start(int argc, char* argv[]);
    171 #endif
    172 
    173 // --------------------------------------------------------------------------------------------------------------------
    174 
    175 END_NAMESPACE_DISTRHO
    176 
    177 #if defined(DPF_USING_LD_LINUX_WEBVIEW) && !DISTRHO_IS_STANDALONE
    178 int main(int argc, char* argv[])
    179 {
    180     return DISTRHO_NAMESPACE::dpf_webview_start(argc, argv);
    181 }
    182 #endif