/* * VstDefinitions.h * ---------------- * Purpose: Definition of all VST-related constants, function prototypes and structures. * Notes : Based on BeRo's independent VST header, a clean-room implementation based * on several third-party information sources. * The original header, licensed under the Zlib license, can be found at * https://github.com/BeRo1985/br808/blob/master/VSTi/VST/VST.pas * Authors: OpenMPT Devs * Benjamin "BeRo" Rosseaux * The OpenMPT source code is released under the BSD license. Read LICENSE for more details. */ #pragma once #include "openmpt/all/BuildSettings.hpp" #if MPT_OS_WINDOWS #define VSTCALLBACK __cdecl #else #define VSTCALLBACK #endif namespace Vst { inline constexpr int32 kVstVersion = 2400; enum VstStringLengths { kVstMaxProgNameLen = 24, kVstMaxParamStrLen = 8, kVstMaxVendorStrLen = 64, kVstMaxProductStrLen = 64, kVstMaxEffectNameLen = 32, kVstMaxNameLen = 64, kVstMaxLabelLen = 64, kVstMaxShortLabelLen = 8, kVstMaxCategLabelLen = 24, kVstMaxFileNameLen = 100, }; enum VstFlags : int32 { effFlagsHasEditor = 1 << 0, effFlagsHasClip = 1 << 1, effFlagsHasVu = 1 << 2, effFlagsCanMono = 1 << 3, effFlagsCanReplacing = 1 << 4, effFlagsProgramChunks = 1 << 5, effFlagsIsSynth = 1 << 8, effFlagsNoSoundInStop = 1 << 9, effFlagsExtIsAsync = 1 << 10, effFlagsExtHasBuffer = 1 << 11, effFlagsCanDoubleReplacing = 1 << 12, }; enum VstOpcodeToPlugin : int32 { effOpen = 0, effClose = 1, effSetProgram = 2, effGetProgram = 3, effSetProgramName = 4, effGetProgramName = 5, effGetParamLabel = 6, effGetParamDisplay = 7, effGetParamName = 8, effGetVu = 9, effSetSampleRate = 10, effSetBlockSize = 11, effMainsChanged = 12, effEditGetRect = 13, effEditOpen = 14, effEditClose = 15, effEditDraw = 16, effEditMouse = 17, effEditKey = 18, effEditIdle = 19, effEditTop = 20, effEditSleep = 21, effIdentify = 22, effGetChunk = 23, effSetChunk = 24, effProcessEvents = 25, effCanBeAutomated = 26, effString2Parameter = 27, effGetNumProgramCategories = 28, effGetProgramNameIndexed = 29, effCopyProgram = 30, effConnectInput = 31, effConnectOutput = 32, effGetInputProperties = 33, effGetOutputProperties = 34, effGetPlugCategory = 35, effGetCurrentPosition = 36, effGetDestinationBuffer = 37, effOfflineNotify = 38, effOfflinePrepare = 39, effOfflineRun = 40, effProcessVarIo = 41, effSetSpeakerArrangement = 42, effSetBlockSizeAndSampleRate = 43, effSetBypass = 44, effGetEffectName = 45, effGetErrorText = 46, effGetVendorString = 47, effGetProductString = 48, effGetVendorVersion = 49, effVendorSpecific = 50, effCanDo = 51, effGetTailSize = 52, effIdle = 53, effGetIcon = 54, effSetViewPosition = 55, effGetParameterProperties = 56, effKeysRequired = 57, effGetVstVersion = 58, effEditKeyDown = 59, effEditKeyUp = 60, effSetEditKnobMode = 61, effGetMidiProgramName = 62, effGetCurrentMidiProgram = 63, effGetMidiProgramCategory = 64, effHasMidiProgramsChanged = 65, effGetMidiKeyName = 66, effBeginSetProgram = 67, effEndSetProgram = 68, effGetSpeakerArrangement = 69, effShellGetNextPlugin = 70, effStartProcess = 71, effStopProcess = 72, effSetTotalSampleToProcess = 73, effSetPanLaw = 74, effBeginLoadBank = 75, effBeginLoadProgram = 76, effSetProcessPrecision = 77, effGetNumMidiInputChannels = 78, effGetNumMidiOutputChannels = 79, }; enum VstOpcodeToHost : int32 { audioMasterAutomate = 0, audioMasterVersion = 1, audioMasterCurrentId = 2, audioMasterIdle = 3, audioMasterPinConnected = 4, audioMasterWantMidi = 6, audioMasterGetTime = 7, audioMasterProcessEvents = 8, audioMasterSetTime = 9, audioMasterTempoAt = 10, audioMasterGetNumAutomatableParameters = 11, audioMasterGetParameterQuantization = 12, audioMasterIOChanged = 13, audioMasterNeedIdle = 14, audioMasterSizeWindow = 15, audioMasterGetSampleRate = 16, audioMasterGetBlockSize = 17, audioMasterGetInputLatency = 18, audioMasterGetOutputLatency = 19, audioMasterGetPreviousPlug = 20, audioMasterGetNextPlug = 21, audioMasterWillReplaceOrAccumulate = 22, audioMasterGetCurrentProcessLevel = 23, audioMasterGetAutomationState = 24, audioMasterOfflineStart = 25, audioMasterOfflineRead = 26, audioMasterOfflineWrite = 27, audioMasterOfflineGetCurrentPass = 28, audioMasterOfflineGetCurrentMetaPass = 29, audioMasterSetOutputSampleRate = 30, audioMasterGetOutputSpeakerArrangement = 31, audioMasterGetVendorString = 32, audioMasterGetProductString = 33, audioMasterGetVendorVersion = 34, audioMasterVendorSpecific = 35, audioMasterSetIcon = 36, audioMasterCanDo = 37, audioMasterGetLanguage = 38, audioMasterOpenWindow = 39, audioMasterCloseWindow = 40, audioMasterGetDirectory = 41, audioMasterUpdateDisplay = 42, audioMasterBeginEdit = 43, audioMasterEndEdit = 44, audioMasterOpenFileSelector = 45, audioMasterCloseFileSelector = 46, audioMasterEditFile = 47, audioMasterGetChunkFile = 48, audioMasterGetInputSpeakerArrangement = 49, }; enum VstEventTypes : int32 { kVstMidiType = 1, kVstAudioType = 2, kVstVideoType = 3, kVstParameterType = 4, kVstTriggerType = 5, kVstSysExType = 6, }; enum VstEventFlags : int32 { kVstMidiEventIsRealtime = 1 << 0, }; enum VstTimeInfoFlags : int32 { kVstTransportChanged = 1, kVstTransportPlaying = 1 << 1, kVstTransportCycleActive = 1 << 2, kVstTransportRecording = 1 << 3, kVstAutomationWriting = 1 << 6, kVstAutomationReading = 1 << 7, kVstNanosValid = 1 << 8, kVstPpqPosValid = 1 << 9, kVstTempoValid = 1 << 10, kVstBarsValid = 1 << 11, kVstCyclePosValid = 1 << 12, kVstTimeSigValid = 1 << 13, kVstSmpteValid = 1 << 14, kVstClockValid = 1 << 15, }; enum VstSmpteFrameRate : int32 { kVstSmpte24fps = 0, kVstSmpte25fps = 1, kVstSmpte2997fps = 2, kVstSmpte30fps = 3, kVstSmpte2997dfps = 4, kVstSmpte30dfps = 5, kVstSmpteFilm16mm = 6, kVstSmpteFilm35mm = 7, kVstSmpte239fps = 10, kVstSmpte249fps = 11, kVstSmpte599fps = 12, kVstSmpte60fps = 13, }; enum VstLanguage : int32 { kVstLangEnglish = 1, kVstLangGerman = 2, kVstLangFrench = 3, kVstLangItalian = 4, kVstLangSpanish = 5, kVstLangJapanese = 6, }; enum VstProcessPrecision : int32 { kVstProcessPrecision32 = 0, kVstProcessPrecision64 = 1, }; enum VstParameterFlags : int32 { kVstParameterIsSwitch = 1 << 0, kVstParameterUsesIntegerMinMax = 1 << 1, kVstParameterUsesFloatStep = 1 << 2, kVstParameterUsesIntStep = 1 << 3, kVstParameterSupportsDisplayIndex = 1 << 4, kVstParameterSupportsDisplayCategory = 1 << 5, kVstParameterCanRamp = 1 << 6, }; enum VstPinPropertiesFlags : int32 { kVstPinIsActive = 1 << 0, kVstPinIsStereo = 1 << 1, kVstPinUseSpeaker = 1 << 2, }; enum VstPlugCategory : int32 { kPlugCategUnknown = 0, kPlugCategEffect = 1, kPlugCategSynth = 2, kPlugCategAnalysis = 3, kPlugCategMastering = 4, kPlugCategSpacializer = 5, kPlugCategRoomFx = 6, kPlugSurroundFx = 7, kPlugCategRestoration = 8, kPlugCategOfflineProcess = 9, kPlugCategShell = 10, kPlugCategGenerator = 11, kPlugCategMaxCount = 12, }; enum VstMidiProgramNameFlags : int32 { kMidiIsOmni = 1, }; enum VstSpeakerType : int32 { kSpeakerUndefined = 0x7FFFFFFF, kSpeakerM = 0, kSpeakerL = 1, kSpeakerR = 2, kSpeakerC = 3, kSpeakerLfe = 4, kSpeakerLs = 5, kSpeakerRs = 6, kSpeakerLc = 7, kSpeakerRc = 8, kSpeakerS = 9, kSpeakerCs = kSpeakerS, kSpeakerSl = 10, kSpeakerSr = 11, kSpeakerTm = 12, kSpeakerTfl = 13, kSpeakerTfc = 14, kSpeakerTfr = 15, kSpeakerTrl = 16, kSpeakerTrc = 17, kSpeakerTrr = 18, kSpeakerLfe2 = 19, kSpeakerU32 = -32, kSpeakerU31 = -31, kSpeakerU30 = -30, kSpeakerU29 = -29, kSpeakerU28 = -28, kSpeakerU27 = -27, kSpeakerU26 = -26, kSpeakerU25 = -25, kSpeakerU24 = -24, kSpeakerU23 = -23, kSpeakerU22 = -22, kSpeakerU21 = -21, kSpeakerU20 = -20, kSpeakerU19 = -19, kSpeakerU18 = -18, kSpeakerU17 = -17, kSpeakerU16 = -16, kSpeakerU15 = -15, kSpeakerU14 = -14, kSpeakerU13 = -13, kSpeakerU12 = -12, kSpeakerU11 = -11, kSpeakerU10 = -10, kSpeakerU9 = -9, kSpeakerU8 = -8, kSpeakerU7 = -7, kSpeakerU6 = -6, kSpeakerU5 = -5, kSpeakerU4 = -4, kSpeakerU3 = -3, kSpeakerU2 = -2, kSpeakerU1 = -1, }; enum VstSpeakerArrangementType : int32 { kSpeakerArrUserDefined = -2, kSpeakerArrEmpty = -1, kSpeakerArrMono = 0, kSpeakerArrStereo = 1, kSpeakerArrStereoSurround = 2, kSpeakerArrStereoCenter = 3, kSpeakerArrStereoSide = 4, kSpeakerArrStereoCLfe = 5, kSpeakerArr30Cine = 6, kSpeakerArr30Music = 7, kSpeakerArr31Cine = 8, kSpeakerArr31Music = 9, kSpeakerArr40Cine = 10, kSpeakerArr40Music = 11, kSpeakerArr41Cine = 12, kSpeakerArr41Music = 13, kSpeakerArr50 = 14, kSpeakerArr51 = 15, kSpeakerArr60Cine = 16, kSpeakerArr60Music = 17, kSpeakerArr61Cine = 18, kSpeakerArr61Music = 19, kSpeakerArr70Cine = 20, kSpeakerArr70Music = 21, kSpeakerArr71Cine = 22, kSpeakerArr71Music = 23, kSpeakerArr80Cine = 24, kSpeakerArr80Music = 25, kSpeakerArr81Cine = 26, kSpeakerArr81Music = 27, kSpeakerArr102 = 28, kNumSpeakerArr = 29, }; enum VstOfflineTaskFlags : int32 { kVstOfflineUnvalidParameter = 1 << 0, kVstOfflineNewFile = 1 << 1, kVstOfflinePlugError = 1 << 10, kVstOfflineInterleavedAudio = 1 << 11, kVstOfflineTempOutputFile = 1 << 12, kVstOfflineFloatOutputFile = 1 << 13, kVstOfflineRandomWrite = 1 << 14, kVstOfflineStretch = 1 << 15, kVstOfflineNoThread = 1 << 16, }; enum VstOfflineOption : int32 { kVstOfflineAudio = 0, kVstOfflinePeaks = 1, kVstOfflineParameter = 2, kVstOfflineMarker = 3, kVstOfflineCursor = 4, kVstOfflineSelection = 5, kVstOfflineQueryFiles = 6, }; enum VstAudioFileFlags : int32 { kVstOfflineReadOnly = 1 << 0, kVstOfflineNoRateConversion = 1 << 1, kVstOfflineNoChannelChange = 1 << 2, kVstOfflineCanProcessSelection = 1 << 10, kVstOfflineNoCrossfade = 1 << 11, kVstOfflineWantRead = 1 << 12, kVstOfflineWantWrite = 1 << 13, kVstOfflineWantWriteMarker = 1 << 14, kVstOfflineWantMoveCursor = 1 << 15, kVstOfflineWantSelect = 1 << 16, }; enum VstVirtualKey : uint8 { VKEY_BACK = 1, VKEY_TAB = 2, VKEY_CLEAR = 3, VKEY_RETURN = 4, VKEY_PAUSE = 5, VKEY_ESCAPE = 6, VKEY_SPACE = 7, VKEY_NEXT = 8, VKEY_END = 9, VKEY_HOME = 10, VKEY_LEFT = 11, VKEY_UP = 12, VKEY_RIGHT = 13, VKEY_DOWN = 14, VKEY_PAGEUP = 15, VKEY_PAGEDOWN = 16, VKEY_SELECT = 17, VKEY_PRINT = 18, VKEY_ENTER = 19, VKEY_SNAPSHOT = 20, VKEY_INSERT = 21, VKEY_DELETE = 22, VKEY_HELP = 23, VKEY_NUMPAD0 = 24, VKEY_NUMPAD1 = 25, VKEY_NUMPAD2 = 26, VKEY_NUMPAD3 = 27, VKEY_NUMPAD4 = 28, VKEY_NUMPAD5 = 29, VKEY_NUMPAD6 = 30, VKEY_NUMPAD7 = 31, VKEY_NUMPAD8 = 32, VKEY_NUMPAD9 = 33, VKEY_MULTIPLY = 34, VKEY_ADD = 35, VKEY_SEPARATOR = 36, VKEY_SUBTRACT = 37, VKEY_DECIMAL = 38, VKEY_DIVIDE = 39, VKEY_F1 = 40, VKEY_F2 = 41, VKEY_F3 = 42, VKEY_F4 = 43, VKEY_F5 = 44, VKEY_F6 = 45, VKEY_F7 = 46, VKEY_F8 = 47, VKEY_F9 = 48, VKEY_F10 = 49, VKEY_F11 = 50, VKEY_F12 = 51, VKEY_NUMLOCK = 52, VKEY_SCROLL = 53, VKEY_SHIFT = 54, VKEY_CONTROL = 55, VKEY_ALT = 56, VKEY_EQUALS = 57, }; enum VstModifierKey : uint8 { MODIFIER_SHIFT = 1 << 0, MODIFIER_ALTERNATE = 1 << 1, MODIFIER_COMMAND = 1 << 2, MODIFIER_CONTROL = 1 << 3, }; enum VstFileSelectCommand : int32 { kVstFileLoad = 0, kVstFileSave = 1, kVstMultipleFilesLoad = 2, kVstDirectorySelect = 3, }; enum VstFileSelectType : int32 { kVstFileType = 0, }; enum VstPanLaw : int32 { kLinearPanLaw = 0, kEqualPowerPanLaw = 1, }; enum VstProcessLevel : int32 { kVstProcessLevelUnknown = 0, kVstProcessLevelUser = 1, kVstProcessLevelRealtime = 2, kVstProcessLevelPrefetch = 3, kVstProcessLevelOffline = 4, }; enum VstAutomationState : int32 { kVstAutomationUnsupported = 0, kVstAutomationOff = 1, kVstAutomationRead = 2, kVstAutomationWrite = 3, kVstAutomationReadWrite = 4, }; namespace HostCanDo { inline constexpr char sendVstEvents[] = "sendVstEvents"; inline constexpr char sendVstMidiEvent[] = "sendVstMidiEvent"; inline constexpr char sendVstTimeInfo[] = "sendVstTimeInfo"; inline constexpr char receiveVstEvents[] = "receiveVstEvents"; inline constexpr char receiveVstMidiEvent[] = "receiveVstMidiEvent"; inline constexpr char reportConnectionChanges[] = "reportConnectionChanges"; inline constexpr char acceptIOChanges[] = "acceptIOChanges"; inline constexpr char sizeWindow[] = "sizeWindow"; inline constexpr char asyncProcessing[] = "asyncProcessing"; inline constexpr char ofline[] = "offline"; inline constexpr char supplyIdle[] = "supplyIdle"; inline constexpr char supportShell[] = "supportShell"; inline constexpr char openFileSelector[] = "openFileSelector"; inline constexpr char closeFileSelector[] = "closeFileSelector"; inline constexpr char startStopProcess[] = "startStopProcess"; inline constexpr char shellCategory[] = "shellCategory"; inline constexpr char editFile[] = "editFile"; inline constexpr char sendVstMidiEventFlagIsRealtime[] = "sendVstMidiEventFlagIsRealtime"; } // namespace HostCanDo namespace PluginCanDo { inline constexpr char sendVstEvents[] = "sendVstEvents"; inline constexpr char sendVstMidiEvent[] = "sendVstMidiEvent"; inline constexpr char receiveVstEvents[] = "receiveVstEvents"; inline constexpr char receiveVstMidiEvent[] = "receiveVstMidiEvent"; inline constexpr char receiveVstTimeInfo[] = "receiveVstTimeInfo"; inline constexpr char offline[] = "offline"; inline constexpr char midiProgramNames[] = "midiProgramNames"; inline constexpr char bypass[] = "bypass"; inline constexpr char MPE[] = "MPE"; } // namespace PluginCanDo struct AEffect; typedef intptr_t(VSTCALLBACK *AudioMasterCallbackFunc)(AEffect *effect, VstOpcodeToHost opcode, int32 index, intptr_t value, void *ptr, float opt); typedef intptr_t(VSTCALLBACK *DispatcherFunc)(AEffect *effect, VstOpcodeToPlugin opcode, int32 index, intptr_t value, void *ptr, float opt); typedef void(VSTCALLBACK *ProcessProc)(AEffect *effect, float **inputs, float **outputs, int32 sampleFrames); typedef void(VSTCALLBACK *ProcessDoubleProc)(AEffect *effect, double **inputs, double **outputs, int32 sampleFrames); typedef void(VSTCALLBACK *SetParameterProc)(AEffect *effect, int32 index, float parameter); typedef float(VSTCALLBACK *GetParameterFunc)(AEffect *effect, int32 index); typedef AEffect *(VSTCALLBACK *MainProc)(AudioMasterCallbackFunc audioMaster); #pragma pack(push, 8) struct AEffect { int32 magic; DispatcherFunc dispatcher; ProcessProc process; SetParameterProc setParameter; GetParameterFunc getParameter; int32 numPrograms; uint32 numParams; int32 numInputs; int32 numOutputs; VstFlags flags; void *reservedForHost1; void *reservedForHost2; int32 initialDelay; int32 realQualities; int32 offQualities; float ioRatio; void *object; void *user; int32 uniqueID; int32 version; ProcessProc processReplacing; ProcessDoubleProc processDoubleReplacing; }; struct ERect { int16 top, left, bottom, right; int16 Width() const { return right - left; } int16 Height() const { return bottom - top; } }; struct VstEvent { VstEventTypes type; int32 byteSize; int32 deltaFrames; VstEventFlags flags; }; struct VstEvents { static constexpr size_t MAX_EVENTS = 256; int32 numEvents; intptr_t reserved; VstEvent *events[MAX_EVENTS]; size_t size() { return numEvents; } auto begin() { return std::begin(events); } auto end() { return std::begin(events) + numEvents; } auto begin() const { return std::begin(events); } auto end() const { return std::begin(events) + numEvents; } auto cbegin() const { return std::cbegin(events); } auto cend() const { return std::cbegin(events) + numEvents; } }; struct VstMidiEvent : public VstEvent { int32 noteLength; int32 noteOffset; uint32 midiData; int8 detune; int8 noteOffVelocity; int8 reserved1; int8 reserved2; }; struct VstMidiSysexEvent : public VstEvent { int32 dumpBytes; intptr_t reserved1; const std::byte *sysexDump; intptr_t reserved2; }; struct VstTimeInfo { double samplePos; double sampleRate; double nanoSeconds; double ppqPos; double tempo; double barStartPos; double cycleStartPos; double cycleEndPos; int32 timeSigNumerator; int32 timeSigDenominator; int32 smpteOffset; VstSmpteFrameRate smpteFrameRate; int32 samplesToNextClock; VstTimeInfoFlags flags; }; struct VstVariableIo { float **inputs; float **outputs; int32 numSamplesInput; int32 numSamplesOutput; int32 *numSamplesInputProcessed; int32 *numSamplesOutputProcessed; }; struct VstParameterProperties { float stepFloat; float smallStepFloat; float largeStepFloat; char label[kVstMaxLabelLen]; VstParameterFlags flags; int32 minInteger; int32 maxInteger; int32 stepInteger; int32 largeStepInteger; char shortLabel[kVstMaxShortLabelLen]; int16 displayIndex; int16 category; int16 numParametersInCategory; int16 reserved; char categoryLabel[kVstMaxCategLabelLen]; int8 reserved2[16]; }; struct VstPinProperties { char label[kVstMaxLabelLen]; VstPinPropertiesFlags flags; VstSpeakerArrangementType arragementType; char shortLabel[kVstMaxShortLabelLen]; int8 reserved[48]; }; struct MidiProgramName { int32 thisProgramIndex; char name[kVstMaxNameLen]; int8 midiProgram; int8 midiBankMSB; int8 midiBankLSB; int8 reserved; int32 parentCategoryIndex; VstMidiProgramNameFlags flags; }; struct MidiProgramCategory { int32 thisCategoryIndex; char name[kVstMaxNameLen]; int32 parentCategoryIndex; int32 flags; }; struct MidiKeyName { int32 thisProgramIndex; int32 thisKeyNumber; char keyName[kVstMaxNameLen]; int32 reserved; int32 flags; }; struct VstSpeakerProperties { float azimuth; float elevation; float radius; float reserved1; char name[kVstMaxNameLen]; VstSpeakerType type; int8 reserved2[28]; }; struct VstSpeakerArrangement { VstSpeakerArrangementType type; int32 numChannels; VstSpeakerProperties speakers[8]; }; struct VstOfflineTask { char processName[96]; double readPosition; double writePosition; int32 readCount; int32 writeCount; int32 sizeInputBuffer; int32 sizeOutputBuffer; void *inputBuffer; void *outputBuffer; double positionToProcessFrom; double numFramesToProcess; double maxFramesToWrite; void *extraBuffer; int32 value; int32 index; double numFramesInSourceFile; double sourceSampleRate; double destinationSampleRate; int32 numSourceChannels; int32 numDestinationChannels; int32 sourceFormat; int32 destinationFormat; char outputText[512]; double progress; int32 progressMode; char progressText[100]; VstOfflineTaskFlags flags; int32 returnValue; void *hostOwned; void *plugOwned; int8 reserved[1024]; }; struct VstAudioFile { VstAudioFileFlags flags; void *hostOwned; void *plugOwned; char name[kVstMaxFileNameLen]; int32 uniqueID; double sampleRate; int32 numChannels; double numFrames; int32 format; double editCursorPosition; double selectionStart; double selectionSize; int32 selectedChannelsMask; int32 numMarkers; int32 timeRulerUnit; double timeRulerOffset; double tempo; int32 timeSigNumerator; int32 timeSigDenominator; int32 ticksPerBlackNote; int32 smtpeFrameRate; int8 reserved[64]; }; struct VstAudioFileMarker { double position; char name[32]; int32 type; int32 id; int32 reserved; }; struct VstWindow { char title[128]; int16 xPos; int16 yPos; int16 width; int16 height; int32 style; void *parent; void *userHandle; void *windowHandle; int8 reserved[104]; }; struct VstKeyCode { int32 characterCode; VstVirtualKey virtualCode; VstModifierKey modifierCode; }; struct VstFileType { char name[128]; char macType[8]; char dosType[8]; char unixType[8]; char mimeType1[128]; char mimeType2[128]; }; struct VstFileSelect { VstFileSelectCommand command; VstFileSelectType type; int32 macCreator; int32 numFileTypes; VstFileType *fileTypes; char title[1024]; char *initialPath; char *returnPath; int32 sizeReturnPath; char **returnMultiplePaths; int32 numReturnPaths; intptr_t reserved; int8 reserved2[116]; }; struct VstPatchChunkInfo { int32 version; int32 pluginUniqueID; int32 pluginVersion; int32 numElements; int8 reserved[48]; }; #pragma pack(pop) int32 constexpr FourCC(const char (&cc)[5]) { return static_cast(static_cast(cc[3]) | (static_cast(cc[2]) << 8) | (static_cast(cc[1]) << 16) | (static_cast(cc[0]) << 24)); } inline constexpr int32 kEffectMagic = FourCC("VstP"); template constexpr T *FromIntPtr(intptr_t v) { return reinterpret_cast(v); } template constexpr intptr_t ToIntPtr(T *v) { return reinterpret_cast(v); } } // namespace Vst