$npx -y skills add iPlug3/audio-plugin-dev-skills --skill validate-audiounitValidate 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 .
| 1 | # AudioUnit Validation (auval) |
| 2 | |
| 3 | ## Plugin Install Locations |
| 4 | |
| 5 | AudioUnits **must** be registered with the system for `auval` to find them — it does not accept a file path. |
| 6 | |
| 7 | ### AUv2 (.component) |
| 8 | |
| 9 | | Location | Scope | |
| 10 | |----------|-------| |
| 11 | | `~/Library/Audio/Plug-Ins/Components/` | Current user only | |
| 12 | | `/Library/Audio/Plug-Ins/Components/` | All users (requires admin) | |
| 13 | |
| 14 | After installing or rebuilding, force a rescan: `killall -9 AudioComponentRegistrar` |
| 15 | |
| 16 | ### AUv3 (.appex) |
| 17 | |
| 18 | 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`. |
| 19 | |
| 20 | ```bash |
| 21 | # Check if an AUv3 is registered (match by bundle ID) |
| 22 | pluginkit -m -v -p <bundle-id> |
| 23 | |
| 24 | # List all registered AudioUnit extensions |
| 25 | pluginkit -m -v -A |
| 26 | |
| 27 | # Manually register an appex |
| 28 | pluginkit -a <path-to-appex> |
| 29 | |
| 30 | # Unregister an appex |
| 31 | pluginkit -r <path-to-appex> |
| 32 | |
| 33 | # Dump full extension info for debugging |
| 34 | pluginkit -e -v -i <bundle-id> |
| 35 | ``` |
| 36 | |
| 37 | After rebuilding, re-run the host app or use `pluginkit -a` to re-register the updated extension. |
| 38 | |
| 39 | ## Instructions |
| 40 | |
| 41 | 1. Register the plugin with the system: |
| 42 | - **AUv2:** Install the `.component` in a standard Components location (see above) |
| 43 | - **AUv3:** Run the host `.app` at least once, or manually register with `pluginkit -a <path-to-appex>` |
| 44 | 2. Identify the plugin's AU type (`aufx`, `aumu`, etc.), four-character subtype, and manufacturer code |
| 45 | 3. Force a rescan if the plugin was just built: `killall -9 AudioComponentRegistrar` |
| 46 | 4. Run: `auval -v <type> <subtype> <manufacturer>` — this works the same for both AUv2 and AUv3 once registered |
| 47 | 5. Check the final line — `* * * * * * * *` means all tests passed |
| 48 | 6. If tests fail, see Common Issues below |
| 49 | |
| 50 | ## Basic Usage |
| 51 | |
| 52 | ```bash |
| 53 | # Validate an effect (aufx) |
| 54 | auval -v aufx <subtype> <manufacturer> |
| 55 | |
| 56 | # Validate an instrument (aumu) |
| 57 | auval -v aumu <subtype> <manufacturer> |
| 58 | |
| 59 | # Validate a MIDI-controlled effect (aumf) |
| 60 | auval -v aumf <subtype> <manufacturer> |
| 61 | |
| 62 | # Validate a MIDI processor (aumi) |
| 63 | auval -v aumi <subtype> <manufacturer> |
| 64 | ``` |
| 65 | |
| 66 | ## Listing AudioUnits |
| 67 | |
| 68 | ```bash |
| 69 | # List all registered AudioUnits |
| 70 | auval -a |
| 71 | |
| 72 | # List all AUs with their file locations |
| 73 | auval -al |
| 74 | |
| 75 | # List AUs without instantiating them (faster) |
| 76 | auval -l |
| 77 | |
| 78 | # List all effects |
| 79 | auval -s aufx |
| 80 | |
| 81 | # List all instruments |
| 82 | auval -s aumu |
| 83 | ``` |
| 84 | |
| 85 | ## AudioUnit Types |
| 86 | |
| 87 | | Type | Description | Example | |
| 88 | |------|-------------|---------| |
| 89 | | `aufx` | Effect | Gain, EQ, Reverb | |
| 90 | | `aumu` | Music Device (Instrument) | Synth, Sampler | |
| 91 | | `aumf` | Music Effect (MIDI-controlled) | Arpeggiator with audio | |
| 92 | | `aumi` | MIDI Processor | MIDI filter, transposer | |
| 93 | | `aufc` | Format Converter | Sample rate converter | |
| 94 | | `auou` | Output | Audio output | |
| 95 | | `aupn` | Panner | Surround panner | |
| 96 | | `augn` | Generator | Noise generator | |
| 97 | |
| 98 | ## Validation Options |
| 99 | |
| 100 | ```bash |
| 101 | # Basic open/initialize test only (fast, good for debugging) |
| 102 | auval -o -v aufx <subtype> <manufacturer> |
| 103 | |
| 104 | # Run with stress test (multi-thread test for race conditions, default 600s) |
| 105 | auval -stress -v aufx <subtype> <manufacturer> |
| 106 | |
| 107 | # Run stress test with custom duration (in simulated seconds) |
| 108 | auval -stress 120 -v aufx <subtype> <manufacturer> |
| 109 | |
| 110 | # Run with real-time safety test (requires sudo, uses dtrace) |
| 111 | sudo auval -real-time-safety -v aufx <subtype> <manufacturer> |
| 112 | |
| 113 | # Repeat validation N times (catches open/init bugs) |
| 114 | auval -r 5 -v aufx <subtype> <manufacturer> |
| 115 | |
| 116 | # Stop on first error (useful for debugging) |
| 117 | auval -de -v aufx <subtype> <manufacturer> |
| 118 | |
| 119 | # Stop on first warning (stricter) |
| 120 | auval -dw -v aufx <subtype> <manufacturer> |
| 121 | |
| 122 | # Quiet mode (errors/warnings only) |
| 123 | auval -q -v aufx <subtype> <manufacturer> |
| 124 | |
| 125 | # Quiet mode suppressing parameter/factory preset info |
| 126 | auval -qp -v aufx <subtype> <manufacturer> |
| 127 | |
| 128 | # Wait after finish (for memory profiling with 'leaks' tool) |
| 129 | auval -w -v aufx <subtype> <manufacturer> |
| 130 | |
| 131 | # Load AudioUnit out-of-process |
| 132 | auval -oop -v aufx <subtype> <manufacturer> |
| 133 | |
| 134 | # Open as component (not plugin) |
| 135 | auval -comp -v aufx <subtype> <manufacturer> |
| 136 | ``` |
| 137 | |
| 138 | ## Strict Options |
| 139 | |
| 140 | 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. |
| 141 | |
| 142 | ```bash |
| 143 | # Enable all strict checks (recommended) |
| 144 | auval -strict -v aufx <subtype> <manufacturer> |
| 145 | |
| 146 | # Individual strict options: |
| 147 | # Enforce AudioUnitScheduleParameter output check (always enforced since Leopard) |
| 148 | auval -strict_SP - |