AudioParameterHandle default-constructed and used before prepareToPlay | Members and processBlock | Null parameter assertion/crash; wrong smoothing state |
Missing handle.updateNextAudioBlock() | processBlock | Automation and smoothing lag or never update |
Recreating AudioParameterHandle in processBlock | Audio callback | Reinitialises smoothing and may add avoidable work/glitches |
setValueNotifyingHost(), beginChangeGesture(), or endChangeGesture() from audio code | processBlock, MIDI handlers, DSP helpers | Listener/host notification path is not a realtime data path |
Allocating voices, buffers, MemoryBlock, String, std::vector, or smart-pointer objects in processBlock | MIDI note-on, scratch buffers, metering | Heap traffic causes xruns |
YUP_DBG, Logger::writeToLog, File, URL, JSON/XML, or string formatting in audio code | Debug and error paths | Logging/I/O/allocation on audio thread |
| Hard-coded channel pointers without layout checks | getWritePointer(0/1) and bus setup | Mono, sidechain, or unusual host layout crashes/corrupts audio |
Mutating MidiBuffer while iterating it | MIDI loops | Iterator invalidation or unbounded allocation |
prepareToPlay not resetting all DSP and note state | Lifecycle methods | Host reactivation leaves stale filter history, held notes, or ramps |
flush() missing for synths/effects with tails or voices | CLAP reset handling | Host reset leaves hanging notes or stale delay/reverb tails |
| State load/save left unimplemented | loadStateFromMemory, saveStateIntoMemory | DAW session recall and presets fail |
Long work under getProcessLock() or state swaps with no handoff | UI/state/background code | Processing may skip under CLAP try-lock or race under other wrappers |
| Editor stores raw processor-owned UI pointers or processor stores editor pointer | Editor/processor members | Dangling pointer when host closes editor |