Plugin Host - AU Param event listener weridness


#1

Hi Guys,

Certain plugins for example UAD and Rob Papen Raw call the listener callback for every parameter.

So if I change the eventCallback in juce_AudioUnitPluginFormat.mm to log out the events:

 

    void eventCallback (const AudioUnitEvent& event, AudioUnitParameterValue newValue)

    {

        printf("id = %u, event = %u\n", event.mArgument.mParameter.mParameterID, event.mEventType);

        switch (event.mEventType)

...

 

For this example I am using UAD Pultec Pro legacy. On the gui I change param 2, here is what is printed:

 

id = 2, event = 1

id = 2, event = 0

id = 0, event = 0

id = 1, event = 0

id = 3, event = 0

id = 4, event = 0

id = 5, event = 0

id = 6, event = 0

id = 7, event = 0

id = 8, event = 0

id = 9, event = 0

id = 10, event = 0

id = 11, event = 0

id = 12, event = 0

id = 13, event = 0

id = 14, event = 0

id = 15, event = 0

id = 16, event = 0

id = 2, event = 2

 

 

So we get the begin and value for param 2, then a value for every param apart from 2 then the end for 2.

I have stuck a breakpoint at AUEventListenerNotify and the plugin is only calling it three times with the begin, value then end events.

For plugins like Raw with 800 params this causes a fair bit of load on the system!

 

I debugged the plugins in Live and Logic X with a breakpoint on the listener callback and they are only called the correct 3 times so Juce is acting differently.

 

Anyone any ideas on this?

 

Cheers

 

Andy

 

 


#2

This is strange. Could it be that changing a parameter in those plug-ins causes the preset to change? For example, if a factory preset is selected and you change one parameter then some plug-ins switch the preset to a "custom" preset. JUCE probes all parameters when a preset has changed. Try commenting out line 996 in juce_AudioUnitPluginFormat.mm.


#3

Hi Fabian,

Thanks for the reply, sorry for the day I never got a notification of your post.

I have tracked it down a bit further:

The plugins in question all have kAudioUnitParameterFlag_IsGlobalMeta set on every parameter. They also don’t support the kAudioUnitProperty_DependentParameters property!

So the Listener is called for every parameter!

From what I have managed to glean auval fails any plugin that updates more than one parameter from a single param update, a simple fix for this was for the developers to set the kAudioUnitParameterFlag_IsGlobalMeta flag for the problem parameter. There then seems to be a bug in CoreAudio where this doesn’y quite work correctly and the fix is to set every parameter to have the kAudioUnitParameterFlag_IsGlobalMeta flag. Supporting kAudioUnitProperty_DependentParameters is not required to get it through auval validation so in general this wasn’t implemented.

What I don’t understand is how certain (but not all) hosts manage to tell the listener system not to behave this way and only call the listener callback for the single parameter update rather than all the dependent parameters.


#4

Many plug-ins these days check the host they are running in and have a slightly different behaviour. Maybe UAD etc. check to see if they are running in Logic and if yes, don’t set kAudioUnitParameterFlag_IsGlobalMeta for every parameter. Just a guess.