Files
feedBack-desktop/tests/contracts/ipc-channels.json
T
OmikronApexandClaude Fable 5 bb0f79e0be fix(audio): user-stop latch - plugin keep-alives can no longer undo a user stop
Field finding (fix14 test build): nam_tone's 1.5s keep-alive watchdog
calls raw startAudio whenever the engine is not running, restarting it
seconds after the user pressed Stop - and the shim treated any raw start
as user authority, resuming all suspended demands with it.

Per plan 8.3 (user stop always wins) raw start/stop was supposed to be
device-screen-only; now enforced:
- audio:userStartAudio / audio:userStopAudio: explicit user authority.
  Stop sets a latch (+ suspends demands); start clears it (+ resumes).
- raw audio:startAudio is SUPPRESSED while latched (log-once telemetry
  'suppressed-by-user-stop') and no longer resumes demands.
- raw audio:stopAudio no longer suspends demands (it is the transient
  stop the device-apply flow and unmigrated plugins use).
- fresh capture demands born during the latch start suspended, so the
  user start resumes them like pre-existing ones; the demand glue also
  refuses to start the engine while latched.
- device screen (src/renderer/screen.js) toggle + apply flows use the
  user-authority calls.

Contract snapshots regenerated (2 IPC channels, 2 preload keys).

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

124 lines
3.2 KiB
JSON

[
"audio-effects:activateSegment",
"audio-effects:inspectRoute",
"audio-effects:loadChainPlan",
"audio-effects:releaseRoute",
"audio-effects:setRouteGain",
"audio-effects:setStageBypass",
"audio-effects:setStageParameter",
"audio:addSource",
"audio:bindInputDevice",
"audio:clearChain",
"audio:clearStreamOutput",
"audio:closePluginEditor",
"audio:detectNotes",
"audio:getBackingDuration",
"audio:getBackingLevel",
"audio:getBackingPosition",
"audio:getBufferSizes",
"audio:getChainState",
"audio:getCurrentDevice",
"audio:getDeviceMetrics",
"audio:getDeviceTypes",
"audio:getKnownPlugins",
"audio:getLevels",
"audio:getNoteVerdicts",
"audio:getParameters",
"audio:getPitchDetection",
"audio:getRawAudioFrame",
"audio:getRawPitch",
"audio:getRendererBusMetrics",
"audio:getSampleRate",
"audio:getSampleRates",
"audio:getSourceLevels",
"audio:getSourceNoteVerdicts",
"audio:getSourcePitchDetection",
"audio:getSourceRawAudioFrame",
"audio:getSourceRawPitch",
"audio:getStreamOverflowCount",
"audio:getStreamSinkLevel",
"audio:getStreamUnderflowCount",
"audio:isAudioRunning",
"audio:isAvailable",
"audio:isBackingPlaying",
"audio:isMlNoteDetection",
"audio:isMonitorMuted",
"audio:isStreamOutputActive",
"audio:leases:acquire",
"audio:leases:acquireDemand",
"audio:leases:getHolder",
"audio:leases:release",
"audio:leases:releaseDemand",
"audio:leases:snapshot",
"audio:leases:takeover",
"audio:listInputDevices",
"audio:listSources",
"audio:loadBackingTrack",
"audio:loadDeviceSettings",
"audio:loadIR",
"audio:loadNAMModel",
"audio:loadPluginList",
"audio:loadPreset",
"audio:loadVST",
"audio:mixer:listChannels",
"audio:mixer:push",
"audio:mixer:releaseChannel",
"audio:mixer:requestChannel",
"audio:mixer:setChannelGain",
"audio:mixer:setChannelGroup",
"audio:mixer:setChannelMute",
"audio:moveProcessor",
"audio:openPluginEditor",
"audio:probeDeviceOptions",
"audio:pushRendererAudio",
"audio:removeProcessor",
"audio:removeSource",
"audio:replaceIR",
"audio:resetPeaks",
"audio:saveDeviceSettings",
"audio:savePluginList",
"audio:savePreset",
"audio:scanPlugins",
"audio:scoreChord",
"audio:scoreSourceChord",
"audio:seekBacking",
"audio:sendMidiToSlot",
"audio:setBackingSpeed",
"audio:setBranch",
"audio:setBranchSrc",
"audio:setBypass",
"audio:setChart",
"audio:setDevice",
"audio:setDeviceType",
"audio:setGain",
"audio:setInputChannel",
"audio:setMonitorKill",
"audio:setMonitorMute",
"audio:setMonitorMuteSuppressed",
"audio:setMultiBypass",
"audio:setNoiseGate",
"audio:setNoteDetectionEnabled",
"audio:setOutputDeviceType",
"audio:setPan",
"audio:setParameter",
"audio:setPostGain",
"audio:setRendererBus",
"audio:setSlotState",
"audio:setSourceChart",
"audio:setSourceInputChannel",
"audio:setSourceMonitorMute",
"audio:setSourceVerifierOffset",
"audio:setStreamBus",
"audio:setStreamBusGain",
"audio:setStreamOutputDevice",
"audio:setTonePolish",
"audio:startAudio",
"audio:startBacking",
"audio:stopAudio",
"audio:stopBacking",
"audio:unbindInputDevice",
"audio:userStartAudio",
"audio:userStopAudio",
"debug:isEnabled"
]