Current AAX status?


I found a few posts (like this: regarding AAX plugins, and I was wondering if someone could tell me:

  • is AAX support considered ready-for-production at this moment?
  • has anyone already released an AAX plugin succesfully?

For what it’s worth: this is for an effect plugin with the following configuration: (in: mono or stereo audio + MIDI, out: stereo audio), with a bank of factory presets to start with, and automatable parameters.

So, if anyone is in the loop on the current status, it’d be helpful to hear about your experiences.


afaik AAX support is currently stable, and maybe even complete. haven’t made a release yet but we are running a beta and there are currently no issues reported from our beta testers. cheers! Yair

That sounds good!
We’ll give it a try then one of the coming weeks.
Thanks for the feedback,

Hi Yair,

Have you tried getting Auxiliary Output Stems in AAX with JUCE yet?



Nope :slight_smile:

I’ve been shipping 32-bit AAX for a while. There was a Juce fix (right around early February) that dealt with a plugin ID issue. Since then it’s been smooth sailing. The issue that nailed us on the 64-bit stuff (the one that was resolved around 2 weeks ago) didn’t show up in 32-bit.

It’s actually pretty cool. I’ve got a tester with AAX at one site and RTAS at the other. He can easily take jobs back and forth. PT10 just loads whichever is available.

[quote=“yairadix”][quote=“Rail Jon Rogut”]
Have you tried getting Auxiliary Output Stems in AAX with JUCE yet?

Nope :)[/quote]

Actually just got it working today… Wish Jules would add Aux support to JUCE though.



I’ve been updating my plugin code to work with the latest Juce tip changes, figuring out which debug version of Pro Tools to use, struggling with iLok issues, all that fun stuff. Today, I tried one of my plugins in AAX for the first time, and it JUST WORKS.

Thanks to Jules for his work in creating the AAX wrapper, and thanks to all the other developers that have added your AAX code to Juce!

Sean Costello

In juce_AAX_Wrapper.cpp in method:

You can change:


Anyone know why a call to :

instead of :




Can’t offer anything here. I haven’t used the call so I haven’t run into it.

[quote=“Mikey”][quote=“Rail Jon Rogut”]
Anyone know why a call to :

Can’t offer anything here. I haven’t used the call so I haven’t run into it.[/quote]

Nevermind… using the latest release build of the host doesn’t assert… I’m checking on a newer dev build…


Okay, so the final change which works with the latest host builds:

In juce_AAX_Wrapper.cpp



        bool getCurrentPosition (juce::AudioPlayHead::CurrentPositionInfo& info)
            const AAX_ITransport& transport = *Transport();
            info.bpm = 0.0;
            check (transport.GetCurrentTempo (&info.bpm));

            int32_t num = 4, den = 4;
            transport.GetCurrentMeter (&num, &den);
            info.timeSigNumerator   = (int) num;
            info.timeSigDenominator = (int) den;

            info.timeInSamples = 0;
            if (info.isPlaying == false)
                check (transport.GetTimelineSelectionStartPosition (&info.timeInSamples));
                check (transport.GetCurrentNativeSampleLocation (&info.timeInSamples));
            info.timeInSeconds = info.timeInSamples / getSampleRate();

            int64_t ticks = 0;
            check (transport.GetCurrentTickPosition (&ticks));
            info.ppqPosition = ticks / 960000.0;

            info.isLooping = false;
            int64_t loopStartTick = 0, loopEndTick = 0;
            check (transport.GetCurrentLoopPosition (&info.isLooping, &loopStartTick, &loopEndTick));
            info.ppqLoopStart = loopStartTick / 960000.0;
            info.ppqLoopEnd   = loopEndTick   / 960000.0;

            // No way to get these: (?)
            info.isRecording = false;
            info.ppqPositionOfLastBarStart = 0;
            info.editOriginTime = 0;    
            AAX_EFrameRate frameRate;
            int32_t offset;
            double framesPerSec = 24.0;
            transport.GetTimeCodeInfo(&frameRate, &offset);
            switch (frameRate)
                case AAX_eFrameRate_Undeclared:    info.frameRate = AudioPlayHead::fpsUnknown;  break;
                case AAX_eFrameRate_24Frame:       info.frameRate = AudioPlayHead::fps24;       break;
                case AAX_eFrameRate_25Frame:       info.frameRate = AudioPlayHead::fps25;       framesPerSec = 25.0; break;
                case AAX_eFrameRate_2997NonDrop:   info.frameRate = AudioPlayHead::fps2997;     framesPerSec = 29.97002997; break;
                case AAX_eFrameRate_2997DropFrame: info.frameRate = AudioPlayHead::fps2997drop; framesPerSec = 29.97002997; break;
                case AAX_eFrameRate_30NonDrop:     info.frameRate = AudioPlayHead::fps30;       framesPerSec = 30.0; break;
                case AAX_eFrameRate_30DropFrame:   info.frameRate = AudioPlayHead::fps30drop;   framesPerSec = 30.0; break;
                case AAX_eFrameRate_23976:         info.frameRate = AudioPlayHead::fps24;       framesPerSec = 23.976; break;
                default:                           info.frameRate = AudioPlayHead::fpsUnknown;  break;
            info.editOriginTime = offset / framesPerSec;
            return true;


Huh? Are you looking at an old version? I already added a call to IsTransportPlaying…

Aah… perhaps… How about the timecode stuff?

Will check the changelog… I don’t think I’m more than a few days behind the tip though…

Just checked… yes you did but the tip doesn’t have:

if (info.isPlaying == false) check (transport.GetTimelineSelectionStartPosition (&info.timeInSamples)); else check (transport.GetCurrentNativeSampleLocation (&info.timeInSamples));



Can’t remember if I already did framerate, will have a look, thanks…

Hi Jules,

Thanks for adding the FrameRate stuff…

Would you consider also adding:

            if (info.isPlaying == false)
                check (transport.GetTimelineSelectionStartPosition (&info.timeInSamples));
                check (transport.GetCurrentNativeSampleLocation (&info.timeInSamples));



Ok, I guess that makes sense.