VST3 Wrapper


#1

Any news, when it will be added to juce?


#2

Sorry, deep in Tracktion5 panic-mode at the moment, and concentrating on hosting.. Should be early in the new year!


#3

cool :)


#4

What's the hosting status? I just read your "news" comment about it... is there still anything we could do to help? Which are the plugins that are not working at the moment?


#5

i noticed IPlug-made VST3 plugins are not working in the Plugin Demo host. this might be because they are based on SingleComponentEffect? Jules - if you want a test plugin let me know


#6

What's the hosting status? I just read your "news" comment about it... is there still anything we could do to help? Which are the plugins that are not working at the moment?

The following plugins that I can test don't work correctly:

  • iZotope's Ozone5, Insight, Meter Tap and Iris plugins appear to load fine, but none of them show their UI
  • MeldaProductions' MDynamicEQ cans the host on load for, at the time of this message, what is a presently an unknown reason
  • Steinberg's ADelay crashes on deletion
  • Steinberg's HostChecker kills the host when calling EditController's setComponentState(). If I comment that sequence out, Host Checker works as it should (except it leaks memory like there's no tomorrow!)

So what does work, without hassle?

  • Seemingly every other MeldaProductions' plugins' do
  • Likewise for FabFilter
  • Steinberg's Note Expression Synth, both with and without UI

#7

i noticed IPlug-made VST3 plugins are not working in the Plugin Demo host. this might be because they are based on SingleComponentEffect? Jules - if you want a test plugin let me know

A test plugin would be fantastic, and greatly appreciated! 


#8

I just built the latest demo host on Maverick. iZotope Nectar 2 and NUGEN Stereoplacer both load but show a blank GUI. MeldaProduction MDrummer loads but crashes the host when trying to open the GUI (with an assertion in the destructor of ReferenceCountedObject). Jules, can we/should we do anything to help, or are you already deeply involved in solving this yourself ?


#9

Hmm - haven't tried those plugins.. We'll try to look at them when we can, but any clues would be welcome!


#10

I've handed over a juce-integrated VST3 client implementation to Jules, along with a series of changes to the VST3 hosting side, so much testing will be needed in the (hopefully) near future to get things working appropriately.

Since writing the hosting side, I noticed that all iZotope plugs give the same result (load but window/graphic-less), without a damned clue why. This is on both Mac and Windows. They're probably all expecting a different order of things to happen, or something is commonly missing. Who knows; we basically need someone from iZotope to tell us.


#11

Still no luck with Meldaproduction and Stereoplacer (black windows) with the tip of today (on a Maverick Mac). I've tried "FabFilter One" (free demo available) and the UI is displayed fine, generally everything seems to work but when deleting the plugin window the destructor is being called twice, leading to an assumption in the leak detector for VST3PluginWindow:

~VST3PluginWindow()
    {
        view->removed();
        getAudioProcessor()->editorBeingDeleted (this);

       #if JUCE_MAC
        dummyComponent.setView (nullptr);
        [pluginHandle release];
       #endif

       const Steinberg::FReleaser releaser (view);
    }

The culprit seems the Steinberg releaser, which again causes the VST3PluginWindow destructor to be called. If I comment out the releaser line, everything's good and I get no leakage...


#12

I checked in a fix for that about half an hour ago..


#13

Most excellent! Works, thanks!


#14

More news from the plugins that show a black UI (mainly Meldaproduction): when building the 64 bit version of the plugin host, everything's fine, the issue only occurs with the 32 bit version...


#15

OSX or Windows?


#16

OSX Mavericks.


#17

On both OSX and Win8… and can be recreated using the demo plugin…

#ifndef  JucePlugin_MaxNumOutputChannels
 #define JucePlugin_MaxNumOutputChannels   32
#endif

The plugin only has 14 outputs.

Rail


#18

Off the top of my head, is it possible the VST3 code is just not providing a speaker configuration?

The latest SDK shows a max of 24 channels: Steinberg::Vst::SpeakerArr::kString222


#19
/** The equivalent numChannels and speaker arrangements should always
    match between this function and fillWithCorrespondingSpeakerArrangements().
    There can only be 1 arrangement per channel count. (i.e.: 4 channels == k31Cine OR k40Cine)
    @see fillWithCorrespondingSpeakerArrangements
*/
static Steinberg::Vst::SpeakerArrangement getArrangementForNumChannels (int numChannels) noexcept
{
    using namespace Steinberg::Vst::SpeakerArr;
    if (numChannels == 24)  return (Steinberg::Vst::SpeakerArrangement) 1929904127; // Known as "k222" - for backwards compatibility with older SDKs
    if (numChannels == 14)  return k131;
    if (numChannels == 13)  return k130;
    if (numChannels == 12)  return k111;
    if (numChannels == 11)  return k101;
    if (numChannels == 10)  return k91;
    if (numChannels == 9)   return k90;
    if (numChannels == 8)   return k71CineFullFront;
    if (numChannels == 7)   return k61Cine;
    if (numChannels == 6)   return k51;
    if (numChannels == 5)   return k50;
    if (numChannels == 4)   return k31Cine;
    if (numChannels == 3)   return k30Cine;
    if (numChannels == 2)   return kStereo;
    if (numChannels == 1)   return kMono;
    // Custom channel configuration:
    if (numChannels > 0)
    {
        juce::BigInteger bi;
        bi.setRange (0, jmin (numChannels, (int) (sizeof (Steinberg::Vst::SpeakerArrangement) * 8)), true);
        return (Steinberg::Vst::SpeakerArrangement) bi.toInt64();
    }
    return kEmpty;
}
/** The equivalent numChannels and speaker arrangements should always
    match between this function and getArrangementForNumChannels().
    There can only be 1 arrangement per channel count. (i.e.: 4 channels == k31Cine OR k40Cine)
    @see getArrangementForNumChannels
*/
static void fillWithCorrespondingSpeakerArrangements (Array<Steinberg::Vst::SpeakerArrangement>& destination,
                                                      int numChannels)
{
    using namespace Steinberg::Vst::SpeakerArr;
    destination.clearQuick();
    if (numChannels <= 0)
    {
        destination.add (kEmpty);
        return;
    }
    /*
        The order of the arrangement checks must be descending, since most plugins test for
        the first arrangement to match their number of specified channels.
    */
    // Custom channel configuration:
    if (numChannels > 24)
    {
        juce::BigInteger bi;
        bi.setRange (0, jmin (numChannels, (int) (sizeof (Steinberg::Vst::SpeakerArrangement) * 8)), true);
        destination.add ((Steinberg::Vst::SpeakerArrangement) bi.toInt64());
    }
    if (numChannels >= 24)  destination.add ((Steinberg::Vst::SpeakerArrangement) 1929904127); // Known as "k222" - for backwards compatibility with older SDKs
    if (numChannels >= 14)  destination.add (k131);
    if (numChannels >= 13)  destination.add (k130);
    if (numChannels >= 12)  destination.add (k111);
    if (numChannels >= 11)  destination.add (k101);
    if (numChannels >= 10)  destination.add (k91);
    if (numChannels >= 9)   destination.add (k90);
    if (numChannels >= 8)   destination.add (k71CineFullFront);
    if (numChannels >= 7)   destination.add (k61Cine);
    if (numChannels >= 6)   destination.add (k51);
    if (numChannels >= 5)   destination.add (k50);
    if (numChannels >= 4)   destination.add (k31Cine);
    if (numChannels >= 3)   destination.add (k30Cine);
    if (numChannels >= 2)   destination.add (kStereo);
    if (numChannels >= 1)   destination.add (kMono);
}


#20

The latest tip (139e192) fixes the outputs issue (Yay).

The OSX Demo Host 64 bit only shows a black GUI though.

On quitting the host I got:

*** Leaked objects detected: 1 instance(s) of class ContentWrapperComponent
JUCE Assertion failure in juce_LeakedObjectDetector.h:95

from juce_VST3PluginFormat.cpp line 946

Cheers,

Rail