Help with Managing Plugin Resources to Eliminate Noise on Stop

Hello,

I’m currently working on an audio processor that loads VST3 plugins for audio playback (synths, DSP effects, etc.). I’ve encountered an issue where there’s unwanted noise when playback is stopped. It appears that the plugin instance might not be properly resetting or cleaning up its internal state when this happens.

Here’s what I’ve tried so far:

  • Using setProcessing(false) and setProcessing(true) to reset the plugin state.
  • Sending “note-off” events to ensure all notes are properly terminated.
  • Attempting to zero out processing buffers.

Despite these efforts, the noise persists after stopping playback. I understand that VST3 doesn’t have a direct equivalent to the suspend/resume calls from VST2, and I’ve read that the ProcessContext structure might be important for handling transport changes.

My main concern is understanding where internal data, such as processed audio buffers, event lists, and parameter changes, are stored within the plugin instance. Since the IAudioProcessor interface seems to serve primarily as an API layer, I’m unsure which internal structures or instances within the plugin are responsible for holding this data. Clarifying this could help me identify how to better manage or reset these states to eliminate the noise.

Could anyone provide guidance on the best practices for fully cleaning up or resetting a plugin instance to avoid this issue? Is there a specific API or method, or instances inside the loaded plugin object, that I can target?

Thank you for your assistance!

Best regards,

By transport Stop, the plugin gets the info in the ProcessContext flag with kPlaying or not.
The host could continue to process the plugin ( Audio Processor Call Sequence - VST 3 Developer Portal (steinbergmedia.github.io))
Normally a plugin should clear its output Buffers if they are not silent.

Does it happen with others plugins?

1 Like

Thank you first of all.

here’s my pseudocode for proper process.

if (transport state == stopped) {
(ProcessData.processContext.state to what value? I only see "kplaying / kCycleActive / kRecording. I don’t know which state I need to set to notify plugins that playback is stopped?)
IaudioProcessor->process(ProcessData) ? or should I query it from Icomponent first?
}

I need to know how to signal plugin that transport is stopped in essence I guess.

without this logic I think other plugins would behave the same since they would also have “note on” dangled when playback stopped from host but not signaling the plugins.