Skip to content

Anatomy of a plug-in ​

You write one AudioProcessor (the sound) and optionally one AudioProcessorEditor (the window). JUCE compiles a thin wrapper around them for each plug-in format, and the wrapper translates the host's calls into yours.

The moving parts ​

The build produces one shared-code static library containing your processor and editor. It then links that library into one small target per format (see Build systems).[1] This is why a JUCE plug-in project has targets like MyPlugin_VST3, MyPlugin_AU, and MyPlugin_Standalone.

The AudioProcessor contract ​

The method names and their purposes come from AudioProcessor.[2] The "Thread" column is this site's summary of common host behaviour; JUCE does not guarantee it, hence the footnote below the table.

MethodThreadCalled whenYour job
constructormessagethe host instantiates the plug-indeclare buses (BusesProperties) and parameters
prepareToPlay (sampleRate, maxBlockSize)message*before playback, or when the rate or block size changesallocate buffers, reset filters
processBlock (AudioBuffer&, MidiBuffer&)audioevery blockread input, write output, consume and produce MIDI
releaseResources()message*playback stopsfree what prepareToPlay allocated
isBusesLayoutSupported()message*the host proposes a channel layoutaccept or reject mono, stereo, surround…
getStateInformation (MemoryBlock&)message*the host saves a project or presetserialise your state (usually the APVTS ValueTree)
setStateInformation (data, size)message*the host loads a project or presetrestore it
createEditor() / hasEditor()messagethe user opens the plug-in windowreturn a new editor
getName(), acceptsMidi(), getTailLengthSeconds() …anythe host asksdescribe the plug-in

* Usually the message thread, but hosts vary. Treat these as "not the audio thread, but not guaranteed to be the GUI thread either". This is a cautious reading, not a documented guarantee.

A plug-in's life, from the host's point of view ​

The editor is disposable. Hosts open and close the window at will, and some never open it. All state must live in the processor; the editor only displays and edits it.

Parameters ​

Parameters are how the host sees your plug-in's controls: for automation lanes, generic UIs, and control surfaces.

Buses and channels ​

A bus is a group of channels, such as a stereo main input, a mono side-chain, or a 5.1 output. You declare buses in the constructor with BusesProperties. The host negotiates the actual layout via isBusesLayoutSupported(). In processBlock(), the single AudioBuffer holds every channel of every bus; use getBusBuffer() to get the slice for one bus.

Formats at a glance ​

FormatOwnerPlatformsNotes
VST3SteinbergmacOS, Windows, Linux[5]SDK bundled with JUCE[6]
AU (Audio Unit v2)ApplemacOS[1:1]JUCE's docs mention Logic and GarageBand AU compatibility[4:1]
AUv3ApplemacOS, iOSApp extension. Built only with the Xcode generator[1:2]
AAXAvidmacOS, WindowsPro Tools; commercially available Pro Tools needs PACE-signed plug-ins[7]
LV2Open standardnot checkedAuthoring and hosting added in JUCE 7[8]
StandaloneJUCEdesktopYour plug-in in its own app window (StandalonePluginHolder)[9]
UnityUnitynot checkedNative audio plug-in for the Unity game engine[10]
VST (VST2)Steinberg—Legacy. Steinberg discontinued VST 2[11]; JUCE needs you to supply the SDK path

Platforms marked "not checked", and the owner column generally, come from common knowledge of each format rather than a source in this repository.

Hosting other plug-ins ​

The same abstractions work in reverse. AudioPluginFormatManager knows the formats. KnownPluginList and PluginListComponent scan for and list installed plug-ins, and createPluginInstance() gives you an AudioPluginInstance (an AudioProcessor). You can then put it in an AudioProcessorGraph. extras/AudioPluginHost is a complete working example.[12]

Try it ​

  1. Build examples/CMake/AudioPlugin (see Learning path).
  2. Open the Standalone target, then load the VST3 into AudioPluginHost.
  3. Put a breakpoint in prepareToPlay() and processBlock() and watch the order of calls.

Sources ​


  1. docs/CMake API.md, FORMATS: valid values Standalone Unity VST3 AU AUv3 AAX VST LV2; "AU and AUv3 plugins will only be enabled when building on macOS; AUv3 plugins will only be enabled when using the Xcode generator"; one target per format, for example MyPlugin_VST3. ↩︎ ↩︎ ↩︎

  2. juce_AudioProcessor.h: prepareToPlay, processBlock, releaseResources, createEditor, getTailLengthSeconds, getBusBuffer, and the wrapperType_* enum (VST, VST3, AudioUnit, AudioUnitv3, AAX, Standalone, Unity, LV2). ↩︎

  3. juce_AudioProcessorValueTreeState.h. ↩︎

  4. juce_AudioProcessorParameterWithID.h: versionHint "Influences parameter ordering in Audio Unit plugins. Used to provide backwards compatibility of Audio Unit plugins in Logic and GarageBand." ↩︎ ↩︎

  5. CHANGE_LIST.md, Version 6.0.0: "Added VST3 support on Linux"; README.md deployment targets list macOS, Windows, and Linux. ↩︎

  6. CHANGE_LIST.md, Version 8.0.11: "Updated the VST3 SDK to 3.8.0 (MIT license)"; JUCE 8.0.0: "Bundled the AAX SDK". See also the SPDX bill of materials. ↩︎

  7. README.md, "AAX Plug-Ins": AAX plug-ins must be signed with PACE tools "before they will run in commercially available versions of Pro Tools". Avid as the owner of AAX is named in the same section. ↩︎

  8. CHANGE_LIST.md, Version 7.0.0: "Added support for authoring and hosting LV2 plug-ins". ↩︎

  9. juce_StandaloneFilterWindow.h. ↩︎

  10. CHANGE_LIST.md mentions "Unity native plug-in support" (Version 5.4.0); the Unity wrapper type is in juce_AudioProcessor.h. That Unity is a game engine is general knowledge. ↩︎

  11. VST 2 Discontinued, Steinberg Help Center; Steinberg closing down VST2 for good, JUCE Forum; the juce_set_vst2_sdk_path requirement is in docs/CMake API.md. Retrieved 2026-09-29 from search-result summaries; the Steinberg page itself was not opened. ↩︎

  12. extras/AudioPluginHost; the scanning and format classes are in juce_KnownPluginList.h and juce_PluginListComponent.h. ↩︎

Personal study notes on JUCE. Not affiliated with or endorsed by the JUCE team.