| name | validate-audiounit |
| description | Validate AudioUnit v2/v3 plugins (.component bundles and .appex app extensions) using Apple's auval tool. Use when user says "validate AU", "run auval", "test AudioUnit", "check the .component", "check the .appex", "validate AUv3", or needs to check AudioUnit compatibility. For .vst3 use validate-vst3; for .clap use validate-clap. |
| compatibility | macOS only. auval is included with Xcode command-line tools. |
| metadata | {"author":"Oli Larkin","version":"0.0.1"} |
AudioUnit Validation (auval)
Plugin Install Locations
AudioUnits must be registered with the system for auval to find them — it does not accept a file path.
AUv2 (.component)
| Location | Scope |
|---|
~/Library/Audio/Plug-Ins/Components/ | Current user only |
/Library/Audio/Plug-Ins/Components/ | All users (requires admin) |
After installing or rebuilding, force a rescan: killall -9 AudioComponentRegistrar
AUv3 (.appex)
AUv3 AudioUnits are app extensions (.appex) embedded inside a host .app bundle (e.g., MyApp.app/Contents/PlugIns/MyAU.appex). The host app must be run at least once to register the extension with the system via pluginkit.
pluginkit -m -v -p <bundle-id>
pluginkit -m -v -A
pluginkit -a <path-to-appex>
pluginkit -r <path-to-appex>
pluginkit -e -v -i <bundle-id>
After rebuilding, re-run the host app or use pluginkit -a to re-register the updated extension.
Instructions
- Register the plugin with the system:
- AUv2: Install the
.component in a standard Components location (see above)
- AUv3: Run the host
.app at least once, or manually register with pluginkit -a <path-to-appex>
- Identify the plugin's AU type (
aufx, aumu, etc.), four-character subtype, and manufacturer code
- Force a rescan if the plugin was just built:
killall -9 AudioComponentRegistrar
- Run:
auval -v <type> <subtype> <manufacturer> — this works the same for both AUv2 and AUv3 once registered
- Check the final line —
* * * * * * * * means all tests passed
- If tests fail, see Common Issues below
Basic Usage
auval -v aufx <subtype> <manufacturer>
auval -v aumu <subtype> <manufacturer>
auval -v aumf <subtype> <manufacturer>
auval -v aumi <subtype> <manufacturer>
Listing AudioUnits
auval -a
auval -al
auval -l
auval -s aufx
auval -s aumu
AudioUnit Types
| Type | Description | Example |
|---|
aufx | Effect | Gain, EQ, Reverb |
aumu | Music Device (Instrument) | Synth, Sampler |
aumf | Music Effect (MIDI-controlled) | Arpeggiator with audio |
aumi | MIDI Processor | MIDI filter, transposer |
aufc | Format Converter | Sample rate converter |
auou | Output | Audio output |
aupn | Panner | Surround panner |
augn | Generator | Noise generator |
Validation Options
auval -o -v aufx <subtype> <manufacturer>
auval -stress -v aufx <subtype> <manufacturer>
auval -stress 120 -v aufx <subtype> <manufacturer>
sudo auval -real-time-safety -v aufx <subtype> <manufacturer>
auval -r 5 -v aufx <subtype> <manufacturer>
auval -de -v aufx <subtype> <manufacturer>
auval -dw -v aufx <subtype> <manufacturer>
auval -q -v aufx <subtype> <manufacturer>
auval -qp -v aufx <subtype> <manufacturer>
auval -w -v aufx <subtype> <manufacturer>
auval -oop -v aufx <subtype> <manufacturer>
auval -comp -v aufx <subtype> <manufacturer>
Strict Options
Strict options enforce checks that would otherwise only produce warnings. Use -strict to enable all strict checks — this should be used by default for thorough validation.
auval -strict -v aufx <subtype> <manufacturer>
auval -strict_SP -v aufx <subtype> <manufacturer>
auval -strict_DefP -v aufx <subtype> <manufacturer>
auval -strict_CPUL -v aufx <subtype> <manufacturer>
Batch Validation
auval -vt aufx <manufacturer>
auval -c -vt aufx <manufacturer>
auval -f /path/to/commands.txt
If no options are given, auval looks for a file called auv-autorun.txt in the launch directory or /tmp/ and runs commands from it.
Component ID Formats
Component IDs can be specified as 4-char codes or 8-digit hex values. These are equivalent:
auval -v aufx bpas appl
auval -v 61756678 62706173 6170706C
The two formats can be mixed freely.
Return Codes
| Code | Meaning |
|---|
0 | OK — all tests passed |
-1 | AU failed validation |
1 | General error |
2 | Fatal error |
4 | Unauthorized (open) |
5 | Unauthorized (init) |
Memory Leak Testing
export MallocStackLogging=1
auval -v aufx <subtype> <manufacturer> -w -q
ps axc | awk '{if ($5=="auvaltool") print $1}'
leaks <PID>
AUv2 vs AUv3 Conflicts
AudioUnit v2 and v3 plugins are identified by their type+subtype+manufacturer code. If both formats are registered with the same codes, the system will prefer one (typically AUv3), which can cause confusion during development.
Best Practice: Use different subtypes for AUv2 and AUv3 during development. Most build systems (JUCE, iPlug2, iPlug3, etc.) provide separate configuration fields for AUv2 and AUv3 subtypes.
To temporarily remove an AUv3 so the AUv2 is used instead: pluginkit -r <path-to-appex>
Force AU Rescan
killall -9 AudioComponentRegistrar
sleep 2
auval -a
Common Issues
AU Not Found
FATAL ERROR: didn't find the component
- Verify plugin is in a standard location (see Plugin Install Locations above)
- Rescan:
killall -9 AudioComponentRegistrar
- Check Info.plist for correct type/subtype/manufacturer
- AUv3: Ensure the host app was run at least once, verify registration with
pluginkit -m -v -p <bundle-id>, and re-register with pluginkit -a <path-to-appex> if needed
Class Collision Warning
objc: Class XYZ is implemented in both...
- Each plugin must have unique Objective-C class names
- Use your build system's support for unique class name prefixes