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