T11: IPC param sync 2 chieu native<->JS (setParamNormalized/setParameter, vst_param_changed event, guard chong loop)
This commit is contained in:
@@ -13,9 +13,33 @@ struct FakeState
|
||||
{
|
||||
float phase = 0.0f;
|
||||
int32 sampleRate = 44100;
|
||||
float gain = 0.5f; // param 0 — "Gain" (0..1)
|
||||
};
|
||||
|
||||
FakeState g_state;
|
||||
void* g_audioMaster = nullptr;
|
||||
|
||||
void VSTCALLBACK fakeSetParameter (AEffect* effect, int32 index, float value)
|
||||
{
|
||||
if (index == 0)
|
||||
{
|
||||
g_state.gain = value;
|
||||
// Báo host: param đổi từ editor/plugin (T11) — chống loop host-side.
|
||||
if (g_audioMaster)
|
||||
{
|
||||
typedef VstIntPtr (VSTCALLBACK* AMFn) (AEffect*, int32, int32, VstIntPtr, void*, float);
|
||||
reinterpret_cast<AMFn> (g_audioMaster) (effect, audioMasterAutomate, index, 0, nullptr,
|
||||
value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
float VSTCALLBACK fakeGetParameter (AEffect*, int32 index)
|
||||
{
|
||||
if (index == 0)
|
||||
return g_state.gain;
|
||||
return 0.0f;
|
||||
}
|
||||
|
||||
int32 VSTCALLBACK fakeDispatcher (AEffect* effect, int32 opcode, int32 index,
|
||||
VstIntPtr value, void* ptr, float opt)
|
||||
@@ -91,15 +115,18 @@ void VSTCALLBACK fakeProcessReplacing (AEffect*, float** inputs, float** outputs
|
||||
|
||||
AEffect g_effect;
|
||||
|
||||
AEffect* VSTCALLBACK createInstance (void*)
|
||||
AEffect* VSTCALLBACK createInstance (void* audioMaster)
|
||||
{
|
||||
g_audioMaster = audioMaster;
|
||||
std::memset (&g_effect, 0, sizeof (g_effect));
|
||||
g_effect.magic = CCONST ('V', 's', 't', 'P');
|
||||
g_effect.dispatcher = &fakeDispatcher;
|
||||
g_effect.processReplacing = &fakeProcessReplacing;
|
||||
g_effect.setParameter = &fakeSetParameter;
|
||||
g_effect.getParameter = &fakeGetParameter;
|
||||
g_effect.numInputs = [] (AEffect*) -> int32 { return 0; };
|
||||
g_effect.numOutputs = [] (AEffect*) -> int32 { return 2; };
|
||||
g_effect.numParams = [] (AEffect*) -> int32 { return 0; };
|
||||
g_effect.numParams = [] (AEffect*) -> int32 { return 1; };
|
||||
g_effect.numPrograms = [] (AEffect*) -> int32 { return 0; };
|
||||
g_effect.flags = [] (AEffect*) -> int32 { return effFlagsCanReplacing | effFlagsIsSynth; };
|
||||
g_effect.uniqueID = CCONST ('F', 'k', '2', 'V');
|
||||
@@ -111,6 +138,5 @@ AEffect* VSTCALLBACK createInstance (void*)
|
||||
|
||||
extern "C" __declspec (dllexport) AEffect* VSTPluginMain (void* audioMaster)
|
||||
{
|
||||
(void) audioMaster;
|
||||
return createInstance (audioMaster);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user