Skip to content

Instantly share code, notes, and snippets.

@olilarkin
Last active June 7, 2024 08:57
Show Gist options
  • Save olilarkin/8f378d212b0a59944d84f9f47061d70f to your computer and use it in GitHub Desktop.
Save olilarkin/8f378d212b0a59944d84f9f47061d70f to your computer and use it in GitHub Desktop.
Plugin Dev Notes

VST3

VST3 SDK docs are online here: https://steinbergmedia.github.io/vst3_doc/vstinterfaces/index.html

macOS

Xcode

In order to debug hosts that have been code-signed with the hardened-runtime entitlement, you need to re-sign them. talaviram has made a nice shell script here: https://gist.github.com/talaviram/1f21e141a137744c89e81b58f73e23c3

v2 audiounits

  • Logic X will cache the I/O configuration of a plug-in with its version number, so if you change your AU's channel I/O, you also need to bump the version number for Logic to show it in the correct places (e.g. mono only au on a mono track fx slot)
  • since macOS High Sierra and the APFS filesystem change auval will not detect newly installed (v2) audiounits without a restart. To fix this you can run killall -9 AudioComponentRegistrar to force rescan.
  • /usr/bin/auval is a script which calls the command line app /usr/bin/auvaltool
  • on recent macOS auval cannot be launched from xcode in order to debug a plugin due to System Integrity Protection. Copying /usr/bin/auvaltool elsewhere e.g. ~/auvaltool will allow auval to be launched, as long as "Debug Executable" is unchecked.
  • In order to debug it properly and hit breakpoints, codesign the copied auvaltool with your own Mac Developer ID codesign -fs "Mac Developer" ~/auvaltool
  • auval in recent versions of iterm2 will only show apple's aus, not third party. Disable Prefs > Advanced > Allow sessions to survive logging out and back in, to fix that.
  • running auval with the -comp argument will test using the deprecated component manager entry point, rather than the more recent AUPluginFactory
  • Manufacturer 4Char codes must contain at least one uppercase character

v3 audiounits "Audio Unit Extensions"

  • AUv3s are "app extensions" which behave in a very different way to v2 "components" on macOS. Instead of the binaries living in /Library/Audio/Plug-Ins/Components and ~/Library/Audio/Plug-Ins/Components, they are inside a .app bundle, in the subfolder "Plugins", so when you want to build a plugin, you need also to build a .app, even if that app doesn't do much (it delivers the plugin). This is the same on iOS. The plug-in (.appex) is registered by pluginkit when the parent application launches by double clicking, or running from the Xcode debugger. Once that plug-in has been registered it should show up in auval. You can also check with the pluginkit command line app to see if its registered, and the location of the .app and .appex e.g, to look for the apple example auv3, you can grep the bundle id (pluginkit will show all sorts of app extensions):

oli-mbp:~ oli$ pluginkit -mv | grep com.example.apple-samplecode

com.example.apple-samplecode.AUv3Filter686EDA2T8T.AUv3FilterExtension(1.0) 7A404127-C24B-47F1-A309-55E8E74BBABA 2019-07-23 10:19:00 +0000 /Users/oli/Library/Developer/Xcode/DerivedData/xx/Build/Products/Debug/AUv3Filter.app/Contents/PlugIns/AUv3FilterExtension.appex

  • when you trash the .app, the appex will be unregistered, and after a short while it will no longer appear when running auval

AUM developer Jonatan Liljedahl has some good AUv3 iOS notes here: http://devnotes.kymatica.com

https://developer.apple.com/videos/play/wwdc2015/508/ https://devstreaming-cdn.apple.com/videos/wwdc/2015/508691kyzp/508/508_audio_unit_extensions.pdf?dl=1 https://developer.apple.com/library/archive/documentation/General/Conceptual/ExtensibilityPG/AudioUnit.html https://medium.com/better-programming/create-audio-unit-extension-from-scratch-77abee79d12 https://developer.apple.com/documentation/audiotoolbox/creating_custom_audio_effects https://developer.apple.com/documentation/audiotoolbox/incorporating_audio_effects_and_instruments

@talaviram
Copy link

talaviram commented Jul 25, 2022

In order to debug it properly and hit breakpoints, codesign the copied auvaltool with your own Mac Developer ID codesign -fs "Mac Developer" ~/auvaltool

I suspect this isn't the case anymore with arm64e since re-signing it breaks it. only way is disabling SIP?
edit: it will still be usable as Intel x86_64 under Rosetta2.

@Youlean
Copy link

Youlean commented Nov 5, 2023

Just to add, channel configurations and tags are stored in this file for Logic: ~/Library/Preferences/com.apple.logic10.plist

@Youlean
Copy link

Youlean commented Nov 5, 2023

If you set audio components version number to 0, plugin will always be scanned before launch

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment