vst2sdk

A clean room reverse engineering project for the VST 2.x interface
Log | Files | Refs | README | LICENSE

commit cc426bada4dcb3238e169f8fd61d69a425724147
parent b780509704fe181368ddd82dc53cd97c6ef07a1f
Author: Michael Fabian 'Xaymar' Dirks <info@xaymar.com>
Date:   Mon, 11 Mar 2024 12:05:55 +0100

Fix up a variety of API issues

The wrapper now successfully loads.

Diffstat:
Mpublic.sdk/source/vst2.x/aeffect.h | 14+++++++-------
Mpublic.sdk/source/vst2.x/aeffectx.h | 4++--
Mpublic.sdk/source/vst2.x/aeffeditor.cpp | 47++++++++++++++++++++++++++++++++++++++---------
Mpublic.sdk/source/vst2.x/audioeffect.hpp | 9++++++---
Mpublic.sdk/source/vst2.x/audioeffectx.cpp | 10++++------
Mpublic.sdk/source/vst2.x/audioeffectx.hpp | 2+-
Mpublic.sdk/source/vst2.x/vsttypes.h | 2++
7 files changed, 60 insertions(+), 28 deletions(-)

diff --git a/public.sdk/source/vst2.x/aeffect.h b/public.sdk/source/vst2.x/aeffect.h @@ -74,17 +74,17 @@ enum AEffectFlags { // Guessed name based on struct+field combination. struct AEffect { VstInt32 magic; // Must be FOURCC('V', 's', 't', 'P') - VstIntPtr(__cdecl* control)(AEffect* self, VstInt32 opcode, VstInt32 param1, VstIntPtr param2, void* ptr, float value); + VstIntPtr(VstFunctionAPI* control)(AEffect* self, VstInt32 opcode, VstInt32 param1, VstIntPtr param2, void* ptr, float value); #if (!defined VST_VERSION_SUPPORT) || (VST_VERSION_SUPPORT >= kVstVersion_2400) // No 2.4 host ever calls this, processReplacing and processDoubleReplacing seem to be required. [[deprecated]] #endif - void(__cdecl* process)(AEffect* self, float** inputs, float** outputs, VstInt32 sampleFrames); + void(VstFunctionAPI* process)(AEffect* self, float** inputs, float** outputs, VstInt32 sampleFrames); - void(__cdecl* setParameter)(AEffect* self, VstInt32 index, float value); + void(VstFunctionAPI* setParameter)(AEffect* self, VstInt32 index, float value); - float(__cdecl* getParameter)(AEffect* self, VstInt32 index); + float(VstFunctionAPI* getParameter)(AEffect* self, VstInt32 index); VstInt32 numPrograms; VstInt32 numParams; @@ -115,7 +115,7 @@ struct AEffect { * \param outputs Output buffers. Can have pointers used in inputs. * \param sampleFrames Number of samples in all buffers. */ - void(__cdecl* processReplacing)(AEffect* self, float** inputs, float** outputs, VstInt32 sampleFrames); + void(VstFunctionAPI* processReplacing)(AEffect* self, float** inputs, float** outputs, VstInt32 sampleFrames); #if (!defined VST_VERSION_SUPPORT) || (VST_VERSION_SUPPORT >= kVstVersion_2400) // These only appear in version >= 2.4 @@ -126,7 +126,7 @@ struct AEffect { * \param outputs Output buffers. Can have pointers used in inputs. * \param sampleFrames Number of samples in all buffers. */ - void(__cdecl* processDoubleReplacing)(AEffect* self, double** inputs, double** outputs, VstInt32 sampleFrames); + void(VstFunctionAPI* processDoubleReplacing)(AEffect* self, double** inputs, double** outputs, VstInt32 sampleFrames); char __unk12[56]; #else @@ -135,6 +135,6 @@ struct AEffect { }; // Master callback. -typedef VstIntPtr (*audioMasterCallback)(AEffect*, VstInt32 opcode, VstInt32, VstInt32, void* ptr, float); +typedef VstIntPtr(VstFunctionAPI* audioMasterCallback)(AEffect*, VstInt32 opcode, VstInt32, VstInt32, void* ptr, float); #pragma pack(pop) diff --git a/public.sdk/source/vst2.x/aeffectx.h b/public.sdk/source/vst2.x/aeffectx.h @@ -131,8 +131,8 @@ enum AEffectXMasterOpCodes { audioMasterGetVendorString, // Get Vendor Name audioMasterGetProductString, // Get Product Name audioMasterGetVendorVersion, // Get Vendor Version - AEffectXMasterOpCode_23, // Counterpart to AEffectXOpCode_32 - AEffectXMasterOpCode_24, + audioMasterVendorSpecific, // Counterpart to AEffectXOpCode_32 + audioMasterCanDo, AEffectXMasterOpCode_25, AEffectXMasterOpCode_26, AEffectXMasterOpCode_27, diff --git a/public.sdk/source/vst2.x/aeffeditor.cpp b/public.sdk/source/vst2.x/aeffeditor.cpp @@ -15,22 +15,51 @@ #include "aeffeditor.hpp" -AEffEditor::AEffEditor(AudioEffect* effect) : _effect(effect), _handle() {} +AEffEditor::AEffEditor(AudioEffect* effect) : effect(effect), _handle() {} AEffEditor::~AEffEditor() {} -bool AEffEditor::getRect(ERect** rect) {} +bool AEffEditor::getRect(ERect** rect) +{ + return false; +} -bool AEffEditor::open(void* ptr) {} +bool AEffEditor::open(void* ptr) +{ + if (!_handle) { + _handle = ptr; + return ptr; + } + return false; +} -void AEffEditor::close() {} +void AEffEditor::close() +{ + _handle = nullptr; + return; +} -void AEffEditor::do_nothing() {} +void AEffEditor::do_nothing() +{ + return; +} -bool AEffEditor::setKnobMode(VstInt32 val) {} +bool AEffEditor::setKnobMode(VstInt32 val) +{ + return false; +} -bool AEffEditor::onKeyDown(VstKeyCode& keyCode) {} +bool AEffEditor::onKeyDown(VstKeyCode& keyCode) +{ + return false; +} -bool AEffEditor::onKeyUp(VstKeyCode& keyCode) {} +bool AEffEditor::onKeyUp(VstKeyCode& keyCode) +{ + return false; +} -bool AEffEditor::onWheel(float distance) {} +bool AEffEditor::onWheel(float distance) +{ + return false; +} diff --git a/public.sdk/source/vst2.x/audioeffect.hpp b/public.sdk/source/vst2.x/audioeffect.hpp @@ -64,9 +64,12 @@ class AudioEffect { virtual void open(){}; virtual void close(){}; virtual void setProgram(VstInt32 program){}; - virtual VstInt32 getProgram(){}; - virtual void setProgramName(char* name){}; - virtual void getProgramName(char* name) + virtual VstInt32 getProgram() + { + return 0; + } + virtual void setProgramName(char* name){}; + virtual void getProgramName(char* name) { *name = 0; } diff --git a/public.sdk/source/vst2.x/audioeffectx.cpp b/public.sdk/source/vst2.x/audioeffectx.cpp @@ -41,9 +41,7 @@ VstIntPtr AudioEffectX::control(VstInt32 opcode, VstInt32 param1, VstIntPtr para case audioEffectGetPlugCategory: return (VstIntPtr)getPlugCategory(); case audioEffectSetSpeakerArrangement: - // MSVC: No you can't convert float to VstSpeakerArrangement*!! - // Also MSVC: Perfectly happy with this mess... - return setSpeakerArrangement(*(VstSpeakerArrangement**)(&value), (VstSpeakerArrangement*)ptr); + return setSpeakerArrangement((VstSpeakerArrangement*)param2, (VstSpeakerArrangement*)ptr); case audioEffectBypass: return setBypass(!!param2) ? 1 : 0; case audioEffectGetEffectName: @@ -97,7 +95,7 @@ VstIntPtr AudioEffectX::control(VstInt32 opcode, VstInt32 param1, VstIntPtr para #if (!defined VST_VERSION_SUPPORT) || (VST_VERSION_SUPPORT >= kVstVersion_2300) case audioEffectGetSpeakerArrangement: - return getSpeakerArrangement(*(VstSpeakerArrangement***)(&value), (VstSpeakerArrangement**)ptr); + return getSpeakerArrangement((VstSpeakerArrangement**)param2, (VstSpeakerArrangement**)ptr); case audioEffectStartProcessing: return startProcess(); case audioEffectStopProcessing: @@ -121,7 +119,7 @@ VstIntPtr AudioEffectX::control(VstInt32 opcode, VstInt32 param1, VstIntPtr para VstInt32 AudioEffectX::canHostDo(char* text) { if (audioMaster) - return !!audioMaster(getAeffect(), audioMasterBeginEdit, 0, 0, text, 0); + return !!audioMaster(getAeffect(), audioMasterCanDo, 0, 0, text, 0); return false; } @@ -188,7 +186,7 @@ VstInt32 AudioEffectX::getHostVendorVersion() return 0; } -bool AudioEffectX::canDoubleReplacing(bool value) +void AudioEffectX::canDoubleReplacing(bool value) { if (value) cEffect.flags |= AEffectFlagCanDoubleReplacing; diff --git a/public.sdk/source/vst2.x/audioeffectx.hpp b/public.sdk/source/vst2.x/audioeffectx.hpp @@ -32,7 +32,7 @@ class AudioEffectX : public AudioEffect { public: // AEffect/AEffectX - virtual bool canDoubleReplacing(bool value); + virtual void canDoubleReplacing(bool value); virtual void noTail(bool value); virtual void processDoubleReplacing(double** inputs, double** outputs, VstInt32 sampleFrames){}; diff --git a/public.sdk/source/vst2.x/vsttypes.h b/public.sdk/source/vst2.x/vsttypes.h @@ -20,6 +20,8 @@ #include <inttypes.h> #endif +#define VstFunctionAPI __cdecl + enum VstMaxLengths { // Anything with k is an enum? kVstMaxNameLen = 64, kVstMaxLabelLen = 64,