My custom AU can be opened in AU Lab but not in GarageBand or Ableton.

DSP, Plugin and Host development discussion.
RELATED
PRODUCTS

Post

I created a filter AU in Xcode as a project for a signals class I'm taking,and I can open it just fine in AU Lab from my components folder, but I cant seem to open it in a DAW. Can anyone help me get to the bottom of this? Could it be a setting like the manufacturer code? If anybody has an idea help would be much appreciated and I can supply any information you might need.

Post

Have you validated the AU using auval?

Post

AUTO-ADMIN: Non-MP3, WAV, OGG, SoundCloud, YouTube, Vimeo, Twitter and Facebook links in this post have been protected automatically. Once the member reaches 5 posts the links will function as normal.
I hadn't but I read your reply and tried it. The first time it failed because the manufacturer code needed one uppercase letter. I corrected this and reran auval and this time it passed but I still can't open it up in a DAW. When i execute auval -a the AU shows up at the top of the list.

Here is the printout from the "auval -v TYPE SUBT MANF" command. Any ideas?

Code: Select all (#)

  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
         AU Validation Tool
         Version: 1.6.1a1 
          Copyright 2003-2011, Apple, Inc. All Rights Reserved.

         Specify -h (-help) for command options
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

--------------------------------------------------
VALIDATING AUDIO UNIT: 'aufx' - 'FILT' - 'Bnka'
--------------------------------------------------
Manufacturer String: Ben and Karen Audio
AudioUnit Name: Filter
Component Version: 1.0.0 (0x10000)

* * PASS
--------------------------------------------------
TESTING OPEN TIMES:
COLD:
Time to open AudioUnit:         8.500 ms
WARM:
Time to open AudioUnit:         0.017  ms
FIRST TIME:
Time for initialization:        0.011 ms

* * PASS
--------------------------------------------------
VERIFYING DEFAULT SCOPE FORMATS:
Input Scope Bus Configuration:
 Default Bus Count:1
    Default Format: AudioStreamBasicDescription:  2 ch,  44100 Hz, 'lpcm' (0x00000029) 32-bit little-endian float, deinterleaved

Output Scope Bus Configuration:
 Default Bus Count:1
    Default Format: AudioStreamBasicDescription:  2 ch,  44100 Hz, 'lpcm' (0x00000029) 32-bit little-endian float, deinterleaved

* * PASS
--------------------------------------------------
VERIFYING REQUIRED PROPERTIES:
  VERIFYING PROPERTY: Sample Rate
    PASS
  VERIFYING PROPERTY: Stream Format
    PASS
  VERIFYING PROPERTY: Maximum Frames Per Slice
    PASS
  VERIFYING PROPERTY: Last Render Error
    PASS

* * PASS
--------------------------------------------------
VERIFYING RECOMMENDED PROPERTIES:
  VERIFYING PROPERTY: Latency
    PASS
  VERIFYING PROPERTY: Tail Time
    PASS
  VERIFYING PROPERTY: Bypass Effect
    PASS

* * PASS
--------------------------------------------------
VERIFYING OPTIONAL PROPERTIES:
  VERIFYING PROPERTY Host Callbacks
    PASS

* * PASS
--------------------------------------------------
VERIFYING SPECIAL PROPERTIES:

VERIFYING CUSTOM UI
Carbon View Components Available: 0

Cocoa Views Available: 1
  AppleDemoFilter_ViewFactory
    PASS

HAS FACTORY PRESETS
    ID:   0    Name: Preset One
    ID:   1    Name: Preset Two

VERIFYING CLASS INFO
    PASS

TESTING HOST CALLBACKS
    PASS

* * PASS
--------------------------------------------------
PUBLISHED PARAMETER INFO:

# # # 3 Global Scope Parameters:
Parameter ID:0
Name: cutoff frequency
Parameter Type: Hertz
Values: Minimum = 12.000000, Default = 1000.000000, Maximum = 22050.000000
Flags: Display Logarithmic, High Resolution, Readable, Writable 
  -parameter PASS

Parameter ID:1
Name: resonance
Parameter Type: Decibels
Values: Minimum = -20.000000, Default = 0.000000, Maximum = 20.000000
Flags: High Resolution, Readable, Writable 
  -parameter PASS

Parameter ID:2
Name: filter choice
Parameter Type: Decibels
Values: Minimum = 0.000000, Default = 0.000000, Maximum = 3.000000
Flags: Readable, Writable 
  -parameter PASS

Testing that parameters retain value across reset and initialization
  PASS

* * PASS
--------------------------------------------------
FORMAT TESTS:

Reported Channel Capabilities (implicit):
      [-1, -1]

Input/Output Channel Handling:
1-1   1-2   1-4   1-5   1-6   1-7   1-8   2-2   2-4   2-5   2-6   2-7   2-8   4-4   4-5   5-5   6-6   7-7   8-8
X                                         X                                   X           X     X     X     X     

* * PASS
--------------------------------------------------
RENDER TESTS:
Input Format: AudioStreamBasicDescription:  2 ch,  44100 Hz, 'lpcm' (0x00000029) 32-bit little-endian float, deinterleaved
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

1 Channel Test:
Render Test at 512 frames
  PASS

Checking connection semantics:
Connection format:
AudioStreamBasicDescription:  2 ch,  44100 Hz, 'lpcm' (0x00000029) 32-bit little-endian float, deinterleaved
  PASS

Bad Max Frames - Render should fail
  PASS

Checking parameter setting
Using AudioUnitSetParameter
Using AudioUnitScheduleParameter
  PASS

Test MIDI
  PASS

* * PASS
--------------------------------------------------
AU VALIDATION SUCCEEDED.
--------------------------------------------------

Code: Select all (#)


Post

Just to make sure ('cause you never know), launch Abelton, go to Preferences, then File/Folder tab. Look in the plug-ins section and make sure Use Audio Units is turned on. Even if it is, hit Rescan and see if that helps.

Alternatively, if you have Logic, launch it, go to Preferences, then Audio Units Manager and see if it's in the list. Sometimes an AU will pass auval validation but not Logic's (and by extension, not GarageBand). You can try validating it again in Logic and it will output an error report for you if it doesn't pass.

Other than that, things you could try:
- installing the component in the MacintoshHD/Library/Audio/Plug-Ins/Components/ directory (or alternatively your home path's audio library directory.. whichever location you don't have it installed in now in other words).
- checking the permissions on the the directory it's located in (unlikely, but I've heard of this being a problem before).
- check your build settings. It's a good idea to build for 32-bit/64-bit still even though most up-to-date audio apps/DAWs are running in 64-bit, but that can depend on your machine of course.

Post

Thanks for the response but I've done all of that multiple times. I've been trouble shooting for a while to no avail. I'm not one to ask questions on forums because I can usually figure it out myself but this one has me stumped. If you have any more ideas though I'd really appreciate the help. Thanks again.

Post

Do you know about the FilterDemo that Apple has available on its dev site? Download that and look at the code and build settings and see if anything is off or missing in your AU. Additionally, build the FilterDemo and see if it loads up in GarageBand and Abelton.

Also, are you aware of the new component entry requirement?

Code: Select all

// old component entry no longer required
// COMPONENT_ENTRY(<yourpluginclass>)

// new AUPlugIn macro
AUDIOCOMPONENT_ENTRY(AUBaseFactory, <yourpluginclass>)
This needs to go in your plug-in's .cpp file.

The only other thing I can think of is doing a google search on "audio unit cache" or something similar related to your problem. I remember reading something about someone having to clear out the .plist cache that the component manager reads.

If you need additional reference, here is a small AU I put together a few months ago that you can either look at or clone from Github: https://github.com/cfloisand/au-combfilter

Post

Thanks! My AU is actually a modified version of the FilterDemo just with additional bandpass and high pass filters added. I'll go back through to see if i changed any of the build settings. That AUDIOCOMPONENT_ENTRY is there though. Ill also look into your other two pieces of advice when I get a chance. Thanks for the help!

Post

Sorry if I resurrect an old thread, but...any luck with this? I am in the same situation.
What I have found out is that, while the old way of opening the audio units as Components relies on compiling (rezzing) the .r files containing the manufacturer type, subtype..etc.. strings, the new behavior is based on the AudioComponent entry in the plist file.
Auval seems to be able to open those plug-ins that have either one, or both of the previous scenarios in place. If the -comp (open as a component) argument is given to it, auval will try to open a plugin with the old component mode. In this case my component built on 10.8 is not found. Basically my audio unit is found just through the AudioComponent dictionary, and I think that Live still uses the old school, component method, so it doesn't find it.
Either I am doing something wrong with Xcode 4.5, but I don't think so, or the Core Audio SDK that I have downloaded is just able to generate "new school" plugins.I have found this guy who's also having the same problem:
http://46424.com/question/92624#.URfF4LSIDnM

Right now I have tried to compile (against all the possible Base SDKs) using the old Core Audio SDK files (COMPONENT_ENTRY), and still no luck using -comp or with ableton Live. Is problem somewhere else?

Staying in topic, another weird thing I will need to do in order to use a Carbon View will be to define CA_USE_AUDIO_PLUGIN_ONLY to 0 (used in ComponentBase.h and other file). This new seems the only way to let me use VIEW_COMPONENT_ENTRY in order to export the entry point for the Carbon view. I'd like someone who has already gotten through this to share his experience... if I dont find a solution soon, tomorrow I will try with the core audio newsletter...

Post

Now, I've never implemented this stuff so I could be wrong, but as I understand it hosts only communicate with audio units through the audio unit API defined in the AudioUnit Framework (see AudioComponent.h and AUComponent.h) - meaning that OS X actually implements the mechanics of connecting host programs and .component bundles. While a new implementation of these mechanics was added in 10.7 using the AudioComponent dictionary in the .component bundle's info.plist file, this didn't actually require any changes from the host's point of view - a host still just calls things like AudioComponentGetNext() to look through a list of available AU's (as returned by OS X) and AudioComponentInstanceNew() to make a new instance of a particular AU. The only thing that changed is how OS X implements these functions in v10.7+, meaning that the method used to find and load an AU (component manager resource file or AudioComponent dictionary) depends only on the version of OS X (and thus the AudioUnit Framework) you are currently running, and has nothing to do with which host or which version of a host program you are using.

The only thing I can recommend (and this may not have been the issue with the original post as the auval output suggests they were OK on this) is to make sure you respect Apple's magical "Maufacturer: Plug-in name" formatting for your component .rsrc file's Name ID (usually defined using a #define NAME "Manufacturer: Plug-in name" macro in your .r resource file), and probably the Name field of the AudioComponent dictionary as well. Auval and the default AU GUI both parse this string into two parts based on the ":" - Manufacturer string and audio unit name. While this may seem harmless / unimportant, some hosts sort their AU listing by parsing this string into these two parts, and won't display your AU if the string doesn't parse correctly and both parts aren't found (Live 8.3.4, 32-bit does this, for example) :shock:.

If you have that formatted correctly, I'm not sure what more to suggest at the moment...

Post

Also, I'm still on 10.6 so I don't have the 10.7+ AudioUnit frameworks and don't know if the actual API itself changed at some point, which would mess with what I just said.

Maybe you can post an auval output? I'm curious about this sort of thing because it can be such a headache and it's good to know about the possible hang-ups.

Post

In case anyone stumbles on this thread: if you build Apple's AudioUnitInstrumentExample a.k.a. SinSynth with XCode 4.3 or higher and AULab sees it, auval accepts it, but Logic doesn't see it, it's because you've got to include the .r file in the final product. Just click on SinSynth.r and add it to the targets. I did get some Rez compilation errors, but they can be fixed by changing a path or copying the required bits from the included .r.

You've also got to define X86_64 in your .r (or in the Build Settings), otherwise AULab and auval think it is 64 bit, but Logic will think it is 32 bit.

The reason seems to be that Logic 9 looks in the resources of the plugin, while AULab and auval are more modern and look in the plist's AudioComponent entry. They also call different entry points (but this is taken care of by the AUDIOUNIT_COMPONENT macro).

Apple's documentation sucked a bit, so I got most of this from various websites.

Good luck with future versions...

Post

Interesting. So does this necessarily mean that Logic 9 is interacting with the component manager directly and not using the AudioComponent API calls?

Logic 9 was released at about the same time as OS X 10.6, when the AudioComponent API was introduced. I suppose it's possible they didn't update Logic to use it at the time, but that's a bit surprising to me. In any case, it's good to be aware that some hosts may still be relying on the component manager API, which means that they require audio units to be registered with the component manager in order for them to be found and used, regardless of the version of OS X that is running.

According to the Audio Unit Programming Guide, the component manager automatically registers AUs in the typical system folder - I imagine it does this by examining the .rsrc carbon resource file in each .component bundle, thus explaining why this file is necessary for the audio unit to show up. This resource file publishes the old entry point, which has been kept compatible with the component manager.

Post

Conjecture wrote:Interesting. So does this necessarily mean that Logic 9 is interacting with the component manager directly and not using the AudioComponent API calls?
I don't know of any hosts that use the new calls other than AU Lab.

The docs aren't totally clear on this, but the old calls *will not* find new style plug ins. If the host used the new calls, they would still see old style plug ins, though.

Post

I've never checked, so that's a surprise to me. I would have thought hosts would have updated to use the "new" API by now - it's not that new anymore... although if plug-in developers continue to support the component manager, I guess hosts don't gain much by updating.

Post

Hi, I get the Rez compilation errors too but I can't find the path to be changed. Is that the CarbonCore headers ? I can't find them in OS X 10.8 :( Or maybe I'm doing something wrong :/
Thanks for your help.
FLWrd wrote:In case anyone stumbles on this thread: if you build Apple's AudioUnitInstrumentExample a.k.a. SinSynth with XCode 4.3 or higher and AULab sees it, auval accepts it, but Logic doesn't see it, it's because you've got to include the .r file in the final product. Just click on SinSynth.r and add it to the targets. I did get some Rez compilation errors, but they can be fixed by changing a path or copying the required bits from the included .r.

You've also got to define X86_64 in your .r (or in the Build Settings), otherwise AULab and auval think it is 64 bit, but Logic will think it is 32 bit.

The reason seems to be that Logic 9 looks in the resources of the plugin, while AULab and auval are more modern and look in the plist's AudioComponent entry. They also call different entry points (but this is taken care of by the AUDIOUNIT_COMPONENT macro).

Apple's documentation sucked a bit, so I got most of this from various websites.

Good luck with future versions...

Post Reply

Return to “DSP and Plugin Development”