T11: IPC param sync 2 chieu native<->JS (setParamNormalized/setParameter, vst_param_changed event, guard chong loop)

This commit is contained in:
2026-08-11 16:27:30 +07:00
parent aaf21ddf89
commit 9eec33cc79
7 changed files with 650 additions and 41 deletions
+29 -3
View File
@@ -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);
}