AU version processes differently than VST/VST3/etc?

Hi guys, Working on a commercial plugin here under NDA, so I can’t share the code (IK that makes this difficult to answer), and having A strange Issue where DSP behaves completely differently in the AU build than other formats.

The DSP in question is an in-house dynamic range compression algorithm and an in-house clipping algorithm.
The behavior in question is that in the AU version, the compressor DSP doesn’t seem to be compressing at all, but instead just causing a large gain increase. The clipping DSP seems to be running twice, but only when other parameters in the plugin have been changed (that are totally unrelated and have no relevant code between them). In the other formats, things just behave correctly, the compressor compresses, the clipper clips, etc.

The compressor DSP is part of an in-house JUCE module and has been used in other products in the past without issue (most recent build/use in other products was October of last year), so kind of going insane right now.

If it might be relevant, we’re using the latest version of Juce 5, using PACE/iLok for our antipiracy solution (so using their compiler), using XCode 11 on Mojave, and targeting OSX 10.9+.

I understand that without the code it’s hard to say what’s going on, just hoping someone else may have had similar issues in the past and know of some possible points to inspect.

Thanks in advance!

Sounds like a bug? I’ve never seen this happen unless I’ve mucked up the build and got different versions of code running.

Is your processBlock getting called. I’d attach a debugger to it and make sure it’s actually doing what you think it is … and the code you think is being executed is running, and it’s not some other version you’ve got installed…?

Just a shot in the dark, since you are working on a compressor, do you have any fancy sidechain routing options that could be messed up in one format / one DAW?

processBlock is definitely getting called, as other DSP (some eq filters) in processBlock is working properly, and changing DSP in the compressor (eg, auto-makeup gain) changes what happens, but in unexpected ways.

I’ve tried totally clean builds and still get this behavior. It’s really strange that it can be behaving so differently compared to other formats. Unfortunately I’m developing using a VM for the Mac side of things, so I can’t debug into the processing functions because audio input/output doesn’t work in MacOS guests For testing Mac builds, I’m totally reliant on our testers :frowning:

This should have been an obvious thing to check, but I hadn’t thought of that until now!
We do have sidechain routing available so I’ll definitely look into this!

This is four years old but it may still be relevant regarding Sidechain: Sidechain is not silent as expected (AU, Logic X 10.2.2)

I’d also be curious to know if things haven’t changed since, are you testing the AU with Logic?

Perhaps you can test it with some other DAW (REAPER or JUCE’s own audio plug-in host) to sesee if you get the same behavior in AU format (but not the others)

1 Like

So far it doesn’t seem to be related to the sidechain :confused:

I don’t think this is relevant with how we currently have things setup, but I will look into it. I would actually be more concerned with this if it was the other way around (Sidechain WAS silent instead of just being a copy of MainBus).

We’re currently testing the AU in Reaper and Logic, VST3 in Reaper and Cubase, and AAX in PT.
This problem is only specific to AU, but happens in both Reaper and Logic, so it’s not DAW specific, just format specific.

Annoying as this may sound - setting up a proper test environment (buying a Mac/Hackintosh PC) is really the only way you’ll ever be able to solve these kinda bugs in reliable way.

I don’t disagree with you. Unfortunately this is the situation I’m stuck with for the time being :man_shrugging:


It turns out that for AU, the host ignores whether the sidechain should be enabled by default, and it gets enabled even when there is nothing connected to it!
So, the solution was to loop over the data from each sidechain channel in that Bus’s Buffer and sum them, then if that sum was 0, feed the MainBus’s buffer to the compressor’s sidechain instead of the sidechain Bus’s buffer.