DPF

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

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