mirror of
https://github.com/got-feedBack/feedBack-desktop.git
synced 2026-07-22 04:41:26 +00:00
* fix(audio-input): stable name-based input identity + fail-loud open + bound read-back
Replace the positional-index logicalSourceKey with a name-encoded one so a
named device survives reorder/hotplug; resolve by name and fail loud instead of
silently opening the default mic; read back and return the actually-bound device.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* perf(audio): gate the ML note-detection pipeline behind a master enable
The Basic-Pitch ONNX detector is the most expensive thing in the engine
(~30 ms inference every hop) and on the default desktop path nothing reads
it: note detection is scored by the harmonic-comb NoteVerifier, and the
always-on home tuner runs its own YIN over raw frames. Yet the pipeline ran
unconditionally from construction, pinning a core on an idle home screen.
Add a master gate so ML only runs when a consumer actually needs it:
- MlNoteDetector: std::atomic<bool> enabled{false}. pushSamples() early-
returns on the audio thread (lock-free relaxed load, no feed) and
runInferenceIfDue() early-returns on the inference thread (no Run()), so
the whole pipeline is dormant until armed. setEnabled(false) clears the
rolling window + published snapshot (clearAudioState resets hasPublished),
so a re-arm starts cold and serves the YIN fallback until the first fresh
inference. The inference thread stays alive but idle — toggling needs no
thread restart. isEnabled() for symmetry; no-op stubs in the ONNX-off build.
- AudioEngine::setMlNoteDetectionEnabled(bool) fans to every source's detector
(whole pool, so a later-activated source inherits the arm state).
- NodeAddon setNoteDetectionEnabled + audio-bridge ipc + preload, all typeof/
try-guarded so a downlevel addon ignores it (fail-safe to current behaviour).
The renderer (note_detect) arms this true only while it will read ML notes
(native-frame detection / non-verifier fallback) and false otherwise — a
follow-up renderer change. Default OFF means the shipped verifier path and
the home tuner pay nothing for ML.
Verified: native addon builds clean (ONNX path); the standalone mlnd_test
detects the full C-major triad when armed (3/3); ml-note-detection +
multi-source JS suites pass (16/16). mlnotedetector/test.cpp arms the
detector after prepare() to match the new default.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* fix(audio): make the ML gate reset race-free (thread-owned cold start)
The first cut cleared the rolling window/FIFO from setEnabled() on the N-API
thread while the inference thread was still alive — a data race on the buffers.
Move the reset onto the thread that owns them, and fix two follow-on issues
Codex flagged:
- fifo.reset() TOCTOU: resetting the FIFO on the inference thread can still race
an in-flight pushSamples() that passed the resetPending gate just before it was
set (the >=8 ms callback gap is not a guarantee). Fix: the thread-side cold
start DRAINS the FIFO (fifo.finishedRead(getNumReady()) — advances only the
consumer's read index, safe SPSC) instead of fifo.reset(). clearAudioState()
(with the real reset) is kept for the prepare()/stop() paths where the thread
is already joined. resetPending stays set through the drain so pushSamples()
is gated off the FIFO the whole time, then is released.
- stale readiness on re-arm: setEnabled(true) exposed enabled=true immediately
while hasPublished stayed true from the previous arm, so isReady() briefly
served the old snapshot. Fix: drop hasPublished synchronously BEFORE storing
enabled=true (release/acquire ordering: isReady() loads enabled before
hasPublished, so seeing enabled=true guarantees seeing hasPublished=false).
Other gate mechanics: the enabled-gate is at the top of the inference callback
(disabled ⇒ no ingest, no inference), pushSamples() no-ops when !enabled or
resetPending, and isReady() gates on enabled so a suspended detector serves the
YIN fallback rather than a stale snapshot.
mlnotedetector/test.cpp asserts both directions: fed the chord region while
DISABLED, the detector publishes nothing and never becomes ready; armed, it
still detects the full C-major triad (3/3). Addon rebuilds clean; tsc clean;
ml-note-detection + multi-source JS suites pass (16/16).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
||
|---|---|---|
| .. | ||
| bench.cpp | ||
| CMakeLists.txt | ||
| test.cpp | ||