fix(bridge): one editor at a time + guard reload race
- Close other channels' editor windows before attaching a new one (Option B) - needsReload()/setReloading() guard: skip processAudioBlock during terminate+reload teardown to avoid UAF/hang when reopening GUI - Wait for editor registry cleanup (5s timeout) before creating window
This commit is contained in:
@@ -34,6 +34,13 @@ public:
|
||||
// Open/close Native GUI window
|
||||
virtual bool openGUI(void* parentWindowHandle) = 0;
|
||||
virtual void closeGUI() = 0;
|
||||
// VST3 reopen-after-close: the bridge checks before openGUI whether the
|
||||
// instance must be rebuilt; while it is, the engine sets reloading=true
|
||||
// and the real-time loop skips processAudioBlock (teardown must not race
|
||||
// the audio thread — a reload terminates the VST while renderAll may be
|
||||
// inside processAudioBlock on the same instance).
|
||||
virtual bool needsReload() const { return false; }
|
||||
virtual void setReloading(bool /*on*/) {}
|
||||
|
||||
// Real-time Audio PCM Float32 rendering loop
|
||||
virtual void processAudioBlock(float* outputL, float* outputR, uint32_t numSamples) = 0;
|
||||
|
||||
@@ -72,6 +72,11 @@ public:
|
||||
|
||||
INativeInstrument* get(uint32_t channel);
|
||||
|
||||
// Mark a channel as rebuilding its VST instance (GUI reopen): the
|
||||
// real-time loop then skips processAudioBlock for that channel so VST
|
||||
// teardown never races the audio thread.
|
||||
void setReloading(uint32_t channel, bool on);
|
||||
|
||||
// Flush every sounding note on every assigned channel.
|
||||
void allNotesOff();
|
||||
|
||||
|
||||
@@ -26,6 +26,8 @@ public:
|
||||
void pitchBend(uint32_t channel, uint32_t bend14) override;
|
||||
bool openGUI(void* parentWindowHandle) override;
|
||||
void closeGUI() override;
|
||||
bool needsReload() const override { return hasAttachedOnce_ && !guiAttached_; }
|
||||
void setReloading(bool on) override { reloading_ = on; }
|
||||
void processAudioBlock(float* outputL, float* outputR, uint32_t numSamples) override;
|
||||
|
||||
private:
|
||||
@@ -37,6 +39,7 @@ private:
|
||||
bool loaded_;
|
||||
bool guiAttached_;
|
||||
bool hasAttachedOnce_;
|
||||
bool reloading_; // guarded by InstrumentEngineManager::mu_ (set via setReloading)
|
||||
bool reload();
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user