Pulp 1.88.0
Cross-platform audio plugin framework
Loading...
Searching...
No Matches
pulp::format::au::PulpAUMidiProcessor Class Reference

AU v2 adapter for a Pulp Processor whose descriptor declares PluginCategory::MidiEffect — an AU MIDI processor, component type aumi (kAudioUnitType_MIDIProcessor). More...

#include <au_v2_midi_processor.hpp>

Public Member Functions

 PulpAUMidiProcessor (AudioComponentInstance ci)
 PulpAUMidiProcessor (AudioComponentInstance ci, ProcessorFactory factory)
OSStatus GetParameterList (AudioUnitScope inScope, AudioUnitParameterID *outParameterList, UInt32 &outNumParameters) override
OSStatus GetParameterInfo (AudioUnitScope inScope, AudioUnitParameterID inParameterID, AudioUnitParameterInfo &outParameterInfo) override
OSStatus GetParameterValueStrings (AudioUnitScope inScope, AudioUnitParameterID inParameterID, CFArrayRef *outStrings) override
OSStatus GetParameter (AudioUnitParameterID inID, AudioUnitScope inScope, AudioUnitElement inElement, Float32 &outValue) override
OSStatus SetParameter (AudioUnitParameterID inID, AudioUnitScope inScope, AudioUnitElement inElement, Float32 inValue, UInt32 inBufferOffsetInFrames) override
OSStatus GetPropertyInfo (AudioUnitPropertyID inID, AudioUnitScope inScope, AudioUnitElement inElement, UInt32 &outDataSize, bool &outWritable) override
OSStatus GetProperty (AudioUnitPropertyID inID, AudioUnitScope inScope, AudioUnitElement inElement, void *outData) override
OSStatus SetProperty (AudioUnitPropertyID inID, AudioUnitScope inScope, AudioUnitElement inElement, const void *inData, UInt32 inDataSize) override
OSStatus Initialize () override
void Cleanup () override
bool StreamFormatWritable (AudioUnitScope scope, AudioUnitElement element) override
bool CanScheduleParameters () const noexcept override
OSStatus Render (AudioUnitRenderActionFlags &ioActionFlags, const AudioTimeStamp &inTimeStamp, UInt32 inNumberFrames) override
OSStatus GetPresets (CFArrayRef *outData) const override
 kAudioUnitProperty_FactoryPresets — the presets bundled with the plug-in, discovered from its Resources/Presets folder.
OSStatus NewFactoryPresetSet (const AUPreset &inNewFactoryPreset) override
 kAudioUnitProperty_PresentPreset carrying a non-negative preset number.
FactoryPresetTable & factory_preset_table () noexcept
 The factory-preset table this instance serves.
OSStatus SaveState (CFPropertyListRef *outData) override
OSStatus RestoreState (CFPropertyListRef plist) override
Float64 GetLatency () override

Protected Member Functions

void publish_parameter_display_changes ()
 Drain host-facing name changes on the caller's control/main thread.
OSStatus HandleMIDIEvent (UInt8 inStatus, UInt8 inChannel, UInt8 inData1, UInt8 inData2, UInt32 inStartFrame) override
 Every short MIDI message the host delivers (status already split into inStatus / inChannel by AUMIDIBase::MIDIEvent).
OSStatus HandleSysEx (const UInt8 *inData, UInt32 inLength) override
 System-exclusive payload (F0 … F7).

Detailed Description

AU v2 adapter for a Pulp Processor whose descriptor declares PluginCategory::MidiEffect — an AU MIDI processor, component type aumi (kAudioUnitType_MIDIProcessor).

MIDI in, MIDI out, no audio processing.

Base class. MusicDeviceBase (AUBase + AUMIDIBase), the same base the instrument adapter uses. AUMIDIEffectBase is not an option: it derives AUEffectBase, which hardwires one audio input element and one audio output element and pulls the input every render — a MIDI processor has no audio input to pull. MusicDeviceBase also supplies the MIDIEvent / SysEx forwarding into AUMIDIBase and the MIDI-mapping property delegation, which a hand-rolled AUBase + AUMIDIBase pairing would have to restate.

Entry factory. Register through ausdk::AUMIDIEffectFactory (AUMIDILookup = base selectors + MusicDeviceMIDIEvent + MusicDeviceSysEx) via PULP_AU_MIDI_EFFECT. The class implementing HandleMIDIEvent is not enough — a factory only dispatches the selectors its lookup table carries, so the plain AUBaseFactory makes every host MIDI delivery return -4 (unimpErr). AUMusicDeviceFactory would additionally carry StartNote / StopNote, which a MIDI processor is not: AUMIDILookup is the exact selector set.

Element shape. Zero audio input elements and ONE audio output element. The output element carries no musical signal — the render path zeroes it and flags the block silent — but it has to exist: an AU v2 host advances a plugin by rendering it, and rendering is what drains the inbound MIDI queue, runs process(), and delivers the Processor's outbound MIDI through kAudioUnitProperty_MIDIOutputCallback. With no output element there is no bus for the host to pull and the plugin would never run.

MIDI output is definitional here. Unlike the effect adapter — which gates its MIDI-output property surface on descriptor().produces_midi so a plain audio effect never advertises a MIDI output — an aumi always advertises it. A MIDI processor that could not emit MIDI would have no reason to exist, and gating on the flag turns a forgotten produces_midi = true into silently discarded output with no diagnostic.

Constructor & Destructor Documentation

◆ PulpAUMidiProcessor() [1/2]

pulp::format::au::PulpAUMidiProcessor::PulpAUMidiProcessor ( AudioComponentInstance ci)
explicit

◆ PulpAUMidiProcessor() [2/2]

pulp::format::au::PulpAUMidiProcessor::PulpAUMidiProcessor ( AudioComponentInstance ci,
ProcessorFactory factory )

Member Function Documentation

◆ CanScheduleParameters()

bool pulp::format::au::PulpAUMidiProcessor::CanScheduleParameters ( ) const
overridenoexcept

◆ Cleanup()

void pulp::format::au::PulpAUMidiProcessor::Cleanup ( )
override

◆ factory_preset_table()

FactoryPresetTable & pulp::format::au::PulpAUMidiProcessor::factory_preset_table ( )
inlinenoexcept

The factory-preset table this instance serves.

Exposed so a plug-in whose presets live outside the default bundle folder can re-point discovery before the host scans.

◆ GetLatency()

Float64 pulp::format::au::PulpAUMidiProcessor::GetLatency ( )
override

◆ GetParameter()

OSStatus pulp::format::au::PulpAUMidiProcessor::GetParameter ( AudioUnitParameterID inID,
AudioUnitScope inScope,
AudioUnitElement inElement,
Float32 & outValue )
override

◆ GetParameterInfo()

OSStatus pulp::format::au::PulpAUMidiProcessor::GetParameterInfo ( AudioUnitScope inScope,
AudioUnitParameterID inParameterID,
AudioUnitParameterInfo & outParameterInfo )
override

◆ GetParameterList()

OSStatus pulp::format::au::PulpAUMidiProcessor::GetParameterList ( AudioUnitScope inScope,
AudioUnitParameterID * outParameterList,
UInt32 & outNumParameters )
override

◆ GetParameterValueStrings()

OSStatus pulp::format::au::PulpAUMidiProcessor::GetParameterValueStrings ( AudioUnitScope inScope,
AudioUnitParameterID inParameterID,
CFArrayRef * outStrings )
override

◆ GetPresets()

OSStatus pulp::format::au::PulpAUMidiProcessor::GetPresets ( CFArrayRef * outData) const
override

kAudioUnitProperty_FactoryPresets — the presets bundled with the plug-in, discovered from its Resources/Presets folder.

Reports kAudioUnitErr_InvalidProperty when the plug-in ships none, so a host hides the menu rather than showing an empty one.

◆ GetProperty()

OSStatus pulp::format::au::PulpAUMidiProcessor::GetProperty ( AudioUnitPropertyID inID,
AudioUnitScope inScope,
AudioUnitElement inElement,
void * outData )
override

◆ GetPropertyInfo()

OSStatus pulp::format::au::PulpAUMidiProcessor::GetPropertyInfo ( AudioUnitPropertyID inID,
AudioUnitScope inScope,
AudioUnitElement inElement,
UInt32 & outDataSize,
bool & outWritable )
override

◆ HandleMIDIEvent()

OSStatus pulp::format::au::PulpAUMidiProcessor::HandleMIDIEvent ( UInt8 inStatus,
UInt8 inChannel,
UInt8 inData1,
UInt8 inData2,
UInt32 inStartFrame )
overrideprotected

Every short MIDI message the host delivers (status already split into inStatus / inChannel by AUMIDIBase::MIDIEvent).

Overriding here rather than the per-message HandleNoteOn / HandleControlChange hooks is deliberate: a MIDI processor sees the whole stream, and MusicDeviceBase::HandleNoteOn would otherwise route notes into StartNote, which an aumi does not implement.

◆ HandleSysEx()

OSStatus pulp::format::au::PulpAUMidiProcessor::HandleSysEx ( const UInt8 * inData,
UInt32 inLength )
overrideprotected

System-exclusive payload (F0 … F7).

AUMIDIBase::HandleSysEx carries no per-event sample offset at this SDK layer, so the payload is enqueued at sample_offset == 0 — the leading edge of the next rendered block.

◆ Initialize()

OSStatus pulp::format::au::PulpAUMidiProcessor::Initialize ( )
override

◆ NewFactoryPresetSet()

OSStatus pulp::format::au::PulpAUMidiProcessor::NewFactoryPresetSet ( const AUPreset & inNewFactoryPreset)
override

kAudioUnitProperty_PresentPreset carrying a non-negative preset number.

Loads that factory preset into the StateStore, so a host's selection changes what the plug-in sounds like instead of only relabelling the menu.

◆ publish_parameter_display_changes()

void pulp::format::au::PulpAUMidiProcessor::publish_parameter_display_changes ( )
protected

Drain host-facing name changes on the caller's control/main thread.

◆ Render()

OSStatus pulp::format::au::PulpAUMidiProcessor::Render ( AudioUnitRenderActionFlags & ioActionFlags,
const AudioTimeStamp & inTimeStamp,
UInt32 inNumberFrames )
override

◆ RestoreState()

OSStatus pulp::format::au::PulpAUMidiProcessor::RestoreState ( CFPropertyListRef plist)
override

◆ SaveState()

OSStatus pulp::format::au::PulpAUMidiProcessor::SaveState ( CFPropertyListRef * outData)
override

◆ SetParameter()

OSStatus pulp::format::au::PulpAUMidiProcessor::SetParameter ( AudioUnitParameterID inID,
AudioUnitScope inScope,
AudioUnitElement inElement,
Float32 inValue,
UInt32 inBufferOffsetInFrames )
override

◆ SetProperty()

OSStatus pulp::format::au::PulpAUMidiProcessor::SetProperty ( AudioUnitPropertyID inID,
AudioUnitScope inScope,
AudioUnitElement inElement,
const void * inData,
UInt32 inDataSize )
override

◆ StreamFormatWritable()

bool pulp::format::au::PulpAUMidiProcessor::StreamFormatWritable ( AudioUnitScope scope,
AudioUnitElement element )
override

The documentation for this class was generated from the following file: