diff --git a/distrho/src/DistrhoPluginVST.cpp b/distrho/src/DistrhoPluginVST.cpp index e384c4c4..2cce3a99 100644 --- a/distrho/src/DistrhoPluginVST.cpp +++ b/distrho/src/DistrhoPluginVST.cpp @@ -41,7 +41,7 @@ #include #ifdef VESTIGE_HEADER -# include "vestige/aeffectx.h" +# include "vestige/vestige.h" #define effFlagsProgramChunks (1 << 5) #define effSetProgramName 4 #define effGetParamLabel 6 @@ -51,7 +51,6 @@ #define effCanBeAutomated 26 #define effGetProgramNameIndexed 29 #define effGetPlugCategory 35 -#define effIdle 53 #define effEditKeyDown 59 #define effEditKeyUp 60 #define kPlugCategEffect 1 @@ -1066,17 +1065,10 @@ struct VstObject { PluginVst* plugin; }; -#ifdef VESTIGE_HEADER -# define validObject effect != nullptr && effect->ptr3 != nullptr -# define validPlugin effect != nullptr && effect->ptr3 != nullptr && ((VstObject*)effect->ptr3)->plugin != nullptr -# define vstObjectPtr (VstObject*)effect->ptr3 -#else -# define validObject effect != nullptr && effect->object != nullptr -# define validPlugin effect != nullptr && effect->object != nullptr && ((VstObject*)effect->object)->plugin != nullptr -# define vstObjectPtr (VstObject*)effect->object -#endif - -#define pluginPtr (vstObjectPtr)->plugin +#define validObject effect != nullptr && effect->object != nullptr +#define validPlugin effect != nullptr && effect->object != nullptr && ((VstObject*)effect->object)->plugin != nullptr +#define vstObjectPtr (VstObject*)effect->object +#define pluginPtr (vstObjectPtr)->plugin static intptr_t vst_dispatcherCallback(AEffect* effect, int32_t opcode, int32_t index, intptr_t value, void* ptr, float opt) { @@ -1144,11 +1136,7 @@ static intptr_t vst_dispatcherCallback(AEffect* effect, int32_t opcode, int32_t /* This code invalidates the object created in VSTPluginMain * Probably not safe against all hosts */ obj->audioMaster = nullptr; -# ifdef VESTIGE_HEADER - effect->ptr3 = nullptr; -# else - vstObjectPtr = nullptr; -# endif + effect->object = nullptr; delete obj; #endif @@ -1172,14 +1160,14 @@ static intptr_t vst_dispatcherCallback(AEffect* effect, int32_t opcode, int32_t return 1; } return 0; - + case effGetParameterProperties: if (ptr != nullptr && index < static_cast(plugin.getParameterCount())) { if (VstParameterProperties* const properties = (VstParameterProperties*)ptr) { memset(properties, 0, sizeof(VstParameterProperties)); - + const uint32_t hints = plugin.getParameterHints(index); if (hints & kParameterIsOutput) @@ -1189,7 +1177,7 @@ static intptr_t vst_dispatcherCallback(AEffect* effect, int32_t opcode, int32_t { properties->flags |= kVstParameterIsSwitch; } - + if (hints & kParameterIsInteger) { properties->flags |= kVstParameterUsesIntegerMinMax; @@ -1208,7 +1196,7 @@ static intptr_t vst_dispatcherCallback(AEffect* effect, int32_t opcode, int32_t } } return 0; - + case effGetPlugCategory: #if DISTRHO_PLUGIN_IS_SYNTH return kPlugCategSynth; @@ -1315,12 +1303,7 @@ const AEffect* VSTPluginMain(audioMasterCallback audioMaster) // vst fields effect->magic = kEffectMagic; effect->uniqueID = plugin->getUniqueId(); -#ifdef VESTIGE_HEADER - int32_t* const version = (int32_t*)&effect->unknown1; - *version = plugin->getVersion(); -#else - effect->version = plugin->getVersion(); -#endif + effect->version = plugin->getVersion(); // VST doesn't support parameter outputs. we can fake them, but it is a hack. Disabled by default. #ifdef DPF_VST_SHOW_PARAMETER_OUTPUTS @@ -1371,11 +1354,9 @@ const AEffect* VSTPluginMain(audioMasterCallback audioMaster) VstObject* const obj(new VstObject()); obj->audioMaster = audioMaster; obj->plugin = nullptr; -#ifdef VESTIGE_HEADER - effect->ptr3 = obj; -#else + + // done effect->object = obj; -#endif return effect; } diff --git a/distrho/src/vestige/aeffectx.h b/distrho/src/vestige/vestige.h similarity index 70% rename from distrho/src/vestige/aeffectx.h rename to distrho/src/vestige/vestige.h index 23f84f2e..56135fd7 100644 --- a/distrho/src/vestige/aeffectx.h +++ b/distrho/src/vestige/vestige.h @@ -1,9 +1,18 @@ /* - * aeffectx.h - simple header to allow VeSTige compilation and eventually work + * IMPORTANT: The author of DPF has no connection with the + * author of the VeSTige VST-compatibility header, has had no + * involvement in its creation. + * + * The VeSTige header is included in this package in the good-faith + * belief that it has been cleanly and legally reverse engineered + * without reference to the official VST SDK and without its + * developer(s) having agreed to the VST SDK license agreement. + */ + +/* + * simple header to allow VeSTige compilation and eventually work * * Copyright (c) 2006 Javier Serrano Polo - * - * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public @@ -22,8 +31,8 @@ * */ #include -#ifndef _AEFFECTX_H -#define _AEFFECTX_H +#ifndef _VESTIGE_H +#define _VESTIGE_H #define CCONST(a, b, c, d)( ( ( (int) a ) << 24 ) | \ ( ( (int) b ) << 16 ) | \ @@ -87,11 +96,11 @@ #define effFlagsIsSynth (1 << 8) // currently unused #define effOpen 0 -#define effClose 1 // currently unused -#define effSetProgram 2 // currently unused -#define effGetProgram 3 // currently unused -#define effGetProgramName 5 // currently unused -#define effGetParamName 8 // currently unused +#define effClose 1 +#define effSetProgram 2 +#define effGetProgram 3 +#define effGetProgramName 5 +#define effGetParamName 8 #define effSetSampleRate 10 #define effSetBlockSize 11 #define effMainsChanged 12 @@ -101,22 +110,42 @@ #define effEditIdle 19 #define effEditTop 20 #define effProcessEvents 25 +#define effGetPlugCategory 35 #define effGetEffectName 45 #define effGetVendorString 47 #define effGetProductString 48 #define effGetVendorVersion 49 -#define effCanDo 51 // currently unused -/* from http://asseca.com/vst-24-specs/efGetParameterProperties.html */ +#define effCanDo 51 +#define effIdle 53 #define effGetParameterProperties 56 -#define effGetVstVersion 58 // currently unused +#define effGetVstVersion 58 +#define effShellGetNextPlugin 70 +#define effStartProcess 71 +#define effStopProcess 72 + +#define effBeginSetProgram 67 +#define effEndSetProgram 68 + +#ifdef WORDS_BIGENDIAN +// "VstP" +#define kEffectMagic 0x50747356 +#else +// "PtsV" +#define kEffectMagic 0x56737450 +#endif -#define kEffectMagic (CCONST( 'V', 's', 't', 'P' )) #define kVstLangEnglish 1 #define kVstMidiType 1 struct RemoteVstPlugin; +#define kVstTransportChanged 1 #define kVstTransportPlaying (1 << 1) +#define kVstTransportCycleActive (1 << 2) +#define kVstTransportRecording (1 << 3) + +#define kVstAutomationWriting (1 << 6) +#define kVstAutomationReading (1 << 7) #define kVstNanosValid (1 << 8) #define kVstPpqPosValid (1 << 9) @@ -174,26 +203,57 @@ struct _VstEvents VstEvent * events[2]; }; +enum Vestige2StringConstants +{ + VestigeMaxNameLen = 64, + VestigeMaxLabelLen = 64, + VestigeMaxShortLabelLen = 8, + VestigeMaxCategLabelLen = 24, + VestigeMaxFileNameLen = 100 +}; + + +enum VstPlugCategory +{ + kPlugCategUnknown = 0, + kPlugCategEffect, + kPlugCategSynth, + kPlugCategAnalysis, + kPlugCategMastering, + kPlugCategSpacializer, + kPlugCategRoomFx, + kPlugSurroundFx, + kPlugCategRestoration, + kPlugCategOfflineProcess, + kPlugCategShell, + kPlugCategGenerator, + kPlugCategMaxCount +}; + typedef struct _VstEvents VstEvents; -/* this struct taken from http://asseca.com/vst-24-specs/efGetParameterProperties.html */ struct _VstParameterProperties { - float stepFloat; - float smallStepFloat; - float largeStepFloat; - char label[64]; - int32_t flags; - int32_t minInteger; - int32_t maxInteger; - int32_t stepInteger; - int32_t largeStepInteger; - char shortLabel[8]; + float stepFloat; /* float step */ + float smallStepFloat; /* small float step */ + float largeStepFloat; /* large float step */ + char label[VestigeMaxLabelLen]; /* parameter label */ + int32_t flags; /* @see VstParameterFlags */ + int32_t minInteger; /* integer minimum */ + int32_t maxInteger; /* integer maximum */ + int32_t stepInteger; /* integer step */ + int32_t largeStepInteger; /* large integer step */ + char shortLabel[VestigeMaxShortLabelLen]; /* short label, recommended: 6 + delimiter */ + int16_t displayIndex; /* index where this parameter should be displayed (starting with 0) */ + int16_t category; /* 0: no category, else group index + 1 */ + int16_t numParametersInCategory; /* number of parameters in category */ + int16_t reserved; /* zero */ + char categoryLabel[VestigeMaxCategLabelLen]; /* category label, e.g. "Osc 1" */ + char future[16]; /* reserved for future use */ }; typedef struct _VstParameterProperties VstParameterProperties; -/* this enum taken from http://asseca.com/vst-24-specs/efGetParameterProperties.html */ enum VstParameterFlags { kVstParameterIsSwitch = 1 << 0, /* parameter is a switch (on/off) */ @@ -231,18 +291,19 @@ struct _AEffect // Fill somewhere 28-2b void *ptr1; void *ptr2; - // Zeroes 2c-2f 30-33 34-37 38-3b - char empty3[4 + 4 + 4]; + int initialDelay; + // Zeroes 30-33 34-37 38-3b + char empty2[4 + 4]; // 1.0f 3c-3f float unkown_float; // An object? pointer 40-43 - void *ptr3; + void *object; // Zeroes 44-47 void *user; // Id 48-4b int32_t uniqueID; - // Don't know 4c-4f - char unknown1[4]; + // plugin version 4c-4f + int32_t version; // processReplacing 50-53 void (* processReplacing) (struct _AEffect *, float **, float **, int); };