There seems to be a lot of FUD appearing in this thread so please let me try and clear some things up.
Motivation for pluginval and tracktion.com Plugin Developer’s Page
pluginval was created for two main reasons, the first was to validate and stress test our own Tracktion plugins as there didn’t seem to be a suitable tool for this available. I wanted something that would create stack traces for problems in our CI pipeline.
The second was to provide a tool in Waveform that could catch compatibility issues with plugins and report the details to us. Replicating plugin incompatibilities is extremely difficult so using a tool that increases the chances of this should greatly reduce the amount of time required to debug.
Once I’d done this I realised this could be a useful tool for others so decided to open source it. We added the tracktion.com plugin developer’s page for two reasons:
Firstly, to give some promotion to companies that test with pluginval. I’ve always been a keen advocate of testing and wanted to promote it in the community and try and push a few sales towards the companies that embraced it. I’m not ashamed of this and it has nothing to do with investors or third parties.
Secondly, lofty ideal was that if there was a single tool that everyone in the community was using to validate plugins, it would be easier to create a “standard” for plugin development. One of the huge problems plugin APIs have suffered from historically is lack of specification so the idea was to create this spec using a tool.
pluginval Development
I primarily work on pluginval in my spare time. In September 2021 I had a baby so my spare time has dropped to almost 0. Additionally, we launched Waveform 12 in early 2022, several plugins and continue to work on a major new hardware product and a huge new version of Tracktion Engine 2.0. Unfortunately pluginval was the project with the lowest priority so received the least dev time.
pluginval is an open source project so if people have issues with it they can always contribute fixes. That is one way to expedite things. I should warn you though that as a project maintainer, I can’t just accept any PR that is opened. I have to review it and make sure it works, is in the style of the project, is a valid fix/feature and doesn’t break anything else. That’s hard to do when you only have a few minutes to look at something. I did this recently with a PR and it broke a lot of things as a side effect which @reuk spotted and had to create a new PR as a fix. I’ve been more cautious about PRs as a result since.
Project Structure
pluginval was always designed to only be built with the version of JUCE in the git submodule. The JUCE API changes too rapidly to ensure it always builds with the latest. Furthermore, as it’s a standalone app/tool, there shouldn’t be any reason you need to integrate it in to an existing project so shouldn’t get JUCE clashes. Yes, it could be updated to the most recent JUCE. It’s on my list.
Finally, assertions are tricky things to spot as they don’t trigger in release builds (and hence the pre-built binaries). This means they don’t trigger on our CI where the bulk of our pluginval usage happens and the above VST3 assertion has gone undetected for a while.
Additionally, pluginval was always created to stress test plugins and those grey areas where no threading is specified by the formats. I’m pretty sure this JUCE assertion appeared after I originally wrote pluginval and I hadn’t had time to go back and change the behaviour of the test. The main thing I haven’t been able to decide is if it should be called on the message thread for all plugin formats or specifically for VST3.
Additionally, I know the comment in JUCE says setupProcessing
should only be called from the message thread but before this comment was added, the VST3 docs simply say this:
/** Called in disable state (setActive not called with true) before setProcessing is called and processing will begin. */
virtual tresult PLUGIN_API setupProcessing (ProcessSetup& setup) = 0;
Which doesn’t say anything about threading. (As an aside this is one of the huge benefits of clap, it actually specifies the threading contracts).
Finally
I’m going to try and spend a bit of time on pluginval this week to rectify the above issue and also change the internal architecture a bit. I have an idea that I’m hoping will reduce the complexity a bit.