1 /** 2 * Translation of the VST SDK. 3 * Copyright: Steinberg. 4 * License: To use this file you MUST agree with the Steinberg VST license included in the VST SDK. 5 * Authors: D translation by Guillaume Piolat. 6 */ 7 module dplug.vst.aeffect; 8 9 import core.stdc..string; // for strncpy 10 11 /** Define SDK Version (you can generate different versions (from 2.0 to 2.4) of this SDK by unsetting the unwanted extensions). */ 12 13 version = VST_2_1_EXTENSIONS; /// Version 2.1 extensions (08-06-2000) 14 version = VST_2_2_EXTENSIONS; /// Version 2.2 extensions (08-06-2001) 15 version = VST_2_3_EXTENSIONS; /// Version 2.3 extensions (20-05-2003) 16 version = VST_2_4_EXTENSIONS; /// Version 2.4 extensions (01-01-2006) 17 18 /** Current VST Version */ 19 version(VST_2_4_EXTENSIONS) 20 enum kVstVersion = 2400; 21 else version(VST_2_3_EXTENSIONS) 22 enum kVstVersion = 2300; 23 else version(VST_2_2_EXTENSIONS) 24 enum kVstVersion = 2200; 25 else version(VST_2_1_EXTENSIONS) 26 enum kVstVersion = 2100; 27 else 28 enum kVstVersion = 2; 29 30 /** Define for 64 Bit Platform. */ 31 static if((void*).sizeof == 8) 32 { 33 version = VST_64BIT_PLATFORM; 34 } 35 36 //------------------------------------------------------------------------------------------------------- 37 // Integral Types 38 //------------------------------------------------------------------------------------------------------- 39 alias short VstInt16; 40 alias int VstInt32; 41 alias long VstInt64; 42 alias ptrdiff_t VstIntPtr; 43 44 alias extern(C) nothrow VstIntPtr function(AEffect* effect, VstInt32 opcode, VstInt32 index, VstIntPtr value, void* ptr, float opt) AEffectDispatcherProc; 45 alias extern(C) nothrow @nogc VstIntPtr function(AEffect* effect, VstInt32 opcode, VstInt32 index, VstIntPtr value, void* ptr, float opt) HostCallbackFunction; 46 alias extern(C) nothrow void function(AEffect* effect, float** inputs, float** outputs, VstInt32 sampleFrames) AEffectProcessProc; 47 alias extern(C) nothrow void function(AEffect* effect, double** inputs, double** outputs, VstInt32 sampleFrames) AEffectProcessDoubleProc; 48 alias extern(C) nothrow void function(AEffect* effect, VstInt32 index, float parameter) AEffectSetParameterProc; 49 alias extern(C) nothrow float function(AEffect* effect, VstInt32 index) AEffectGetParameterProc; 50 51 /** AEffect magic number */ 52 enum kEffectMagic = CCONST('V', 's', 't', 'P'); 53 54 /// Basic VST Effect "C" Interface. 55 align(8) struct AEffect 56 { 57 VstInt32 magic; ///< must be #kEffectMagic ('VstP') 58 59 /** Host to Plug-in dispatcher @see AudioEffect::dispatcher */ 60 AEffectDispatcherProc dispatcher; 61 62 /** \deprecated Accumulating process mode is deprecated in VST 2.4! Use AEffect::processReplacing instead! */ 63 AEffectProcessProc DEPRECATED_process; 64 65 /** Set value of automatable parameter @see AudioEffect::setParameter */ 66 AEffectSetParameterProc setParameter; 67 68 /** Returns current value of automatable parameter @see AudioEffect::getParameter*/ 69 AEffectGetParameterProc getParameter; 70 71 VstInt32 numPrograms; ///< number of programs 72 VstInt32 numParams; ///< all programs are assumed to have numParams parameters 73 VstInt32 numInputs; ///< number of audio inputs 74 VstInt32 numOutputs; ///< number of audio outputs 75 76 VstInt32 flags; ///< @see VstAEffectFlags 77 78 VstIntPtr resvd1; ///< reserved for Host, must be 0 79 VstIntPtr resvd2; ///< reserved for Host, must be 0 80 81 VstInt32 initialDelay; ///< for algorithms which need input in the first place (Group delay or latency in Samples). This value should be initialized in a resume state. 82 83 VstInt32 DEPRECATED_realQualities; ///< \deprecated unused member 84 VstInt32 DEPRECATED_offQualities; ///< \deprecated unused member 85 float DEPRECATED_ioRatio; ///< \deprecated unused member 86 87 void* object; ///< #AudioEffect class pointer 88 void* user; ///< user-defined pointer 89 90 VstInt32 uniqueID; ///< registered unique identifier (register it at Steinberg 3rd party support Web). This is used to identify a plug-in during save+load of preset and project. 91 VstInt32 version_; ///< plug-in version (example 1100 for version 1.1.0.0) 92 93 /** Process audio samples in replacing mode @see AudioEffect::processReplacing */ 94 AEffectProcessProc processReplacing; 95 96 version(VST_2_4_EXTENSIONS) 97 { 98 /** Process double-precision audio samples in replacing mode @see AudioEffect::processDoubleReplacing */ 99 AEffectProcessDoubleProc processDoubleReplacing; 100 101 char[56] future; ///< reserved for future use (please zero) 102 } 103 else 104 { 105 char[60] future; ///< reserved for future use (please zero) 106 } 107 } 108 109 /// AEffect flags 110 alias int VstAEffectFlags; 111 enum : VstAEffectFlags 112 { 113 effFlagsHasEditor = 1 << 0, /// set if the plug-in provides a custom editor 114 effFlagsCanReplacing = 1 << 4, /// supports replacing process mode (which should the default mode in VST 2.4) 115 effFlagsProgramChunks = 1 << 5, /// program data is handled in formatless chunks 116 effFlagsIsSynth = 1 << 8, /// plug-in is a synth (VSTi), Host may assign mixer channels for its outputs 117 effFlagsNoSoundInStop = 1 << 9, /// plug-in does not produce sound when input is all silence 118 119 DEPRECATED_effFlagsHasClip = 1 << 1, /// deprecated in VST 2.4 120 DEPRECATED_effFlagsHasVu = 1 << 2, /// deprecated in VST 2.4 121 DEPRECATED_effFlagsCanMono = 1 << 3, /// deprecated in VST 2.4 122 DEPRECATED_effFlagsExtIsAsync = 1 << 10, /// deprecated in VST 2.4 123 DEPRECATED_effFlagsExtHasBuffer = 1 << 11 /// deprecated in VST 2.4 124 } 125 126 version(VST_2_4_EXTENSIONS) 127 { 128 enum : VstAEffectFlags 129 { 130 effFlagsCanDoubleReplacing = 1 << 12, ///< plug-in supports double precision processing (VST 2.4) 131 } 132 } 133 134 135 /// Basic dispatcher Opcodes (Host to Plug-in) */ 136 alias int AEffectOpcodes; 137 enum : AEffectOpcodes 138 { 139 effOpen = 0, ///< no arguments @see AudioEffect::open 140 effClose, ///< no arguments @see AudioEffect::close 141 142 effSetProgram, ///< [value]: program number @see AudioEffect::setProgram 143 effGetProgram, ///< [return value]: current program number @see AudioEffect::getProgram 144 effSetProgramName, ///< [ptr]: char* with program name, limited to #kVstMaxProgNameLen @see AudioEffect::setProgramName 145 effGetProgramName, ///< [ptr]: char buffer for current program name, limited to #kVstMaxProgNameLen @see AudioEffect::getProgramName 146 147 effGetParamLabel, ///< [ptr]: char buffer for parameter label, limited to #kVstMaxParamStrLen @see AudioEffect::getParameterLabel 148 effGetParamDisplay, ///< [ptr]: char buffer for parameter display, limited to #kVstMaxParamStrLen @see AudioEffect::getParameterDisplay 149 effGetParamName, ///< [ptr]: char buffer for parameter name, limited to #kVstMaxParamStrLen @see AudioEffect::getParameterName 150 151 DEPRECATED_effGetVu, ///< \deprecated deprecated in VST 2.4 152 153 effSetSampleRate, ///< [opt]: sample rate for audio processing @see AudioEffect::setSampleRate 154 effSetBlockSize, ///< [value]: maximum block size for audio processing @see AudioEffect::setBlockSize 155 effMainsChanged, ///< [value]: 0 means "turn off", 1 means "turn on" @see AudioEffect::suspend @see AudioEffect::resume 156 157 effEditGetRect, ///< [ptr]: #ERect** receiving pointer to editor size @see ERect @see AEffEditor::getRect 158 effEditOpen, ///< [ptr]: system dependent Window pointer, e.g. HWND on Windows @see AEffEditor::open 159 effEditClose, ///< no arguments @see AEffEditor::close 160 161 DEPRECATED_effEditDraw, ///< \deprecated deprecated in VST 2.4 162 DEPRECATED_effEditMouse, ///< \deprecated deprecated in VST 2.4 163 DEPRECATED_effEditKey, ///< \deprecated deprecated in VST 2.4 164 165 effEditIdle, ///< no arguments @see AEffEditor::idle 166 167 DEPRECATED_effEditTop, ///< \deprecated deprecated in VST 2.4 168 DEPRECATED_effEditSleep, ///< \deprecated deprecated in VST 2.4 169 DEPRECATED_effIdentify, ///< \deprecated deprecated in VST 2.4 170 171 effGetChunk, ///< [ptr]: void** for chunk data address [index]: 0 for bank, 1 for program @see AudioEffect::getChunk 172 effSetChunk, ///< [ptr]: chunk data [value]: byte size [index]: 0 for bank, 1 for program @see AudioEffect::setChunk 173 174 effNumOpcodes 175 } 176 177 /// Basic dispatcher Opcodes (Plug-in to Host) 178 alias int AudioMasterOpcodes; 179 enum : AudioMasterOpcodes 180 { 181 audioMasterAutomate = 0, ///< [index]: parameter index [opt]: parameter value @see AudioEffect::setParameterAutomated 182 audioMasterVersion, ///< [return value]: Host VST version (for example 2400 for VST 2.4) @see AudioEffect::getMasterVersion 183 audioMasterCurrentId, ///< [return value]: current unique identifier on shell plug-in @see AudioEffect::getCurrentUniqueId 184 audioMasterIdle, ///< no arguments @see AudioEffect::masterIdle 185 DEPRECATED_audioMasterPinConnected ///< \deprecated deprecated in VST 2.4 r2 186 } 187 188 /// String length limits (in characters excl. 0 byte) 189 enum VstStringConstants 190 { 191 kVstMaxProgNameLen = 24, ///< used for #effGetProgramName, #effSetProgramName, #effGetProgramNameIndexed 192 kVstMaxParamStrLen = 8, ///< used for #effGetParamLabel, #effGetParamDisplay, #effGetParamName 193 kVstMaxVendorStrLen = 64, ///< used for #effGetVendorString, #audioMasterGetVendorString 194 kVstMaxProductStrLen = 64, ///< used for #effGetProductString, #audioMasterGetProductString 195 kVstMaxEffectNameLen = 32 ///< used for #effGetEffectName 196 } 197 198 199 /// String copy taking care of null terminator. 200 char* vst_strncpy (char* dst, const char* src, size_t maxLen) 201 { 202 char* result = strncpy (dst, src, maxLen); 203 dst[maxLen] = 0; 204 return result; 205 } 206 207 //------------------------------------------------------------------------------------------------------- 208 /** String concatenation taking care of null terminator. */ 209 //------------------------------------------------------------------------------------------------------- 210 char* vst_strncat (char* dst, const char* src, size_t maxLen) 211 { 212 char* result = strncat (dst, src, maxLen); 213 dst[maxLen] = 0; 214 return result; 215 } 216 217 //------------------------------------------------------------------------------------------------------- 218 /** Cast #VstIntPtr to pointer. */ 219 //------------------------------------------------------------------------------------------------------- 220 T* FromVstPtr(T)(VstIntPtr arg) 221 { 222 T** address = cast(T**)&arg; 223 return *address; 224 } 225 226 //------------------------------------------------------------------------------------------------------- 227 /** Cast pointer to #VstIntPtr. */ 228 //------------------------------------------------------------------------------------------------------- 229 VstIntPtr ToVstPtr(T)(T* ptr) 230 { 231 VstIntPtr* address = cast(VstIntPtr*)&ptr; 232 return *address; 233 } 234 235 /// Structure used for #effEditGetRect. 236 struct ERect 237 { 238 VstInt16 top; ///< top coordinate 239 VstInt16 left; ///< left coordinate 240 VstInt16 bottom; ///< bottom coordinate 241 VstInt16 right; ///< right coordinate 242 } 243 244 /** Four Character Constant (for AEffect->uniqueID) */ 245 private int CCONST(int a, int b, int c, int d) pure nothrow 246 { 247 return (a << 24) | (b << 16) | (c << 8) | (d << 0); 248 }