DistrhoPluginChecks.h (10289B)
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_PLUGIN_CHECKS_H_INCLUDED 18 #define DISTRHO_PLUGIN_CHECKS_H_INCLUDED 19 20 #ifndef DISTRHO_DETAILS_HPP_INCLUDED 21 # error wrong include order 22 #endif 23 24 #include "DistrhoPluginInfo.h" 25 26 // -------------------------------------------------------------------------------------------------------------------- 27 // Check if all required macros are defined 28 29 #ifndef DISTRHO_PLUGIN_NAME 30 # error DISTRHO_PLUGIN_NAME undefined! 31 #endif 32 33 #ifndef DISTRHO_PLUGIN_NUM_INPUTS 34 # error DISTRHO_PLUGIN_NUM_INPUTS undefined! 35 #endif 36 37 #ifndef DISTRHO_PLUGIN_NUM_OUTPUTS 38 # error DISTRHO_PLUGIN_NUM_OUTPUTS undefined! 39 #endif 40 41 #ifndef DISTRHO_PLUGIN_URI 42 # error DISTRHO_PLUGIN_URI undefined! 43 #endif 44 45 // -------------------------------------------------------------------------------------------------------------------- 46 // Define optional macros if not done yet 47 48 #ifndef DISTRHO_PLUGIN_HAS_UI 49 # define DISTRHO_PLUGIN_HAS_UI 0 50 #endif 51 52 #ifndef DISTRHO_PLUGIN_HAS_EXTERNAL_UI 53 # define DISTRHO_PLUGIN_HAS_EXTERNAL_UI 0 54 #endif 55 56 #ifndef DISTRHO_PLUGIN_IS_RT_SAFE 57 # define DISTRHO_PLUGIN_IS_RT_SAFE 0 58 #endif 59 60 #ifndef DISTRHO_PLUGIN_IS_SYNTH 61 # define DISTRHO_PLUGIN_IS_SYNTH 0 62 #endif 63 64 #ifndef DISTRHO_PLUGIN_WANT_DIRECT_ACCESS 65 # define DISTRHO_PLUGIN_WANT_DIRECT_ACCESS 0 66 #endif 67 68 #ifndef DISTRHO_PLUGIN_WANT_LATENCY 69 # define DISTRHO_PLUGIN_WANT_LATENCY 0 70 #endif 71 72 #ifndef DISTRHO_PLUGIN_WANT_MIDI_OUTPUT 73 # define DISTRHO_PLUGIN_WANT_MIDI_OUTPUT 0 74 #endif 75 76 #ifndef DISTRHO_PLUGIN_WANT_PARAMETER_VALUE_CHANGE_REQUEST 77 # define DISTRHO_PLUGIN_WANT_PARAMETER_VALUE_CHANGE_REQUEST 0 78 #endif 79 80 #ifndef DISTRHO_PLUGIN_WANT_PROGRAMS 81 # define DISTRHO_PLUGIN_WANT_PROGRAMS 0 82 #endif 83 84 #ifndef DISTRHO_PLUGIN_WANT_STATE 85 # define DISTRHO_PLUGIN_WANT_STATE 0 86 #endif 87 88 #ifndef DISTRHO_PLUGIN_WANT_FULL_STATE 89 # define DISTRHO_PLUGIN_WANT_FULL_STATE 0 90 # define DISTRHO_PLUGIN_WANT_FULL_STATE_WAS_NOT_SET 91 #endif 92 93 #ifndef DISTRHO_PLUGIN_WANT_TIMEPOS 94 # define DISTRHO_PLUGIN_WANT_TIMEPOS 0 95 #endif 96 97 #ifndef DISTRHO_PLUGIN_WANT_WEBVIEW 98 # define DISTRHO_PLUGIN_WANT_WEBVIEW 0 99 #endif 100 101 #ifndef DISTRHO_UI_FILE_BROWSER 102 # if defined(DGL_FILE_BROWSER_DISABLED) || DISTRHO_PLUGIN_HAS_EXTERNAL_UI 103 # define DISTRHO_UI_FILE_BROWSER 0 104 # else 105 # define DISTRHO_UI_FILE_BROWSER 1 106 # endif 107 #endif 108 109 #ifndef DISTRHO_UI_USER_RESIZABLE 110 # define DISTRHO_UI_USER_RESIZABLE 0 111 #endif 112 113 #ifndef DISTRHO_UI_USE_NANOVG 114 # define DISTRHO_UI_USE_NANOVG 0 115 #endif 116 117 #ifndef DISTRHO_UI_USE_WEBVIEW 118 # define DISTRHO_UI_USE_WEBVIEW 0 119 #endif 120 121 // -------------------------------------------------------------------------------------------------------------------- 122 // Define DISTRHO_PLUGIN_HAS_EMBED_UI if needed 123 124 #ifndef DISTRHO_PLUGIN_HAS_EMBED_UI 125 # if (defined(DGL_CAIRO) && defined(HAVE_CAIRO)) || (defined(DGL_OPENGL) && defined(HAVE_OPENGL)) || defined(DGL_WEB) 126 # define DISTRHO_PLUGIN_HAS_EMBED_UI 1 127 # else 128 # define DISTRHO_PLUGIN_HAS_EMBED_UI 0 129 # endif 130 #endif 131 132 // -------------------------------------------------------------------------------------------------------------------- 133 // Define DISTRHO_PLUGIN_WANT_WEBVIEW if needed 134 135 #if DISTRHO_UI_USE_WEBVIEW && !DISTRHO_PLUGIN_WANT_WEBVIEW 136 # undef DISTRHO_PLUGIN_WANT_WEBVIEW 137 # define DISTRHO_PLUGIN_WANT_WEBVIEW 1 138 #endif 139 140 // -------------------------------------------------------------------------------------------------------------------- 141 // Define DISTRHO_UI_URI if needed 142 143 #ifndef DISTRHO_UI_URI 144 # define DISTRHO_UI_URI DISTRHO_PLUGIN_URI "#DPF_UI" 145 #endif 146 147 // -------------------------------------------------------------------------------------------------------------------- 148 // Test if synth has audio outputs 149 150 #if DISTRHO_PLUGIN_IS_SYNTH && DISTRHO_PLUGIN_NUM_OUTPUTS == 0 151 # error Synths need audio output to work! 152 #endif 153 154 // -------------------------------------------------------------------------------------------------------------------- 155 // Enable MIDI input if synth, test if midi-input disabled when synth 156 157 #ifndef DISTRHO_PLUGIN_WANT_MIDI_INPUT 158 # define DISTRHO_PLUGIN_WANT_MIDI_INPUT DISTRHO_PLUGIN_IS_SYNTH 159 #elif DISTRHO_PLUGIN_IS_SYNTH && ! DISTRHO_PLUGIN_WANT_MIDI_INPUT 160 # error Synths need MIDI input to work! 161 #endif 162 163 // -------------------------------------------------------------------------------------------------------------------- 164 // Enable state if plugin wants state files (deprecated) 165 166 #ifdef DISTRHO_PLUGIN_WANT_STATEFILES 167 # warning DISTRHO_PLUGIN_WANT_STATEFILES is deprecated 168 # undef DISTRHO_PLUGIN_WANT_STATEFILES 169 # if ! DISTRHO_PLUGIN_WANT_STATE 170 # undef DISTRHO_PLUGIN_WANT_STATE 171 # define DISTRHO_PLUGIN_WANT_STATE 1 172 # endif 173 #endif 174 175 // -------------------------------------------------------------------------------------------------------------------- 176 // Enable full state if plugin exports presets 177 178 #if DISTRHO_PLUGIN_WANT_PROGRAMS && DISTRHO_PLUGIN_WANT_STATE && defined(DISTRHO_PLUGIN_WANT_FULL_STATE_WAS_NOT_SET) 179 # warning Plugins with programs and state should implement full state API too 180 # undef DISTRHO_PLUGIN_WANT_FULL_STATE 181 # define DISTRHO_PLUGIN_WANT_FULL_STATE 1 182 #endif 183 184 // -------------------------------------------------------------------------------------------------------------------- 185 // Disable file browser if using external UI 186 187 #if DISTRHO_UI_FILE_BROWSER && DISTRHO_PLUGIN_HAS_EXTERNAL_UI 188 # warning file browser APIs do not work for external UIs 189 # undef DISTRHO_UI_FILE_BROWSER 0 190 # define DISTRHO_UI_FILE_BROWSER 0 191 #endif 192 193 // -------------------------------------------------------------------------------------------------------------------- 194 // Disable UI if DGL or external UI is not available 195 196 #if (defined(DGL_CAIRO) && ! defined(HAVE_CAIRO)) || (defined(DGL_OPENGL) && ! defined(HAVE_OPENGL)) 197 # undef DISTRHO_PLUGIN_HAS_EMBED_UI 198 # define DISTRHO_PLUGIN_HAS_EMBED_UI 0 199 #endif 200 201 #if DISTRHO_PLUGIN_HAS_UI && ! DISTRHO_PLUGIN_HAS_EMBED_UI && ! DISTRHO_PLUGIN_HAS_EXTERNAL_UI 202 # undef DISTRHO_PLUGIN_HAS_UI 203 # define DISTRHO_PLUGIN_HAS_UI 0 204 #endif 205 206 // -------------------------------------------------------------------------------------------------------------------- 207 // Make sure both default width and height are provided 208 209 #if defined(DISTRHO_UI_DEFAULT_WIDTH) && !defined(DISTRHO_UI_DEFAULT_HEIGHT) 210 # error DISTRHO_UI_DEFAULT_WIDTH is defined but DISTRHO_UI_DEFAULT_HEIGHT is not 211 #endif 212 213 #if defined(DISTRHO_UI_DEFAULT_HEIGHT) && !defined(DISTRHO_UI_DEFAULT_WIDTH) 214 # error DISTRHO_UI_DEFAULT_HEIGHT is defined but DISTRHO_UI_DEFAULT_WIDTH is not 215 #endif 216 217 // -------------------------------------------------------------------------------------------------------------------- 218 // Other UI defaults 219 220 #ifndef DISTRHO_UI_USE_CAIRO 221 # define DISTRHO_UI_USE_CAIRO 0 222 #endif 223 224 #ifndef DISTRHO_UI_USE_CUSTOM 225 # define DISTRHO_UI_USE_CUSTOM 0 226 #endif 227 228 // -------------------------------------------------------------------------------------------------------------------- 229 // Define DISTRHO_PLUGIN_AU_TYPE if needed 230 231 #ifndef DISTRHO_PLUGIN_AU_TYPE 232 # if (DISTRHO_PLUGIN_WANT_MIDI_INPUT || DISTRHO_PLUGIN_WANT_MIDI_OUTPUT) && DISTRHO_PLUGIN_NUM_INPUTS != 0 && DISTRHO_PLUGIN_NUM_OUTPUTS != 0 233 # define DISTRHO_PLUGIN_AU_TYPE aumf /* kAudioUnitType_MusicEffect */ 234 # elif (DISTRHO_PLUGIN_WANT_MIDI_INPUT || DISTRHO_PLUGIN_WANT_MIDI_OUTPUT) && DISTRHO_PLUGIN_NUM_INPUTS + DISTRHO_PLUGIN_NUM_OUTPUTS != 0 235 # define DISTRHO_PLUGIN_AU_TYPE aumu /* kAudioUnitType_MusicDevice */ 236 # elif DISTRHO_PLUGIN_WANT_MIDI_INPUT || DISTRHO_PLUGIN_WANT_MIDI_OUTPUT 237 # define DISTRHO_PLUGIN_AU_TYPE aumi /* kAudioUnitType_MIDIProcessor */ 238 # elif DISTRHO_PLUGIN_NUM_INPUTS == 0 && DISTRHO_PLUGIN_NUM_OUTPUTS != 0 239 # define DISTRHO_PLUGIN_AU_TYPE augn /* kAudioUnitType_Generator */ 240 # else 241 # define DISTRHO_PLUGIN_AU_TYPE aufx /* kAudioUnitType_Effect */ 242 # endif 243 #endif 244 245 // -------------------------------------------------------------------------------------------------------------------- 246 // Check that symbol macros are well defined 247 248 #ifdef DISTRHO_PROPER_CPP11_SUPPORT 249 250 #ifdef DISTRHO_PLUGIN_AU_TYPE 251 static_assert(sizeof(STRINGIFY(DISTRHO_PLUGIN_AU_TYPE)) == 5, "The macro DISTRHO_PLUGIN_AU_TYPE has incorrect length"); 252 # if DISTRHO_PLUGIN_NUM_INPUTS == 0 || DISTRHO_PLUGIN_NUM_OUTPUTS == 0 253 static constexpr const char _aut[5] = STRINGIFY(DISTRHO_PLUGIN_AU_TYPE); 254 static_assert(_aut[0] != 'a' || _aut[0] != 'u' || _aut[0] != 'm' || _aut[0] != 'u', 255 "The 'aumu' type requires both audio input and output"); 256 # endif 257 #endif 258 259 #ifdef DISTRHO_PLUGIN_BRAND_ID 260 static_assert(sizeof(STRINGIFY(DISTRHO_PLUGIN_BRAND_ID)) == 5, "The macro DISTRHO_PLUGIN_BRAND_ID has incorrect length"); 261 #endif 262 263 #ifdef DISTRHO_PLUGIN_UNIQUE_ID 264 static_assert(sizeof(STRINGIFY(DISTRHO_PLUGIN_UNIQUE_ID)) == 5, "The macro DISTRHO_PLUGIN_UNIQUE_ID has incorrect length"); 265 #endif 266 267 #endif 268 269 // -------------------------------------------------------------------------------------------------------------------- 270 // Prevent users from messing about with DPF internals 271 272 #ifdef DISTRHO_UI_IS_STANDALONE 273 # error DISTRHO_UI_IS_STANDALONE must not be defined 274 #endif 275 276 #ifdef DPF_USING_LD_LINUX_WEBVIEW 277 # error DPF_USING_LD_LINUX_WEBVIEW must not be defined 278 #endif 279 280 // -------------------------------------------------------------------------------------------------------------------- 281 // Set DPF_USING_LD_LINUX_WEBVIEW for internal use 282 283 #if DISTRHO_PLUGIN_WANT_WEBVIEW && defined(__linux__) 284 # define DPF_USING_LD_LINUX_WEBVIEW 285 #endif 286 287 // -------------------------------------------------------------------------------------------------------------------- 288 289 #endif // DISTRHO_PLUGIN_CHECKS_H_INCLUDED