Mono/Mono AU fails to load in Live, "This Audio Unit plug-in is not compatible. Failed to initialize."

Hi All,

I am building a plugin using the AudioProcessorGraph model and running into a bit of an issue.

The plugin for now should only support mono input and output. For the VST3, everything is working well, you can add it to a track in Live and it is added to the track without complaint. The plugin only outputs the left channel of the input, but that is as expected until we get around to fixing that.

If you attempt to add the AU version of the plugin, however, you get the error message:

"Failed to create the Audio Unit "Blah Blah"
This Audio Unit plug-in is not compatible.
Failed to initialize."

Similarly, if I go to Logic and attempt to add it to a track in Mono mode, all good.

Mono->Stereo and Stereo both produce the error text:

Failed to load Audio Unit “Blah Blah”, please contact the manufacturer for an updated version or further assistance.

In terms of the code, we have a few nodes in an AudioProcessorGraph.

The outer shell, as well as each node each implement the following:

// method is called when the AudioProcessor for each node is initialized
AudioProcessor::BusesProperties PannerBlock::BusLayout()
{
    BusesProperties buses{};

    // Add main buses
    bool defaultActivation = true;

    buses.addBus(true, "Input", AudioChannelSet::discreteChannels(1), defaultActivation);
    buses.addBus(false, "Output", AudioChannelSet::discreteChannels(1), defaultActivation);
    return buses;
}

and

bool PannerBlock::isBusesLayoutSupported(const BusesLayout& layouts) const
{
    if (layouts.getMainOutputChannelSet() != AudioChannelSet::mono() ||
        layouts.getMainInputChannelSet() != AudioChannelSet::mono())
    {
		return false;
    }

    return true;
}

It is my understanding that these should ensure the plugin can only be instantiated in Mono mode.

In Live, even if I change the isBusesLayoutSupported and BusLayout to support both mono/mono and stereo/stereo formats, the same error text is displayed, that it Failed to initialize, with no other failure indication in the logs.

The auval passes with no errors, and accurately displays the supported bus layouts, 1-1 or 2-2 depending on the trial I’m doing.

My questions then are:

  • Any ideas on what I am doing wrong with the stereo/stereo version of Live? Is there something I’m doing wrong in these calls that I’m not telling Live that I support stereo/stereo?
  • How do I prevent my plugin from showing up in Mono-Stereo / Stereo in Logic?
    • Note to future users, after building/rebuilding it may be wise to delete the audio units cache for logic to rescan: rm ~/Library/Caches/AudioUnitCache/com.apple.audiounits.cache
  • How do I prevent the AU from showing up in Ableton if it isn’t going to work?

Thank you!

A little too early to tell, but may have solved my own issue by the following line in AppConfig.h

#define JucePlugin_PreferredChannelConfigurations {1, 1}

It seems like this is what helps tell the AU host how to handle these kinds of thing. After implementing this it doesn’t crash on drag-in in Live and only appears as mono/dual mono in Logic.

Testing more and will confirm when I understand the ramifications!

This does seem to fix it!

A couple notes to future visitors:

If you are attempting to make a “mono only” plugin, I believe the following options are necessary in AppConfig.h:
#define JucePlugin_PreferredChannelConfigurations {1, 1}, {0, 0}, {0, 1}, {1, 0}

The 0’s are necessary because the VST3 validator (if you’re running it) disables the master bus. See related topic here:

That’s all. Hopefully this helps someone in the future!

Keeping up the nice conversation with myself :slight_smile:

I found this older post that seems to indicate that it should be one or the other (JucePlugin_PreferredChannelConfigurations OR isBusesLayoutSupported) but not both?

It seems that in my experience you need both for VST and AU to properly work together.

So far I was under the impression, that in the boilerplate the presence of JucePlugin_PreferredChannelConfigurations creates a version of isBusesLayoutSupported() and excludes your version from the build via #ifndef JucePlugin_PreferredChannelConfigurations.

Is that the case? Maybe it changed at some point…

I do not have JucePlugin_PreferredChannelConfigurations set (the Plugin Channel Configurations field in Projucer is blank), and I do have isBusesLayoutSupported() defined, and my AU plugins work fine like that (using the JUCE 5.3.2 SDK).

Alright may have found the problem area.

Note: this is to solve the Ableton issue specifically, the error text saying “This Audio Unit plug-in is not compatible”

in juce_AU_Wrapper.mm, there is a block that looks like the following:

#ifdef JucePlugin_PreferredChannelConfigurations
     const short configs[][2] = { JucePlugin_PreferredChannelConfigurations };
     if (AudioUnitHelpers::isLayoutSupported (*juceFilter, isInput, busNum, ch, configs))
              tags.addIfNotAlreadyThere (static_cast<AudioChannelLayoutTag> ((int)kAudioChannelLayoutTag_DiscreteInOrder | ch));
#else
                if (bus->isLayoutSupported (AudioChannelSet::discreteChannels (ch)))
                    tags.addIfNotAlreadyThere (static_cast<AudioChannelLayoutTag> ((int) kAudioChannelLayoutTag_DiscreteInOrder | ch));
#endif

If JucePlugin_PreferredChannelConfigurations is defined, that AudioUnitHelpers::isLayoutSupported returns true and the layoutt is added

If I do the isBusesLayoutSupported method, it goes to the #else and that one does NOT return true, so the layout isn’t added.

I think this creates a mismatch of how each behaves. Ideally I could have the following all at the same time using the newer(?) method of isBusesLayoutSupported when I want to create a mono plugin

  1. Plugin would instantiate in Live, even if stereo isn’t explictly supported, behaves like the JucePlugin_PreferredChannelConfigurations and just launches in a Dual-mono kind of mode
  2. Logic would only show mono/dual mono. This again means that I say only mono is supported in isBusesLayoutSupported.

Any thoughts anyone on if I’m doing something wrong here? Or is this an issue in JUCE itself?