Logic X - AU - Channel list incorrect

I really don’t understand what is going on here!

I know have auval showing this:

--------------------------------------------------
FORMAT TESTS:

Reported Channel Capabilities (explicit):
      [0, 1]  [0, 2]  [0, 3]  [0, 4]  [0, 5]  [0, 6]  [0, 7]  [0, 8]  

No Input, Output Chans:
0-1   0-2   0-4   0-5   0-6   0-7   0-8
X     X     X     X     X     X     X     

ChannelLayout is Writable: T
The Unit publishes the following Channel Layouts:
  0x640001, 0x650002, 0x710003, 0x750005, 0x790006, 0x7D0007, 0x7E0008, 0x6C0004, 0x660002, 0x670002, 0x6A0002, 0x720003, 0x760005, 0x770005, 0x780005, 0x7A0006, 0x7B0006, 0x7C0006, 0x7F0008, 0x810008, 0x840004, 0x8E0007, 0x960003, 0x9D0007, 0x9E0007, 0xA10008, 0xB60007, 0xB10008, 0x930000, 

Is Audio Channel Layout Available:
Mono    Stereo  Binau.  AU_4    Ambi.   AU_5    AU_5_0  AU_6    AU_6_0  AU_7_0  AU_7_0F AU_8    AU_5_1  AU_6_1  AU_7_1  AU_7_1F 
X       X       X       X                       X                                               X       X               X       

And logic 10.5.1 thinking it supports only mono and stereo.

So I’m trying to get my head around channel layouts without dynamic buses.

I took the AudioPluginExample and changed:

    bool isBusesLayoutSupported (const BusesLayout& layouts) const override
    {
        // Only mono/stereo and input/output must have same layout
        const auto& mainOutput = layouts.getMainOutputChannelSet();
        const auto& mainInput  = layouts.getMainInputChannelSet();
      
        // no inputs allowed
        if(mainInput.size() != 0)
          return false;
      
        // only allow stereo and eight channel outputs
        if(mainOutput != AudioChannelSet::create7point1SDDS() && mainOutput != AudioChannelSet::stereo())
          return false;
      
        return true;
    }

and

    static BusesProperties getBusesProperties()
    {
      return BusesProperties().withOutput ("Output", AudioChannelSet::create7point1SDDS(), true);
    }

So we should have 2 and 8 channel output, looks good in auval:

FORMAT TESTS:

Reported Channel Capabilities (explicit):
      [0, 2]  [0, 8]  

No Input, Output Chans:
0-1   0-2   0-4   0-5   0-6   0-7   0-8
      X                             X     


ChannelLayout is Writable: T
The Unit publishes the following Channel Layouts:
  0x650002, 0x7E0008, 0x660002, 0x670002, 0x6A0002, 0x7F0008, 0x810008, 0xA10008, 0xB10008, 

Is Audio Channel Layout Available:
Mono    Stereo  Binau.  AU_4    Ambi.   AU_5    AU_5_0  AU_6    AU_6_0  AU_7_0  AU_7_0F AU_8    AU_5_1  AU_6_1  AU_7_1  AU_7_1F 
        X       X                                                                                                       X       

So I then tried in some hosts:

AudioPluginHost : Opens as 8 channels, allows change to 2 channels.

Waveform 11.5 : Opens as 8 channels, allows change to 2 channels but crashes in AUBufferList::CopyBufferContentsTo

Ableton Live 10 & 11 : Stereo only.

Bidule: Allows choice of 2 and 8 channels on instantiation.

Logic 10.5.1 : Stereo only.

Reaper : creates 8 only

So to me it looks like Live and Logic are not supporting channel layouts, or am I getting something totally wrong here?

Edit: I thought I was seeing different behaviour on different OS versions, but it turned out I had the Surround “Advanced Tools” option disabled on one of my machines, so this was user error on my part.

Yeah here on 10.14.6/10.5.1 unless you have a stereo format the plugin doesn’t appear in the menu but does appear in plugin manager. So it is like it is only supporting stereo channel layouts, same in Ableton live.

I have a M1 machine with Big Sur/10.6.1 here and a VM Running Catalina, I will boot them up and have a look…

I have been changing the component version which forces a scan and update of channels.

With my 2/8 channel plugin I still only get stereo in Catalina/10.6.1 and Big Sur/10.6.0.

I’m trying to update to 10.6.1 on Big Sur but something is going wrong!

@reuk could you give me the exact buses properties and isBusesLayoutSupported for your 5.1 format and I will try it here…

Edit: got 10.6.1 on big sur going, still only stereo. At least it is consistent here!

Edit2: Got stereo and 5.1 going on BigSur, it must not like 7point1SDDS. Will look on other machines now…

Sure, my AudioPluginDemo has this in isBusesLayoutSupported:

        const auto& mainOutput = layouts.getMainOutputChannelSet();
        const auto& mainInput  = layouts.getMainInputChannelSet();

        if (! mainInput.isEmpty())
          return false;

        return mainOutput == AudioChannelSet::create5point1();

getBusesProperties looks like this:

    static BusesProperties getBusesProperties()
    {
        return BusesProperties().withOutput ("Output", AudioChannelSet::create5point1(), true);
    }

auval output:

Reported Channel Capabilities (explicit):
      [0, 6]  

No Input, Output Chans:
0-1   0-2   0-4   0-5   0-6   0-7   0-8
                        X                 
# # AudioChannelLayouts (4), Output Scope:
ChannelLayout is Writable: T
The Unit publishes the following Channel Layouts:
  0x790006, 0x7A0006, 0x7B0006, 0x7C0006, 

Is Audio Channel Layout Available:
Mono    Stereo  Binau.  AU_4    Ambi.   AU_5    AU_5_0  AU_6    AU_6_0  AU_7_0  AU_7_0F AU_8    AU_5_1  AU_6_1  AU_7_1  AU_7_1F 
                                                                                                X                               

Current Format:AudioStreamBasicDescription:  6 ch,  44100 Hz, 'lpcm' (0x00000029) 32-bit little-endian float, deinterleaved
Current Format Tag = 0x790006, New Format Tag = 0x790006, Successsful

Thanks.

With a stereo/5.1 setup I see both stereo and 5.1 on both catalina and big sur. So working fine.

On 10.5.1 on Mojave I only see stereo. So not working.

Which does lead to the question what is the difference between our Catalinas!

Also I wonder why Logic doesn’t like: AU_7_1F

Ah, I just discovered the ‘Surround’ option in the ‘Advanced Tools’ from the preference pane. I had this disabled on Catalina but enabled on Big Sur. With it enabled on both, the plugin can be found on both OS versions. Is there a chance you have this setting disabled on your Mojave machine?

Good catch, that was exactly the problem.

Thanks, time for a beer now :slight_smile:

So now it is making a bit more sense, taking this stereo/5.1 and allowing buses to be added we get:

screenshot_704

So Logic seems to allow you to create single bus versions of the channel layouts and also multi-bus layouts for stereo.

BTW - here is some info from SuperiorDrummer3
image

AUVAL log:

validating Audio Unit Superior Drummer 3 by Toontrack:

AU Validation Tool
Version: 1.7.0 
Copyright 2003-2019, Apple Inc. All Rights Reserved.
Specify -h (-help) for command options

VALIDATING AUDIO UNIT: ‘aumu’ - ‘SD3a’ - ‘Toon’

Manufacturer String: Toontrack
AudioUnit Name: Superior Drummer 3
Component Version: 3.2.3 (0x30203)

    • PASS

TESTING OPEN TIMES:
COLD:
Time to open AudioUnit: 294.437 ms
WARM:
Time to open AudioUnit: 27.292 ms
FIRST TIME:
Time for initialization: 0.139 ms

    • PASS

VERIFYING DEFAULT SCOPE FORMATS:
Input Scope Bus Configuration:
Default Bus Count:0

Output Scope Bus Configuration:
Default Bus Count:16
Bus Name: S1/2
Format Bus 0: AudioStreamBasicDescription: 2 ch, 44100 Hz, ‘lpcm’ (0x00000029) 32-bit little-endian float, deinterleaved
Bus Name: S3/4
Format Bus 1: AudioStreamBasicDescription: 2 ch, 44100 Hz, ‘lpcm’ (0x00000029) 32-bit little-endian float, deinterleaved
Bus Name: S5/6
Format Bus 2: AudioStreamBasicDescription: 2 ch, 44100 Hz, ‘lpcm’ (0x00000029) 32-bit little-endian float, deinterleaved
Bus Name: S7/8
Format Bus 3: AudioStreamBasicDescription: 2 ch, 44100 Hz, ‘lpcm’ (0x00000029) 32-bit little-endian float, deinterleaved
Bus Name: S9/10
Format Bus 4: AudioStreamBasicDescription: 2 ch, 44100 Hz, ‘lpcm’ (0x00000029) 32-bit little-endian float, deinterleaved
Bus Name: S11/12
Format Bus 5: AudioStreamBasicDescription: 2 ch, 44100 Hz, ‘lpcm’ (0x00000029) 32-bit little-endian float, deinterleaved
Bus Name: S13/14
Format Bus 6: AudioStreamBasicDescription: 2 ch, 44100 Hz, ‘lpcm’ (0x00000029) 32-bit little-endian float, deinterleaved
Bus Name: S15/16
Format Bus 7: AudioStreamBasicDescription: 2 ch, 44100 Hz, ‘lpcm’ (0x00000029) 32-bit little-endian float, deinterleaved
Bus Name: S17/18
Format Bus 8: AudioStreamBasicDescription: 2 ch, 44100 Hz, ‘lpcm’ (0x00000029) 32-bit little-endian float, deinterleaved
Bus Name: S19/20
Format Bus 9: AudioStreamBasicDescription: 2 ch, 44100 Hz, ‘lpcm’ (0x00000029) 32-bit little-endian float, deinterleaved
Bus Name: S21/22
Format Bus 10: AudioStreamBasicDescription: 2 ch, 44100 Hz, ‘lpcm’ (0x00000029) 32-bit little-endian float, deinterleaved
Bus Name: S23/24
Format Bus 11: AudioStreamBasicDescription: 2 ch, 44100 Hz, ‘lpcm’ (0x00000029) 32-bit little-endian float, deinterleaved
Bus Name: S25/26
Format Bus 12: AudioStreamBasicDescription: 2 ch, 44100 Hz, ‘lpcm’ (0x00000029) 32-bit little-endian float, deinterleaved
Bus Name: S27/28
Format Bus 13: AudioStreamBasicDescription: 2 ch, 44100 Hz, ‘lpcm’ (0x00000029) 32-bit little-endian float, deinterleaved
Bus Name: S29/30
Format Bus 14: AudioStreamBasicDescription: 2 ch, 44100 Hz, ‘lpcm’ (0x00000029) 32-bit little-endian float, deinterleaved
Bus Name: S31/32
Format Bus 15: AudioStreamBasicDescription: 2 ch, 44100 Hz, ‘lpcm’ (0x00000029) 32-bit little-endian float, deinterleaved
Bus 0, Has Channel Layouts: 0x650002 0x660002 0x670002 0x6A0002
Default Layout (bus 0):
Tag=0x650002, Num Chan Descs=0
Bus 1, Has Channel Layouts: 0x650002 0x660002 0x670002 0x6A0002
Default Layout (bus 1):
Tag=0x650002, Num Chan Descs=0
Bus 2, Has Channel Layouts: 0x650002 0x660002 0x670002 0x6A0002
Default Layout (bus 2):
Tag=0x650002, Num Chan Descs=0
Bus 3, Has Channel Layouts: 0x650002 0x660002 0x670002 0x6A0002
Default Layout (bus 3):
Tag=0x650002, Num Chan Descs=0
Bus 4, Has Channel Layouts: 0x650002 0x660002 0x670002 0x6A0002
Default Layout (bus 4):
Tag=0x650002, Num Chan Descs=0
Bus 5, Has Channel Layouts: 0x650002 0x660002 0x670002 0x6A0002
Default Layout (bus 5):
Tag=0x650002, Num Chan Descs=0
Bus 6, Has Channel Layouts: 0x650002 0x660002 0x670002 0x6A0002
Default Layout (bus 6):
Tag=0x650002, Num Chan Descs=0
Bus 7, Has Channel Layouts: 0x650002 0x660002 0x670002 0x6A0002
Default Layout (bus 7):
Tag=0x650002, Num Chan Descs=0
Bus 8, Has Channel Layouts: 0x650002 0x660002 0x670002 0x6A0002
Default Layout (bus 8):
Tag=0x650002, Num Chan Descs=0
Bus 9, Has Channel Layouts: 0x650002 0x660002 0x670002 0x6A0002
Default Layout (bus 9):
Tag=0x650002, Num Chan Descs=0
Bus 10, Has Channel Layouts: 0x650002 0x660002 0x670002 0x6A0002
Default Layout (bus 10):
Tag=0x650002, Num Chan Descs=0
Bus 11, Has Channel Layouts: 0x650002 0x660002 0x670002 0x6A0002
Default Layout (bus 11):
Tag=0x650002, Num Chan Descs=0
Bus 12, Has Channel Layouts: 0x650002 0x660002 0x670002 0x6A0002
Default Layout (bus 12):
Tag=0x650002, Num Chan Descs=0
Bus 13, Has Channel Layouts: 0x650002 0x660002 0x670002 0x6A0002
Default Layout (bus 13):
Tag=0x650002, Num Chan Descs=0
Bus 14, Has Channel Layouts: 0x650002 0x660002 0x670002 0x6A0002
Default Layout (bus 14):
Tag=0x650002, Num Chan Descs=0
Bus 15, Has Channel Layouts: 0x650002 0x660002 0x670002 0x6A0002
Default Layout (bus 15):
Tag=0x650002, Num Chan Descs=0

    • PASS

VERIFYING REQUIRED PROPERTIES:

    • PASS

VERIFYING RECOMMENDED PROPERTIES:
VERIFYING PROPERTY: Latency
PASS

    • PASS

VERIFYING OPTIONAL PROPERTIES:
VERIFYING PROPERTY Tail Time
PASS
VERIFYING PROPERTY Bypass Effect
PASS

    • PASS

VERIFYING SPECIAL PROPERTIES:

VERIFYING CUSTOM UI
Cocoa Views Available: 1
JUCE_AUCocoaViewClass_3c4416ffde16275
PASS

HAS FACTORY PRESETS

VERIFYING CLASS INFO
PASS

TESTING HOST CALLBACKS
PASS

    • PASS

PUBLISHED PARAMETER INFO:

# # 100 Global Scope Parameters:

WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set
WARNING: retrievedValue = 0.000000 (was 1.000000), Parameter did not retain maximum value when set

    • PASS

FORMAT TESTS:

Reported Channel Capabilities (explicit):
[0, 2]

No Input, Output Chans:
0-1 0-2 0-4 0-5 0-6 0-7 0-8
X

# AudioChannelLayouts (4), Output Scope:

ChannelLayout is Writable: T
The Unit publishes the following Channel Layouts:
0x650002, 0x660002, 0x670002, 0x6A0002,

Is Audio Channel Layout Available:
Mono Stereo Binau. AU_4 Ambi. AU_5 AU_5_0 AU_6 AU_6_0 AU_7_0 AU_7_0F AU_8 AU_5_1 AU_6_1 AU_7_1 AU_7_1F
X X

Current Format:AudioStreamBasicDescription: 2 ch, 44100 Hz, ‘lpcm’ (0x00000029) 32-bit little-endian float, deinterleaved
Current Format Tag = 0x650002, New Format Tag = 0x650002, Successsful

Current Format:AudioStreamBasicDescription: 2 ch, 44100 Hz, ‘lpcm’ (0x00000029) 32-bit little-endian float, deinterleaved
Current Format Tag = 0x650002, New Format Tag = 0x6A0002, Successsful

    • PASS

RENDER TESTS:

Output Format: AudioStreamBasicDescription: 2 ch, 44100 Hz, ‘lpcm’ (0x00000029) 32-bit little-endian float, deinterleaved
Render Test at 512 frames
Slicing Render Test at 64 frames
PASS

Render Test at 64 frames, sample rate: 22050 Hz
Render Test at 137 frames, sample rate: 96000 Hz
Render Test at 4096 frames, sample rate: 48000 Hz
Render Test at 4096 frames, sample rate: 192000 Hz
Render Test at 4096 frames, sample rate: 11025 Hz
Render Test at 512 frames, sample rate: 44100 Hz
PASS

Bad Max Frames - Render should fail
PASS

Checking parameter setting
Using AudioUnitSetParameter
Using AudioUnitScheduleParameter
PASS

Checking ramped parameter scheduling
PASS

Test MIDI
PASS

    • PASS

AU VALIDATION SUCCEEDED.

validation result: successfully validated

updating properties of AU Superior Drummer 3 by Toontrack…

I’m guessing from that one that SuperiorDrummer3 doesn’t use dynamic buses, the bus count is pre-defined (0 to 15), each bus only supports stereo so Logic knows that there are 16 stereo outputs.

If it was dynamic bus we would also see the 25 stereo outputs I think.

I’m having the same problem with multi outs in Logic and as far as I understand, using a solution from post №10 would fix it for me? But i won’t have dynamic buses working? Here, pardon my ignorance, I would ask - what is dynamic buses in Logic and how they work and why i would need them? I tried to google, but there is basically zero info on that. I have Superior 3 and it has multiout menu looking fine. Multiouts there work exactly the same to Battery or Kontakt. @bobthedog wrote that it looks like Superior doesn’t have dynamic buses. The question then - what’s the difference? Because i see zero difference between Battery routing and Superior 3.

@Centau

So with AU’s there are a couple of ways of doing multi-out.

  1. You can have one bus that supports many channel layouts, where a channel layout may be stereo, quadraphonic or even 32 discrete channels.

  2. You can have multiple buses each supporting channel layouts, so if you want 16 outs you could have 8 buses of stereo for example.

Dynamic buses allow the host to add and remove buses from your default setup, this can be enabled or disabled by the plugin.

You can use AudioPluginHost to if the plugin supports dynamic buses, so if you load up superior 3 and right click on it and choose “Configure Audio I/O”, here if the plugin supports dynamic buses you can add and remove buses with the “+” and “-” buttons.

As an example, battery by default supports a single bus and dynamic buses. In the next image I have clicked the “+” button 3 times to add another 3 stereo buses:

You can see on the right that the channels are slightly separated and different colours.

In the next image I am using one bus with 8 outputs:

By default in juce dynamic buses are disabled for your plugin, you can override this behaviour.

1 Like

@reuk I guess you are the AU guy at juce?

I have looked into this as well and juce definitely takes the layouts in precedence over the channel maps.

In juce_AudioPluginFormat.mm isBusesLayoutSupported (const BusesLayout& layouts) before it looks at the channel maps we see:

               if (possible.size() > 0 && ! possible.contains (requested))
                    return false;

This will bail if the layout is not there without checking if the channel map supports it.

I have also noticed a few bits of strangeness:

In juce_AU_Shared.h getAUChannelInfo (const AudioProcessor& processor) :

auto maxNumChanToCheckFor = 9;

This has the effect of returning -1 when say you have more supported channels, shouldn’t this value be a bit higher.

In juce_AudioPluginFormat.mm updateSupportedLayouts()

If AudioUnitGetPropertyInfo with kAudioUnitProperty_SupportedNumChannels is not supported by the plugin juce will add a channel map of [-1, -1]. If AudioUnitGetProperty with kAudioUnitProperty_SupportedNumChannels is not supported juce will not add a channel map. Wouldn’t it be better to not add a channel map for both cases?

This code is only used for hosting AudioUnits. It does not have any effect on AudioUnit clients. If you’re seeing issues with AudioUnit hosting, please start a new thread so that we can keep this one on-topic.

I’m not sure - perhaps this would be useful in hosts that support more than 9 channels on a single bus. This code has been stable for several years though, so I don’t think this should change unless there are concrete examples of plugin/host combinations which display incorrect channel layouts. Note that I don’t think this is the case for Logic, which only supports up to 7.1 layouts at time of writing. (It appears that Logic will only instantiate surround plugins if the channel configuration matches the surround format of the project - that is, if I modify the MultiOutSynthDemo to support 5.1 or 7.1SDDS, then Logic will only display the 5.1 option when the Surround Format of the project is 5.1, and will only display the 7.1SDDS version if the project’s Surround Format is 7.1SDDS.)

Again, note that this is hosting code. This will not affect AU clients. If you have examples of plugins which display incorrectly in JUCE hosts, please start a new topic.


On the topic of channel/bus counts in Logic, it seems that the main issue at this point is that Logic may allow users to instantiate plugins with more buses than they actually support, which results in a generic “failed to load plugin” error. A work-around is to make the plugin appear to support all bus counts (i.e. override canAddBus and canRemoveBus to return true), and to handle unnecessary buses gracefully (e.g. produce silence on those buses).

We’re in contact with developers at Apple to check the expected behaviour of plugins with writable bus counts. I’ll update this thread once I know more.

Thanks for the reply.

You can see this issue in AudioPluginHost:

Just set the plugin to support say up to 16 channels on a single output bus:

bSupported = (numInputs == 0) && (numOutputs <= 16);

You will see :

You can also load the VST and AU into live, the VST has the correct 8 stereo outs, the AU has incorrect 16 stereo outs which is the maximum channels live will use.

I guess in the end the whole thing is academic as most people will be creating the lowest common denominator, as you say Logic doesn’t support this.

I will make another post about the other points…

Edit: Sorry the bit about Live was incorrect so I deleted it, it was using multiple buses.

Sorry for maybe a stupid question but I’ve got a little buried under all the info we got here (thanks for your hard work!)
Could you please tell me how to turn off the dynamic bus for a Juce VI plugin?
All I need is to have 1xStereo and 16xStereo options in logic, and it looks like I don’t need any dynamic bus features.

This works for me:

  • Override canAddBus and canRemoveBus both to return false.
  • Override isBusesLayoutSupported to allow either 1 or 16 stereo output buses:
      bool isBusesLayoutSupported (const BusesLayout& layout) const override
      {
          for (const auto& bus : layout.outputBuses)
              if (bus != AudioChannelSet::stereo())
                  return false;
    
          return layout.inputBuses.isEmpty()
              && (1 == layout.outputBuses.size() || 16 == layout.outputBuses.size());
      }
    
  • Initialise the plugin with 16 buses:
          : AudioProcessor (BusesProperties()
                            .withOutput ("Output #1",  AudioChannelSet::stereo(), true)
                            .withOutput ("Output #2",  AudioChannelSet::stereo(), false)
                            .withOutput ("Output #3",  AudioChannelSet::stereo(), false)
                            .withOutput ("Output #4",  AudioChannelSet::stereo(), false)
                            .withOutput ("Output #5",  AudioChannelSet::stereo(), false)
                            .withOutput ("Output #6",  AudioChannelSet::stereo(), false)
                            .withOutput ("Output #7",  AudioChannelSet::stereo(), false)
                            .withOutput ("Output #8",  AudioChannelSet::stereo(), false)
                            .withOutput ("Output #9",  AudioChannelSet::stereo(), false)
                            .withOutput ("Output #10", AudioChannelSet::stereo(), false)
                            .withOutput ("Output #11", AudioChannelSet::stereo(), false)
                            .withOutput ("Output #12", AudioChannelSet::stereo(), false)
                            .withOutput ("Output #13", AudioChannelSet::stereo(), false)
                            .withOutput ("Output #14", AudioChannelSet::stereo(), false)
                            .withOutput ("Output #15", AudioChannelSet::stereo(), false)
                            .withOutput ("Output #16", AudioChannelSet::stereo(), false))
    

Screenshot 2021-02-26 at 16.58.06

2 Likes

BTW, in previous Juce version (4) I was able to define output busses in a plugin constructor conditionally: for example I could have 16 output busses for AU/Logic, and 20 output busses for VST.
Like that:
// The base class constructor will already add a main stereo output bus
// If you want to add your own main channel then simply call clear the
// output buses (busArrangement.outputBuses.clear()) and then add your own

Is there any way to do that with Juce 5/6 ?