diff --git a/tools/update_vst3.sh b/tools/update_vst3.sh new file mode 100755 index 0000000000..a6762ecf2f --- /dev/null +++ b/tools/update_vst3.sh @@ -0,0 +1,59 @@ +#!/bin/bash + +if ! test -f wscript || ! test -d gtk2_ardour || ! test -d libs/vst3/; then + echo "This script needs to run from ardour's top-level src tree" + exit 1 +fi + +if test -z "`which rsync`" -o -z "`which git`"; then + echo "this script needs rsync and git" + exit 1 +fi + +ASRC=`pwd` +set -e + +rm -rf libs/vst3/pluginterfaces/gui +rm -rf libs/vst3/pluginterfaces/vst +rm -rf libs/vst3/pluginterfaces/base +mkdir -p libs/vst3/pluginterfaces/gui +mkdir -p libs/vst3/pluginterfaces/vst +mkdir -p libs/vst3/pluginterfaces/base + +TMP=`mktemp -d` +test -d $TMP + +trap "rm -rf $TMP" EXIT + +cd $TMP +git clone https://github.com/steinbergmedia/vst3_pluginterfaces.git +cd vst3_pluginterfaces/ +git reset --hard a21cdf3779726b2fe8eea0a8c36ebd698f4f0e82 + +rsync -auc --info=name0 \ + base/conststringtable.cpp \ + base/conststringtable.h \ + base/falignpop.h \ + base/falignpush.h \ + base/fplatform.h \ + base/fstrdefs.h \ + base/ftypes.h \ + base/funknown.cpp \ + base/funknown.h \ + base/ibstream.h \ + base/ipluginbase.h \ + base/istringresult.h \ + base/smartpointer.h \ + base/typesizecheck.h \ + "$ASRC/libs/vst3/pluginterfaces/base/" + +rsync -auc --info=name0 \ + vst gui \ + "$ASRC/libs/vst3/pluginterfaces/" + +cd "$ASRC" + +patch -p1 < tools/vst3-patches/vst3-cxx98.diff +patch -p1 < tools/vst3-patches/vst3-uuid.diff + +#git add libs/vst3/pluginterfaces/ diff --git a/tools/vst3-patches/vst3-cxx98.diff b/tools/vst3-patches/vst3-cxx98.diff new file mode 100644 index 0000000000..76ded09bcd --- /dev/null +++ b/tools/vst3-patches/vst3-cxx98.diff @@ -0,0 +1,84 @@ +diff --git b/libs/vst3/pluginterfaces/base/fplatform.h a/libs/vst3/pluginterfaces/base/fplatform.h +index 3a93738937..7db1c5d222 100644 +--- b/libs/vst3/pluginterfaces/base/fplatform.h ++++ a/libs/vst3/pluginterfaces/base/fplatform.h +@@ -115,8 +115,8 @@ + #ifndef SMTG_CPP11 + #error unsupported compiler + #endif +- #define SMTG_CPP11_STDLIBSUPPORT 1 +- #define SMTG_HAS_NOEXCEPT 1 ++ #define SMTG_CPP11_STDLIBSUPPORT SMTG_CPP11 ++ #define SMTG_HAS_NOEXCEPT SMTG_CPP11 + #endif + //----------------------------------------------------------------------------- + // Mac and iOS +diff --git b/libs/vst3/pluginterfaces/vst/ivstnoteexpression.h a/libs/vst3/pluginterfaces/vst/ivstnoteexpression.h +index dd04d14f6a..87f5feac91 100644 +--- b/libs/vst3/pluginterfaces/vst/ivstnoteexpression.h ++++ a/libs/vst3/pluginterfaces/vst/ivstnoteexpression.h +@@ -34,7 +34,10 @@ VST predefines some types like volume, pan, tuning by defining their ranges and + Used by NoteExpressionEvent::typeId and NoteExpressionTypeID::typeId + \see NoteExpressionTypeInfo + */ +-enum NoteExpressionTypeIDs : uint32 ++enum NoteExpressionTypeIDs ++#if SMTG_CPP11 ++ : uint32 ++#endif + { + kVolumeTypeID = 0, ///< Volume, plain range [0 = -oo , 0.25 = 0dB, 0.5 = +6dB, 1 = +12dB]: plain = 20 * log (4 * norm) + kPanTypeID, ///< Panning (L-R), plain range [0 = left, 0.5 = center, 1 = right] +@@ -183,7 +186,10 @@ DECLARE_CLASS_IID (INoteExpressionController, 0xB7F8F859, 0x41234872, 0x91169581 + /** KeyswitchTypeIDs describes the type of a key switch + \see KeyswitchInfo + */ +-enum KeyswitchTypeIDs : uint32 ++enum KeyswitchTypeIDs ++#if SMTG_CPP11 ++: uint32 ++#endif + { + kNoteOnKeyswitchTypeID = 0, ///< press before noteOn is played + kOnTheFlyKeyswitchTypeID, ///< press while noteOn is played +diff --git b/libs/vst3/pluginterfaces/gui/iplugview.h a/libs/vst3/pluginterfaces/gui/iplugview.h +index 32e1fcb3bd..9d6ec9a0d4 100644 +--- b/libs/vst3/pluginterfaces/gui/iplugview.h ++++ a/libs/vst3/pluginterfaces/gui/iplugview.h +@@ -213,8 +213,8 @@ DECLARE_CLASS_IID (IPlugFrame, 0x367FAF01, 0xAFA94693, 0x8D4DA2A0, 0xED0882A3) + //------------------------------------------------------------------------ + namespace Linux { + +-using TimerInterval = uint64; +-using FileDescriptor = int; ++#define TimerInterval uint64 ++#define FileDescriptor int + + //------------------------------------------------------------------------ + /** Linux event handler interface +diff --git a/libs/vst3/pluginterfaces/base/ftypes.h b/libs/vst3/pluginterfaces/base/ftypes.h +index feda6b0b9b..5f61e0ac81 100644 +--- a/libs/vst3/pluginterfaces/base/ftypes.h ++++ b/libs/vst3/pluginterfaces/base/ftypes.h +@@ -93,6 +93,8 @@ namespace Steinberg + typedef char char8; + #ifdef _NATIVE_WCHAR_T_DEFINED + typedef __wchar_t char16; ++#elif defined(__MINGW32__) ++ typedef wchar_t char16; + #elif SMTG_CPP11 + typedef char16_t char16; + #else +diff --git a/libs/vst3/pluginterfaces/base/funknown.cpp b/libs/vst3/pluginterfaces/base/funknown.cpp +index 0419bbc4bb..f205ac88de 100644 +--- a/libs/vst3/pluginterfaces/base/funknown.cpp ++++ b/libs/vst3/pluginterfaces/base/funknown.cpp +@@ -68,7 +68,7 @@ namespace FUnknownPrivate { + int32 PLUGIN_API atomicAdd (int32& var, int32 d) + { + #if SMTG_OS_WINDOWS +- return InterlockedExchangeAdd (&var, d) + d; ++ return InterlockedExchangeAdd ((volatile long int*)&var, d) + d; + #elif SMTG_OS_MACOS + return OSAtomicAdd32Barrier (d, (int32_t*)&var); + #elif SMTG_OS_LINUX diff --git a/tools/vst3-patches/vst3-uuid.diff b/tools/vst3-patches/vst3-uuid.diff new file mode 100644 index 0000000000..84c508164a --- /dev/null +++ b/tools/vst3-patches/vst3-uuid.diff @@ -0,0 +1,52 @@ +diff --git a/libs/vst3/pluginterfaces/base/funknown.cpp b/libs/vst3/pluginterfaces/base/funknown.cpp +index f205ac88de..09d5d27836 100644 +--- a/libs/vst3/pluginterfaces/base/funknown.cpp ++++ b/libs/vst3/pluginterfaces/base/funknown.cpp +@@ -22,6 +22,14 @@ + + #if SMTG_OS_WINDOWS + #include ++ ++#if defined(__MINGW32__) ++/* UUID */ ++#include ++#include ++#include ++#endif ++ + #endif + + #if SMTG_OS_MACOS +@@ -37,6 +45,10 @@ + + #if SMTG_OS_LINUX + #include ++/* UUID */ ++#include ++#include ++#include + #endif + + namespace Steinberg { +@@ -124,6 +136,10 @@ bool FUID::generate () + #if defined(_M_ARM64) || defined(_M_ARM) + //#warning implement me! + return false; ++#elif defined(__MINGW32__) ++ boost::uuids::uuid u = boost::uuids::random_generator()(); ++ memcpy(data, (const void*)&u, 16); ++ return true; + #else + GUID guid; + HRESULT hr = CoCreateGuid (&guid); +@@ -147,6 +163,10 @@ bool FUID::generate () + } + return false; + ++#elif SMTG_OS_LINUX ++ boost::uuids::uuid u = boost::uuids::random_generator()(); ++ memcpy(data, (const void*)&u, 16); ++ return true; + #else + #warning implement me! + return false;