Files
feedBack-desktop/tests/contracts/addon-exports.json
T
OmikronApexandClaude Fable 5 db337eaf29 fix(audio): serialize chain mutations + chainGeneration (phase 7a)
The single highest-value fix of the TLC pass (deep-read §1): one native
chain-mutation mutex (addon/ChainOps) held across the FULL Execute() of
every chain worker (LoadPreset/LoadVST/LoadNAM/LoadIR/ReplaceIR) and the
synchronous mutators (clearChain/removeProcessor/moveProcessor). Two
overlapping loadPreset calls can no longer interleave clear()/addProcessor()
into a merged-garbage chain — the plugin-vs-plugin fight becomes
last-writer-wins.

chainGeneration (monotonic, bumped under the mutex) is returned in loadPreset
results and exposed as getChainGeneration (new export, snapshot regenerated),
so the audio-effects executor can detect a foreign write invalidated its
stageSlots map and re-sync instead of flipping bypass/params on wrong slots —
the prerequisite for the single-chain-owner ownership track.

Also rides here: LoadPresetWorker's slot-state restore goes through
setSlotState() instead of const_cast (deep-read §9).

The phase-0 storm test flips from expected-fail to a hard gate: 50 iterations
of concurrent loadPreset now always end with exactly one caller's chain.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 01:45:01 +02:00

105 lines
2.0 KiB
JSON

[
"addSource",
"bindInputDevice",
"clearChain",
"clearStreamOutput",
"closePluginEditor",
"detectNotes",
"enableFileLogging",
"getBackingDuration",
"getBackingLevel",
"getBackingPosition",
"getBufferSizes",
"getChainGeneration",
"getChainState",
"getCurrentDevice",
"getDeviceMetrics",
"getDeviceTypes",
"getKnownPlugins",
"getLevels",
"getNoteVerdicts",
"getParameters",
"getPitchDetection",
"getRawAudioFrame",
"getRawPitchDetection",
"getRendererBusMetrics",
"getSampleRate",
"getSampleRates",
"getSourceLevels",
"getSourceNoteVerdicts",
"getSourcePitchDetection",
"getSourceRawAudioFrame",
"getSourceRawPitchDetection",
"getStreamOverflowCount",
"getStreamSinkLevel",
"getStreamUnderflowCount",
"init",
"isAudioRunning",
"isBackingPlaying",
"isMlNoteDetection",
"isMonitorMuted",
"isStreamOutputActive",
"listInputDevices",
"listSources",
"loadBackingTrack",
"loadIR",
"loadNAMModel",
"loadNoteModel",
"loadPluginList",
"loadPreset",
"loadVST",
"moveProcessor",
"openPluginEditor",
"probeDeviceOptions",
"pushRendererAudio",
"removeProcessor",
"removeSource",
"replaceIR",
"resetPeaks",
"savePluginList",
"savePreset",
"scanPlugins",
"scoreChord",
"scoreSourceChord",
"seekBacking",
"sendMidiToSlot",
"setBackingSpeed",
"setBranch",
"setBranchSrc",
"setBypass",
"setChart",
"setCrashedPlugins",
"setDevice",
"setDeviceType",
"setGain",
"setInputChannel",
"setInputDeviceType",
"setMonitorKill",
"setMonitorMute",
"setMonitorMuteSuppressed",
"setMultiBypass",
"setNoiseGate",
"setNoteDetectionEnabled",
"setOutputDeviceType",
"setPan",
"setParameter",
"setPostGain",
"setRendererBus",
"setSlotState",
"setSourceChart",
"setSourceInputChannel",
"setSourceMonitorMute",
"setSourceVerifierOffset",
"setStreamBus",
"setStreamBusGain",
"setStreamOutputDevice",
"setTonePolish",
"setVstCrashSentinelPath",
"shutdown",
"startAudio",
"startBacking",
"stopAudio",
"stopBacking",
"unbindInputDevice"
]