AAX_CHostProcessor support

Hi Guys,

I want to use AAX_CHostProcessor interface for AAX plugins. I know JUCE doesn’t support it. I wonder if someone uses it and guides me to add that to my project?

Basically, I need to use PreRender, PostRender and RenderAudio member functions in it for an Audio Suite plugin (offline).



AudioSuite should share the same processor code as realtime… have you tried just checking the AudioProcessor::isNonRealtime() state?


The original poster is probably looking to do something AudioSuite specific like access all the samples to be processed before the actual processing happens. (Consider processings like normalization or reversing of the audio, which AudioSuite allows to do.)



Since we needed this in Sound Radix, we’ve added AAX AudioSuite (CHostProcessor) support to JUCE 4 & 5.

soundradix/juce5 is pretty much on par with 5.x develop branch.
soundradix/master is currently 4.3.1.

  • Remember! CHostProcessor behaves different than Native AAX running with AudioSuite property (for example: input number will be your maximum supported if in multi-input mode or mono).

  • It was tested on Pro Tools 10.3.10 (32-bit) and Pro Tools 2018 (64-bit).
    (it doesn’t support older Pro Tools < 10.3.5 as this is based on AAX API).

  • AudioProcessor::wrapperType got wrapperType_AudioSuite (to allow code branching for CHostProcessor version…).

  • AudioProcessor now has analyseBlock to allow analysis stage prior to processBlock.

  • AudioProcessorEditor has getCustomLabel to allow customized naming on AudioSuite UI.

  • We have random audio access encapsulated to juce::AudioFormatReader.

Here are the relevant commits -












Comments and bugfixes are welcome!




Note: If ROLI wants to merge it into their branch they’re always welcome :slight_smile: And everyone’s welcome to use our changes with no extra limitations on top of the JUCE license etc


I’m using sound radix modules and are great. Is there a way to build only the AudioSuite AAX version of the plugin or make impossible for the user to insert it on a track?

Yes! The preprocessor definition JucePlugin_EnhancedAudioSuiteOnly = 1 does this, and this is also what we do for Auto-Align Post.

1 Like

Awesome! Thanks

@yairadix is there a way to know when the user selects a track with a different channel number (and layout)? Something like a callback or some sort of workaround that I could try to update the channel-configuration of my audiosuite plug-in before pressing render.

1 Like

IIUC no. Only when the user clicks analyze/render you can know the layout. The UI can also be opened without any selection and the selection can also include several regions with different layouts.


Thanks @yairadix, I’ll try to handle the thing in some other way! Very grateful for your audiosuite support anyway :heart:

1 Like

@ttg @yairadix Very grateful for your AudioSuite support! I think I am missing something though.

I have defined the preprocessor definitions JucePlugin_EnhancedAudioSuite and JucePlugin_EnhancedAudioSuite_RequiresAnalysis since I always want an offline analysis pass prior to the rendering pass. I have overridden the:

  • AudioProcessor::prepareToAnalyse()
  • AudioProcessor::analyzeBlock()
  • AudioProcessor::analysisFinished()
  • AudioProcessor::isAuthorized()

methods but, the plug-in seems to receive no callbacks to the above methods.

Am I missing something?

At which point are the above methods going to receive a callback?

  • as soon as I have my AudioSuite plug-in open and select a region from an audio clip?
  • do I have to create a button which will call the AudioProcessor::EnhancedAudioSuiteInterface->requestAnalysis()
  • do I have to define a preprocessor definition which will enable a native AAX Analyze button (like the Render one) and then be able to get a callback at the AudioProcessor::analyzeBlock() method?

Analysis should happen after clicking render or analyze button.

You can make sure the audio suite version is indeed chostprocessor by assert the wrapper type.

OK, I just figured out that Ι have to define the JucePlugin_EnhancedAudioSuite_OptionalAnalysis preprocessor definitions to enable the Analyze button.

I used the JucePlugin_EnhancedAudioSuite_RequiresAnalysis which does not enable the Analyze button but triggers a callback to the analyzeBlock() method before the processBlock() method when the Render button is pressed.


Yeah. it’s worth noting that those flags (wrapping Avid’s flags) are quite tricky as they have dependencies :slight_smile: . It’s worth reading/asking on Avid’s about those since CHostProcessor is behaving different than AAX in many ways.

Hey there,
I was wondering about calling the AnalyzeAudio callback clicking on a custom GUI Element, How can I achieve this feature? I saw someone already achieved this.


We made partial support for that.

The reason it is partial is due to cyclic/construction order.
I don’t remember the exact reason but the processor is created only once a render/analysis been made. so current ForceAnalysis / ForceRender would ‘link’ only after first time it was initiated by the host (Pro Tools) itself.

Feel free to send a PR if you have a better solution :slight_smile:

1 Like

Is the analyzeBlock() method intended to analyze only the selected audio region from an audio clip or the whole audio clip?

When I use the Selector tool from Pro Tools
I receive the audio data that correspond to the whole audio clip and not just to the selected audio region (black area at the following image)

Is this expected?
Is there a preference for Pro Tools settings that could change that behavior?

AFAIK only selected areas can be processed by your side. There is no way to change that behavior. A user should select whole clip(s) to process it at ones.

Well, my AudioSuite plug-in ignores the user-selected area and analyzes all the audio data from an audio clip.

When rendering, though, the plug-in processes only the selected audio region. The issue only affects the analyze workflow.