mirror of
https://github.com/juce-framework/JUCE.git
synced 2026-01-30 02:50:05 +00:00
Fixed JUCE_VST3_CAN_REPLACE_VST2 behaviour
This commit is contained in:
parent
7897331403
commit
f2b2fb2819
3 changed files with 116 additions and 61 deletions
|
|
@ -59,15 +59,6 @@
|
|||
|
||||
#include "../../juce_audio_processors/format_types/juce_VSTInterface.h"
|
||||
|
||||
#ifndef JUCE_VST3_CAN_REPLACE_VST2
|
||||
#define JUCE_VST3_CAN_REPLACE_VST2 1
|
||||
#endif
|
||||
|
||||
#if JucePlugin_Build_VST3 && JUCE_VST3_CAN_REPLACE_VST2
|
||||
#include <pluginterfaces/base/funknown.h>
|
||||
namespace juce { extern Steinberg::FUID getJuceVST3ComponentIID(); }
|
||||
#endif
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning (pop)
|
||||
#endif
|
||||
|
|
@ -113,6 +104,8 @@ namespace juce
|
|||
#if JUCE_LINUX
|
||||
extern Display* display;
|
||||
#endif
|
||||
|
||||
extern JUCE_API pointer_sized_int handleManufacturerSpecificVST2Opcode (int32, pointer_sized_int, void*, float);
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -1160,7 +1153,7 @@ public:
|
|||
case plugInOpcodeGetManufacturerProductName: return handleGetPlugInName (args);
|
||||
case plugInOpcodeGetManufacturerName: return handleGetManufacturerName (args);
|
||||
case plugInOpcodeGetManufacturerVersion: return handleGetManufacturerVersion (args);
|
||||
case plugInOpcodeManufacturerSpecific: return handleManufacturerSpecific (args);
|
||||
case plugInOpcodeManufacturerSpecific: return handleManufacturerSpecificVST2Opcode (args.index, args.value, args.ptr, args.opt);
|
||||
case plugInOpcodeCanPlugInDo: return handleCanPlugInDo (args);
|
||||
case plugInOpcodeGetTailSize: return handleGetTailSize (args);
|
||||
case plugInOpcodeKeyboardFocusRequired: return handleKeyboardFocusRequired (args);
|
||||
|
|
@ -1884,20 +1877,6 @@ private:
|
|||
return convertHexVersionToDecimal (JucePlugin_VersionCode);
|
||||
}
|
||||
|
||||
pointer_sized_int handleManufacturerSpecific (VstOpCodeArguments args)
|
||||
{
|
||||
#if JucePlugin_Build_VST3 && JUCE_VST3_CAN_REPLACE_VST2
|
||||
if ((args.index == 'stCA' || args.index == 'stCa') && args.value == 'FUID' && args.ptr != nullptr)
|
||||
{
|
||||
memcpy (args.ptr, getJuceVST3ComponentIID(), 16);
|
||||
return 1;
|
||||
}
|
||||
#else
|
||||
ignoreUnused (args);
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
pointer_sized_int handleCanPlugInDo (VstOpCodeArguments args)
|
||||
{
|
||||
char* text = (char*) args.ptr;
|
||||
|
|
|
|||
|
|
@ -2250,11 +2250,6 @@ private:
|
|||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (JuceVST3Component)
|
||||
};
|
||||
|
||||
#if JucePlugin_Build_VST3 && JUCE_VST3_CAN_REPLACE_VST2
|
||||
Steinberg::FUID getJuceVST3ComponentIID();
|
||||
Steinberg::FUID getJuceVST3ComponentIID() { return JuceVST3Component::iid; }
|
||||
#endif
|
||||
|
||||
const char* JuceVST3Component::kJucePrivateDataIdentifier = "JUCEPrivateData";
|
||||
|
||||
//==============================================================================
|
||||
|
|
@ -2270,42 +2265,15 @@ DECLARE_CLASS_IID (JuceAudioProcessor, 0x0101ABAB, 0xABCDEF01, JucePlugin_Manufa
|
|||
DEF_CLASS_IID (JuceAudioProcessor)
|
||||
|
||||
#if JUCE_VST3_CAN_REPLACE_VST2
|
||||
// NB: Nasty old-fashioned code in here because it's copied from the Steinberg example code.
|
||||
static FUID getFUIDForVST2ID (bool forControllerUID)
|
||||
FUID getFUIDForVST2ID (bool forControllerUID)
|
||||
{
|
||||
char uidString[33];
|
||||
|
||||
const int vstfxid = (('V' << 16) | ('S' << 8) | (forControllerUID ? 'E' : 'T'));
|
||||
char vstfxidStr[7] = { 0 };
|
||||
sprintf (vstfxidStr, "%06X", vstfxid);
|
||||
strcpy (uidString, vstfxidStr);
|
||||
|
||||
char uidStr[9] = { 0 };
|
||||
sprintf (uidStr, "%08X", JucePlugin_VSTUniqueID);
|
||||
strcat (uidString, uidStr);
|
||||
|
||||
char nameidStr[3] = { 0 };
|
||||
const size_t len = strlen (JucePlugin_Name);
|
||||
|
||||
for (size_t i = 0; i <= 8; ++i)
|
||||
{
|
||||
juce::uint8 c = i < len ? static_cast<juce::uint8> (JucePlugin_Name[i]) : 0;
|
||||
|
||||
if (c >= 'A' && c <= 'Z')
|
||||
c += 'a' - 'A';
|
||||
|
||||
sprintf (nameidStr, "%02X", c);
|
||||
strcat (uidString, nameidStr);
|
||||
}
|
||||
|
||||
FUID newOne;
|
||||
newOne.fromString (uidString);
|
||||
return newOne;
|
||||
TUID uuid;
|
||||
extern JUCE_API void getUUIDForVST2ID (bool, uint8[16]);
|
||||
getUUIDForVST2ID (forControllerUID, (uint8*) uuid);
|
||||
return FUID (uuid);
|
||||
}
|
||||
|
||||
const Steinberg::FUID JuceVST3Component ::iid (getFUIDForVST2ID (false));
|
||||
const Steinberg::FUID JuceVST3EditController::iid (getFUIDForVST2ID (true));
|
||||
|
||||
#else
|
||||
DECLARE_CLASS_IID (JuceVST3EditController, 0xABCDEF01, 0x1234ABCD, JucePlugin_ManufacturerCode, JucePlugin_PluginCode)
|
||||
DEF_CLASS_IID (JuceVST3EditController)
|
||||
|
|
|
|||
|
|
@ -62,6 +62,114 @@ extern "C" BOOL WINAPI DllMain (HINSTANCE instance, DWORD reason, LPVOID reserve
|
|||
|
||||
#endif
|
||||
|
||||
//==============================================================================
|
||||
namespace juce
|
||||
{
|
||||
#ifndef JUCE_VST3_CAN_REPLACE_VST2
|
||||
#define JUCE_VST3_CAN_REPLACE_VST2 1
|
||||
#endif
|
||||
|
||||
#if JucePlugin_Build_VST3 && (__APPLE_CPP__ || __APPLE_CC__ || _WIN32 || _WIN64) && JUCE_VST3_CAN_REPLACE_VST2
|
||||
#define VST3_REPLACEMENT_AVAILABLE 1
|
||||
|
||||
// NB: Nasty old-fashioned code in here because it's copied from the Steinberg example code.
|
||||
void JUCE_API getUUIDForVST2ID (bool forControllerUID, uint8 uuid[16])
|
||||
{
|
||||
char uidString[33];
|
||||
|
||||
const int vstfxid = (('V' << 16) | ('S' << 8) | (forControllerUID ? 'E' : 'T'));
|
||||
char vstfxidStr[7] = { 0 };
|
||||
sprintf (vstfxidStr, "%06X", vstfxid);
|
||||
|
||||
strcpy (uidString, vstfxidStr);
|
||||
|
||||
char uidStr[9] = { 0 };
|
||||
sprintf (uidStr, "%08X", JucePlugin_VSTUniqueID);
|
||||
strcat (uidString, uidStr);
|
||||
|
||||
char nameidStr[3] = { 0 };
|
||||
const size_t len = strlen (JucePlugin_Name);
|
||||
|
||||
for (size_t i = 0; i <= 8; ++i)
|
||||
{
|
||||
juce::uint8 c = i < len ? static_cast<juce::uint8> (JucePlugin_Name[i]) : 0;
|
||||
|
||||
if (c >= 'A' && c <= 'Z')
|
||||
c += 'a' - 'A';
|
||||
|
||||
sprintf (nameidStr, "%02X", c);
|
||||
strcat (uidString, nameidStr);
|
||||
}
|
||||
|
||||
unsigned long p0;
|
||||
unsigned int p1, p2;
|
||||
unsigned int p3[8];
|
||||
|
||||
#ifndef _MSC_VER
|
||||
sscanf
|
||||
#else
|
||||
sscanf_s
|
||||
#endif
|
||||
(uidString, "%08lX%04X%04X%02X%02X%02X%02X%02X%02X%02X%02X",
|
||||
&p0, &p1, &p2, &p3[0], &p3[1], &p3[2], &p3[3], &p3[4], &p3[5], &p3[6], &p3[7]);
|
||||
|
||||
union q0_u {
|
||||
uint32 word;
|
||||
uint8 bytes[4];
|
||||
} q0;
|
||||
|
||||
union q1_u {
|
||||
uint16 half;
|
||||
uint8 bytes[2];
|
||||
} q1, q2;
|
||||
|
||||
q0.word = static_cast<uint32> (p0);
|
||||
q1.half = static_cast<uint16> (p1);
|
||||
q2.half = static_cast<uint16> (p2);
|
||||
|
||||
// VST3 doesn't use COM compatible UUIDs on non windows platforms
|
||||
#ifndef _WIN32
|
||||
q0.word = ByteOrder::swap (q0.word);
|
||||
q1.half = ByteOrder::swap (q1.half);
|
||||
q2.half = ByteOrder::swap (q2.half);
|
||||
#endif
|
||||
|
||||
for (int i = 0; i < 4; ++i)
|
||||
uuid[i+0] = q0.bytes[i];
|
||||
|
||||
for (int i = 0; i < 2; ++i)
|
||||
uuid[i+4] = q1.bytes[i];
|
||||
|
||||
for (int i = 0; i < 2; ++i)
|
||||
uuid[i+6] = q2.bytes[i];
|
||||
|
||||
for (int i = 0; i < 8; ++i)
|
||||
uuid[i+8] = static_cast<uint8> (p3[i]);
|
||||
}
|
||||
#else
|
||||
#define VST3_REPLACEMENT_AVAILABLE 0
|
||||
#endif
|
||||
|
||||
#if JucePlugin_Build_VST
|
||||
pointer_sized_int JUCE_API handleManufacturerSpecificVST2Opcode (int32 index, pointer_sized_int value, void* ptr, float)
|
||||
{
|
||||
#if VST3_REPLACEMENT_AVAILABLE
|
||||
if ((index == 'stCA' || index == 'stCa') && value == 'FUID' && ptr != nullptr)
|
||||
{
|
||||
uint8 fuid[16];
|
||||
getUUIDForVST2ID (false, fuid);
|
||||
::memcpy (ptr, fuid, 16);
|
||||
return 1;
|
||||
}
|
||||
#else
|
||||
ignoreUnused (index, value, ptr);
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
} // namespace juce
|
||||
|
||||
//==============================================================================
|
||||
/** Somewhere in the codebase of your plugin, you need to implement this function
|
||||
and make it return a new instance of the filter subclass that you're building.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue