mirror of
https://github.com/got-feedBack/feedBack-desktop.git
synced 2026-09-11 01:44:11 +00:00
The old single monitorMuted atomic had five writers fighting last-writer-wins: the settings checkbox, startup restore, the executor's preload read-force-restore, releaseRoute's unconditional setMonitorMute(true) (which clobbered the user's persisted preference), and the renderer's song-load suppression (un-refcounted — overlapping windows un-suppressed each other early). Native arbiter on SourceChain: userMonitorMute (the preference — checkbox + restore only), refcounted monitorMuteHolds (force-mute overrides), and refcounted suppressions (setMonitorMuteSuppressed keeps its bool surface; true=acquire, false=release, clamped at 0). Effective dry-mute = (holds || pref) && chain empty && no suppression — the suppressed-beats-muted precedence is unchanged. New exports: acquire/releaseMonitorMuteHold, getMonitorMuteState (diag); snapshots regenerated. Executor rewrite: acquires a suppression (dry-during-load, the default) or a hold, and releases exactly what it acquired via a single-fire closure that runs UNCONDITIONALLY (each load owns its acquisition — the stale-snapshot race against a mid-hold user toggle is structurally gone). releaseRoute no longer touches mute state at all. The ownership test now pins: preference API never called, acquire/release balanced. Renderer callers are unchanged: the checkbox writes the preference as before, and the song-load suppression sites now compose instead of racing. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
108 lines
2.1 KiB
JSON
108 lines
2.1 KiB
JSON
[
|
|
"acquireMonitorMuteHold",
|
|
"addSource",
|
|
"bindInputDevice",
|
|
"clearChain",
|
|
"clearStreamOutput",
|
|
"closePluginEditor",
|
|
"detectNotes",
|
|
"enableFileLogging",
|
|
"getBackingDuration",
|
|
"getBackingLevel",
|
|
"getBackingPosition",
|
|
"getBufferSizes",
|
|
"getChainGeneration",
|
|
"getChainState",
|
|
"getCurrentDevice",
|
|
"getDeviceMetrics",
|
|
"getDeviceTypes",
|
|
"getKnownPlugins",
|
|
"getLevels",
|
|
"getMonitorMuteState",
|
|
"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",
|
|
"releaseMonitorMuteHold",
|
|
"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"
|
|
]
|