auv3_wrapper.h
The Audio Unit v3 format wrapper (AUAudioUnit), for macOS and iOS.
#include <sonore/auv3_wrapper.h>- 10types
- 134other declarations
- Guides: Getting started, Platforms and formats
On this page
Design notes
What AUv3 is, next to the AUv2 this SDK already builds
An AUv2 (au_wrapper.h) is a bundle of C functions a host dlopens into its own process. An AUv3 is an Objective-C OBJECT -- a subclass of Apple's AUAudioUnit -- that lives in an app EXTENSION (.appex), shipped inside an ordinary application, and usually runs in a process of its own that the host talks to across the system's audio-unit bridge. It is the only kind of plugin iOS and iPadOS load (GarageBand, AUM, Cubasis, Logic Pro for iPad), and the only kind the Mac App Store accepts. Logic and every other Mac host load both, and auval validates both.
Written against the runtime, as every Apple file here is
The SDK stays plain C++, so there is no .mm file: the AUAudioUnit subclass is REGISTERED at runtime (objc_allocateClassPair), each method a C function with the selector's signature, and every call into a framework class is objc_msgSend through a correctly typed pointer -- exactly what the compiler emits for Objective-C. The blocks AUv3 trades in (the render block, the parameter tree's observers) are built by hand to clang's block ABI (apple_block.h); the blocks a HOST hands over (pull input, musical context, transport, MIDI out) are called through their invoke pointers.
The C structs AUv3 declares only in Objective-C headers -- the render events, the MIDI event list -- are mirrored below with the layout asserted, as window_cocoa.h mirrors CGRect.
What it shares, and what it adds
Include it AFTER clap_wrapper.h (formats.h does, for SONORE_BUILD_AUV3): the DSP instance, parameters, the state blob, presets, the bypass crossfade, the output guard and both editors are the shared Instance's, so an AUv3 saves the same bytes and sounds the same as every other format. The state dictionary is AUv2's ClassInfo layout (type, subtype, manufacturer, version, name, SonoreState), so a preset file reads the same in either.
AUv3 adds what AUv2 never had: parameter changes as timed render events (sample-accurate here when the descriptor asks, PluginDescriptor:: automationGranularity, by the same block splitting CLAP and VST3 use), a begin/end GESTURE for every edit an editor makes, MIDI 2.0 event lists, and the track's name (contextName).
Status
Compiled on Windows against tests/au_shim on every build (the shim's README says what that proves and what it does not). On macOS CI it is built as an .appex inside a container app, registered with pluginkit and validated by auval, and tests/auv3_selftest.cpp drives the class in-process the way a host does. On iOS CI it is built for the simulator and the same self-test runs there. Opened in a real host's window and played from a real keyboard: not yet, by nobody in this loop.
Types 10
AURenderEventHeader: what every render event starts with.
AUParameterEvent, for kEventParameter and kEventParameterRamp.
AUMIDIEvent, for kEventMIDI and kEventMIDISysEx. data is declared three bytes long and runs on for length bytes when the event is a SysEx.
MIDIEventPacket (CoreMIDI, macOS 11 / iOS 14): Universal MIDI Packet words.
MIDIEventList: the packets, back to back.
AUMIDIEventList, for kEventMIDIEventList.
The fields every block starts with (apple_block.h builds whole ones; this is for calling a block somebody else made).
objc_super's layout: the receiver, then the class the method search STARTS at -- the framework class our runtime class extends, named outright. Never object_getClass(self)'s superclass: a key-value observer subclasses the object at runtime, and that superclass is then our own class.
Everything one AUAudioUnit object holds: the shared Instance every format drives, the framework objects the unit publishes (buses, parameter tree, presets), the render block, and the host's blocks for the timeline and MIDI output, copied when render resources are allocated.
Owned by the Objective-C object (an instance variable), created in its initialiser and deleted in its dealloc. Render reads only what allocateRenderResources sized.
Both classes, before NSExtensionMain asks for the principal one.
Functions 104
- fn
template <typename Ret, typename... Args> inline Ret callBlock(void* block, Args... args)Call a block: its invoke function, with the block itself first.auv3::callBlock · auv3_wrapper.h:213 - fn
inline SEL sel(const char* name)auv3::sel · auv3_wrapper.h:251 - fn
template <typename Ret, typename... Args> inline Ret send(id target, const char* selector, Args... args)auv3::send · auv3_wrapper.h:254 - fn
inline id classNamed(const char* name)auv3::classNamed · auv3_wrapper.h:259 - fn
template <typename Ret, typename... Args> inline Ret sendSuper(id self, Class base, const char* selector, Args... args)auv3::sendSuper · auv3_wrapper.h:271 - fn
inline id retain(id o)auv3::retain · auv3_wrapper.h:277 - fn
inline void release(id o)auv3::release · auv3_wrapper.h:278 - fn
inline id string(const char* utf8)An autoreleased NSString, through CF (toll-free bridged).auv3::string · auv3_wrapper.h:283 - fn
inline std::string utf8Of(id str)auv3::utf8Of · auv3_wrapper.h:288 - fn
inline id number(long value)auv3::number · auv3_wrapper.h:295 - fn
inline id array(const id* objects, ObjcUInteger count)auv3::array · auv3_wrapper.h:297 - fn
inline void setError(id* outError, OSStatus status)Writeauv3::setError · auv3_wrapper.h:302statusinto an NSError** the caller may have passed. - fn
inline void announce(id object, const char* key)A key-value notification, both halves: how a host learns a property an AU owns has moved (latency, every parameter at once). [main-thread]auv3::announce · auv3_wrapper.h:311 - fn
inline void onMainThread(void* context, void (*fn)(void*))Runauv3::onMainThread · auv3_wrapper.h:320fn(context)on the main thread, later. libdispatch's C entry points, found by name like every other framework symbol here. - fn
inline bool isMainThread()auv3::isMainThread · auv3_wrapper.h:328 - fn
inline void* copyBlock(void* block)Copy a block a host handed over, so it outlives the call that gave it.auv3::copyBlock · auv3_wrapper.h:335 - fn
inline void releaseBlock(void* block)auv3::releaseBlock · auv3_wrapper.h:340 - fn
inline Unit* unitOf(id self)auv3::unitOf · auv3_wrapper.h:440 - fn
inline uint32_t parameterIndex(id parameter)auv3::parameterIndex · auv3_wrapper.h:446 - fn
inline bool validIndex(uint32_t index)auv3::validIndex · auv3_wrapper.h:450 - fn
inline AudioUnitParameterUnit unitFor(const ParamInfo& p)The unit enum a host draws a parameter with; the same choice AUv2 makes (au_wrapper.h), restated because an iOS build has no AUv2 to borrow from.auv3::unitFor · auv3_wrapper.h:458 - fn
inline uint32_t flagsFor(const ParamInfo& p)AudioUnitParameterOptions, read as AUv2 reads ParamInfo (see au_wrapper.h for why automatable and hidden have no AU spelling).auv3::flagsFor · auv3_wrapper.h:471 - fn
inline bool& publishingHere()Set while this thread is pushing the plugin's own values into its parameters: setValue: calls the observer back synchronously, and the value it hands over may already be older than one the render thread has applied since -- written back, it would undo that one.auv3::publishingHere · auv3_wrapper.h:485 - fn
inline void observeValue(void* block, id parameter, Value value)[any thread] The host, or its generic editor, set a value.auv3::observeValue · auv3_wrapper.h:491 - fn
inline Value provideValue(void* block, id parameter)[any thread] The value the host reads.auv3::provideValue · auv3_wrapper.h:502 - fn
inline id stringFromValue(void* block, id parameter, const Value* value)[any thread] The text a host shows: the same text every format shows.auv3::stringFromValue · auv3_wrapper.h:510 - fn
inline Value valueFromString(void* block, id parameter, id text)[any thread] A value typed into the host's field.auv3::valueFromString · auv3_wrapper.h:521 - fn
inline void buildParameterTree(Unit* unit)The tree, built once at init: one AUParameter per descriptor entry, its address the index, in the descriptor's groups.auv3::buildParameterTree · auv3_wrapper.h:533 - fn
inline void tellHost(Unit* unit, int index, float value, uint32_t eventType)[main-thread] Tell the host one parameter moved because the PLUGIN moved it -- an editor's knob -- with the gesture phase AUv3 lets us say. Through the AUParameter itself, which is what a host's automation records.auv3::tellHost · auv3_wrapper.h:595 - fn
inline void publishParameters(Unit* unit)[main-thread] Every value the plugin moved itself, into its AUParameter, which is what a host reads (see Unit::published). Without an originator, so every observer hears it -- the host's controls and its automation.auv3::publishParameters · auv3_wrapper.h:607 - fn
inline void announceAllParameters(Unit* unit)[main-thread] Every parameter moved at once -- a preset, a restored state -- and the host wrote none of them: each pushed into its AUParameter, and AUv3's one notification for the lot.auv3::announceAllParameters · auv3_wrapper.h:622 - fn
inline id makePreset(ObjcInteger number, const char* name)auv3::makePreset · auv3_wrapper.h:630 - fn
inline void setCurrentPresetObject(Unit* unit, id preset)auv3::setCurrentPresetObject · auv3_wrapper.h:638 - fn
inline void buildFactoryPresets(Unit* unit)auv3::buildFactoryPresets · auv3_wrapper.h:643 - fn
inline bool applyFactoryPreset(Unit* unit, int index)[main-thread] Factory presetauv3::applyFactoryPreset · auv3_wrapper.h:656index, as AUv2's PresentPreset applies one: the whole set in one step, through the bounded helper. - fn
inline CFMutableDictionaryRef buildState(Unit* unit)The state as AUv2's ClassInfo dictionary: the identity fields a host checks, the preset's name, and the same versioned SNRS blob every format writes. CF objects, which ARE the Foundation ones (toll-free bridging).auv3::buildState · auv3_wrapper.h:670 - fn
inline bool applyState(Unit* unit, id state)Apply a dictionary buildState() wrote -- or AUv2's ClassInfo, which is the same layout. Another plugin's dictionary is refused before a byte of it is read, as AUv2 refuses one.auv3::applyState · auv3_wrapper.h:710 - fn
inline void housekeepingTick(CFRunLoopTimerRef, void* info)[main-thread] What render could only record, told to the host: the latency and tail (key-value notifications a host re-reads them on), the output guard's report, and state no parameter carries.auv3::housekeepingTick · auv3_wrapper.h:753 - fn
inline void startHousekeeping(Unit* unit)auv3::startHousekeeping · auv3_wrapper.h:781 - fn
inline void stopHousekeeping(Unit* unit)auv3::stopHousekeeping · auv3_wrapper.h:790 - fn
inline void ownStateLoaded(void* context)The plugin changed its own state from its editor (a preset, an undo).auv3::ownStateLoaded · auv3_wrapper.h:798 - fn
inline void presetSelected(void* context)auv3::presetSelected · auv3_wrapper.h:804 - fn
inline TransportInfo readTransport(const Unit* unit)[audio-thread] The host's timeline, from the two blocks it may have set. Beats are quarter notes, as every other format reads them.auv3::readTransport · auv3_wrapper.h:818 - fn
inline void advanceTransport(TransportInfo& info, uint32_t frames, double sampleRate)auv3::advanceTransport · auv3_wrapper.h:861infomoved on byframes, for a piece that starts later in the block. - fn
inline uint32_t eventOffset(const EventHeader* e, const AudioTimeStamp* timestamp, uint32_t frames)Where in this block an event falls, 0..frames-1.auv3::eventOffset · auv3_wrapper.h:869 - fn
inline bool isParameterEvent(const EventHeader* e)auv3::isParameterEvent · auv3_wrapper.h:881 - fn
inline uint32_t pieceEnd(const EventHeader* e, const AudioTimeStamp* ts, uint32_t frames, uint32_t start, uint32_t granularity)Where the piece starting atauv3::pieceEnd · auv3_wrapper.h:887startends: the next parameter change at leastgranularityframes in, as clapwrap::pieceEnd cuts a CLAP block. - fn
inline void applyEvent(Unit* unit, const EventHeader* e, uint32_t offsetInPiece)[audio-thread] One render event into the block: a parameter written, a MIDI message queued at its offset within the piece.auv3::applyEvent · auv3_wrapper.h:903 - fn
inline void drainUiEvents(Unit* unit)[audio-thread] What the editors queued, applied before the block.auv3::drainUiEvents · auv3_wrapper.h:959 - fn
inline void renderPiece(Unit* unit, float* const* chans, uint32_t nch, float* const* sc, float* const (*aux)[clapwrap::kMaxAudioChannels], uint32_t nAux, const AudioTimeStamp* timestamp, uint32_t start, uint32_t len, const TransportInfo& transportAtBlock)[audio-thread] One piece of the block through the DSP: frames [start, start + len) of every bus, with the MIDI already queued for it.auv3::renderPiece · auv3_wrapper.h:983 - fn
float* const (*aux)[clapwrap::kMaxAudioChannels], uint32_t nAux, const AudioTimeStamp* timestamp, uint32_t start, uint32_t len, const TransportInfo& transportAtBlock)auv3::const · auv3_wrapper.h:984 - fn
inline int32_t render(void* block, AudioUnitRenderActionFlags* flags, const AudioTimeStamp* timestamp, FrameCount frames, ObjcInteger outputBus, AudioBufferList* io, const EventHeader* events, void* pullInput)The render block's invoke function: AUInternalRenderBlock.auv3::render · auv3_wrapper.h:1050 - fn
inline id makeBus(double sampleRate, uint32_t channels, uint32_t maxChannels)A bus atauv3::makeBus · auv3_wrapper.h:1201channelsdeinterleaved floats: AVAudioFormat's standard format. - fn
inline id makeBusArray(id self, ObjcInteger type, const std::vector<id>& buses)auv3::makeBusArray · auv3_wrapper.h:1213 - fn
inline id busAt(id busArray, ObjcUInteger index)auv3::busAt · auv3_wrapper.h:1220 - fn
inline uint32_t busChannels(id bus)auv3::busChannels · auv3_wrapper.h:1225 - fn
inline double busRate(id bus)auv3::busRate · auv3_wrapper.h:1230 - fn
inline Class audioUnitBaseClass()auv3::audioUnitBaseClass · auv3_wrapper.h:1237 - fn
inline id auInit(id self, SEL, AudioComponentDescription desc, uint32_t options, id* outError)-initWithComponentDescription:options:error:auv3::auInit · auv3_wrapper.h:1241 - fn
inline void teardownUnit(void* context)[main-thread] What only the main thread may take down: the clock and an open editor. Then the Unit itself.auv3::teardownUnit · auv3_wrapper.h:1297 - fn
inline void auDealloc(id self, SEL)-dealloc. A host may release its last reference on any thread.auv3::auDealloc · auv3_wrapper.h:1314More
The Unit is taken down only after AUAudioUnit's own dealloc has run: that releases the blocks it made around ours -- the render block it wraps -- and ours live in the Unit, so a Unit already deleted is read there. (The Mac's allocator happened to leave the memory readable; the iOS simulator's had unmapped it, and the self-test crashed in AUEventSchedule's destructor.)
- fn
inline id auInputBusses(id self, SEL)auv3::auInputBusses · auv3_wrapper.h:1351 - fn
inline id auOutputBusses(id self, SEL)auv3::auOutputBusses · auv3_wrapper.h:1356 - fn
inline void* auInternalRenderBlock(id self, SEL)auv3::auInternalRenderBlock · auv3_wrapper.h:1361 - fn
inline BOOL auAllocate(id self, SEL, id* outError)-allocateRenderResourcesAndReturnError:auv3::auAllocate · auv3_wrapper.h:1367 - fn
inline void auDeallocate(id self, SEL)auv3::auDeallocate · auv3_wrapper.h:1425 - fn
inline void auReset(id self, SEL)auv3::auReset · auv3_wrapper.h:1438 - fn
inline id auParameterTree(id self, SEL)auv3::auParameterTree · auv3_wrapper.h:1450 - fn
inline id auFullState(id self, SEL)auv3::auFullState · auv3_wrapper.h:1455 - fn
inline void auSetFullState(id self, SEL, id state)auv3::auSetFullState · auv3_wrapper.h:1462 - fn
inline id auFactoryPresets(id self, SEL)auv3::auFactoryPresets · auv3_wrapper.h:1469 - fn
inline id auCurrentPreset(id self, SEL)auv3::auCurrentPreset · auv3_wrapper.h:1474 - fn
inline void auSetCurrentPreset(id self, SEL, id preset)auv3::auSetCurrentPreset · auv3_wrapper.h:1479 - fn
inline double auLatency(id self, SEL)auv3::auLatency · auv3_wrapper.h:1490 - fn
inline double auTailTime(id self, SEL)auv3::auTailTime · auv3_wrapper.h:1496 - fn
inline id auChannelCapabilities(id, SEL)Pairs of input/output channel counts: N in, N out for every N the DSP handles; an instrument has no input (0).auv3::auChannelCapabilities · auv3_wrapper.h:1504 - fn
inline BOOL auCanProcessInPlace(id, SEL)auv3::auCanProcessInPlace · auv3_wrapper.h:1514 - fn
inline BOOL auShouldBypass(id self, SEL)auv3::auShouldBypass · auv3_wrapper.h:1516 - fn
inline void auSetShouldBypass(id self, SEL, BOOL bypass)The bypass is ours, not the superclass's: the shared crossfade, with the dry path delayed by the latency, as every other format bypasses.auv3::auSetShouldBypass · auv3_wrapper.h:1523 - fn
inline id auMidiOutputNames(id, SEL)auv3::auMidiOutputNames · auv3_wrapper.h:1527 - fn
inline BOOL auProvidesUserInterface(id, SEL)auv3::auProvidesUserInterface · auv3_wrapper.h:1533 - fn
inline BOOL auSupportsMpe(id, SEL)auv3::auSupportsMpe · auv3_wrapper.h:1537 - fn
inline void auSetContextName(id self, SEL, id name)The track's name, which a host sets on the unit: the DSP is told, as every format with a way to say it tells it.auv3::auSetContextName · auv3_wrapper.h:1541 - fn
inline BOOL auShouldChangeToFormat(id self, SEL, id format, id bus)A host proposing a bus format: refused when the DSP cannot run at it, before it is set rather than at allocation.auv3::auShouldChangeToFormat · auv3_wrapper.h:1552 - fn
inline void addOverride(Class cls, Class base, const char* name, IMP imp, const char* fallback)An override, registered with the encoding of the method it replaces.auv3::addOverride · auv3_wrapper.h:1567 - fn
inline Class audioUnitClass()The AUAudioUnit subclass, registered once per image.auv3::audioUnitClass · auv3_wrapper.h:1582 - fn
inline id createUnit(AudioComponentDescription desc, id* outError)Make one unit, as the extension's factory or an in-process host does.auv3::createUnit · auv3_wrapper.h:1626 - fn
inline void editorMessage(Unit* unit, const BridgeMessage& message)[main-thread] A message from the web editor: an edit is told to the host through its AUParameter, with the gesture AUv3 has words for.auv3::editorMessage · auv3_wrapper.h:1642 - fn
inline gfx::EditorHost makeEditorHost(Unit* unit)The native editor's host, with every edit also told to the AU host.auv3::makeEditorHost · auv3_wrapper.h:1694 - fn
inline void editorTick(Unit* unit)[main-thread] The web page's clock: what moved since the page last heard.auv3::editorTick · auv3_wrapper.h:1718 - fn
inline bool openEditor(Unit* unit, id container, uint32_t width, uint32_t height)[main-thread] The editor, intoauv3::openEditor · auv3_wrapper.h:1729container: native or web, by the same choice every format makes. - fn
inline void closeEditor(Unit* unit, id container)auv3::closeEditor · auv3_wrapper.h:1756 - fn
inline id controllerUnit(id controller)auv3::controllerUnit · auv3_wrapper.h:1769 - fn
inline id controllerContainer(id controller)auv3::controllerContainer · auv3_wrapper.h:1775 - fn
inline void editorSize(uint32_t* width, uint32_t* height)auv3::editorSize · auv3_wrapper.h:1781 - fn
inline void attachIfReady(id controller)[main-thread] When both halves exist -- the unit and the view, which a host may ask for in either order -- the editor goes into the view.auv3::attachIfReady · auv3_wrapper.h:1789 - fn
inline void attachOnMain(void* controller)auv3::attachOnMain · auv3_wrapper.h:1800 - fn
inline id vcCreateAudioUnit(id self, SEL, AudioComponentDescription desc, id* outError)-createAudioUnitWithComponentDescription:error: (AUAudioUnitFactory). May be called on any thread; the editor attaches on the main one.auv3::vcCreateAudioUnit · auv3_wrapper.h:1807 - fn
inline void vcLoadView(id self, SEL)-loadView: the container the editor is drawn into.auv3::vcLoadView · auv3_wrapper.h:1819 - fn
inline cocoa::CGSizeStruct vcPreferredContentSize(id, SEL)auv3::vcPreferredContentSize · auv3_wrapper.h:1841 - fn
inline void vcViewDidLayout(id self, SEL selector)-viewDidLayoutSubviews (UIKit) / -viewDidLayout (AppKit): the host resized the editor's view; a native editor lays itself out to it, as a web page does by itself.auv3::vcViewDidLayout · auv3_wrapper.h:1850 - fn
inline void vcDealloc(id self, SEL)auv3::vcDealloc · auv3_wrapper.h:1866 - fn
inline Protocol* factoryProtocol()The protocol the extension point checks its principal class for. Taken from the runtime when a framework registered it; built here when not.auv3::factoryProtocol · auv3_wrapper.h:1879 - fn
inline Class viewControllerClass()The extension's principal class: an AUViewController that is also the unit factory. Its name is the one the Info.plist carries.auv3::viewControllerClass · auv3_wrapper.h:1892
Aliases 11
- using
using Value = floatauv3::Value · auv3_wrapper.h:112 - using
using ParameterAddress = uint64_tauv3::ParameterAddress · auv3_wrapper.h:113 - using
using EventSampleTime = int64_tauv3::EventSampleTime · auv3_wrapper.h:114 - using
using FrameCount = uint32_tauv3::FrameCount · auv3_wrapper.h:115 - using
using ObjcInteger = longauv3::ObjcInteger · auv3_wrapper.h:116 - using
using ObjcUInteger = unsigned longauv3::ObjcUInteger · auv3_wrapper.h:117 - using
using RenderInvoke = int32_t (*)(void* block, AudioUnitRenderActionFlags* actionFlags, const AudioTimeStamp* timestamp, FrameCount frameCount, ObjcInteger outputBusNumber, AudioBufferList* outputData, const EventHeader* realtimeEventListHead, void* pullInputBlock)Block shapes, as clang lays out their invoke functions.auv3::RenderInvoke · auv3_wrapper.h:219 - using
using ValueObserverInvoke = void (*)(void* block, id parameter, Value value)auv3::ValueObserverInvoke · auv3_wrapper.h:223 - using
using ValueProviderInvoke = Value (*)(void* block, id parameter)auv3::ValueProviderInvoke · auv3_wrapper.h:224 - using
using StringFromValueInvoke = id (*)(void* block, id parameter, const Value* value)auv3::StringFromValueInvoke · auv3_wrapper.h:225 - using
using ValueFromStringInvoke = Value (*)(void* block, id parameter, id string)auv3::ValueFromStringInvoke · auv3_wrapper.h:226
Constants 18
- const
constexpr EventSampleTime kEventSampleTimeImmediate = (EventSampleTime) 0xffffffff00000000LLAUEventSampleTimeImmediate: "as soon as possible", plus an offset under 4096 a caller may add. A render list should carry real times, but a host passing this through is not one to crash on.auv3::kEventSampleTimeImmediate · auv3_wrapper.h:122 - const
kEventParameter = 1AURenderEventType.auv3::kEventParameter · auv3_wrapper.h:126 - const
kEventParameterRamp = 2AURenderEventType.auv3::kEventParameterRamp · auv3_wrapper.h:127 - const
kEventMIDI = 8AURenderEventType.auv3::kEventMIDI · auv3_wrapper.h:128 - const
kEventMIDISysEx = 9AURenderEventType.auv3::kEventMIDISysEx · auv3_wrapper.h:129 - const
kEventMIDIEventList = 10AURenderEventType.auv3::kEventMIDIEventList · auv3_wrapper.h:130 - const
kTransportChanged = 1AUHostTransportStateFlags (NSUInteger).auv3::kTransportChanged · auv3_wrapper.h:230 - const
kTransportMoving = 2AUHostTransportStateFlags (NSUInteger).auv3::kTransportMoving · auv3_wrapper.h:231 - const
kTransportRecording = 4AUHostTransportStateFlags (NSUInteger).auv3::kTransportRecording · auv3_wrapper.h:232 - const
kTransportCycling = 8AUHostTransportStateFlags (NSUInteger).auv3::kTransportCycling · auv3_wrapper.h:233 - const
kAutomationValue = 0AUParameterAutomationEventType.auv3::kAutomationValue · auv3_wrapper.h:238 - const
kAutomationTouch = 1AUParameterAutomationEventType.auv3::kAutomationTouch · auv3_wrapper.h:239 - const
kAutomationRelease = 2AUParameterAutomationEventType.auv3::kAutomationRelease · auv3_wrapper.h:240 - const
kBusTypeInput = 1AUAudioUnitBusType.auv3::kBusTypeInput · auv3_wrapper.h:245 - const
kBusTypeOutput = 2AUAudioUnitBusType.auv3::kBusTypeOutput · auv3_wrapper.h:246 - const
constexpr const char* kUnitIvar = "sonoreUnit"The runtime class's instance variable that holds the Unit.auv3::kUnitIvar · auv3_wrapper.h:438 - const
constexpr const char* kControllerUnitIvar = "sonoreAudioUnit"The view controller's own instance variables.auv3::kControllerUnitIvar · auv3_wrapper.h:1766 - const
constexpr const char* kControllerViewIvar = "sonoreContainer"auv3::kControllerViewIvar · auv3_wrapper.h:1767
Macros 1
- macro
#define SONORE_AUV3_FACTORY_CLASS "SonoreAUv3Factory"The class name the extension's Info.plist names as NSExtensionPrincipalClass. It has to be known when the plist is written, so it cannot be made unique per image the way every other runtime class here is: sonore_add_auv3 derives it from the target and passes it in. A build without the helper (a syntax check, a self-test) gets this fallback.auv3_wrapper.h:97