v5.2: stability and polish — deep-audit bug fixes + install-flow fixes
Verified findings from a multi-dimension code audit, plus the two install-flow bugs: - Fix Opus encoder use-after-free on a codec/rate change while streaming (guard swap vs encode). - Fix "both" single-file recording dropping audio + drifting (drain both directions in lockstep). - Fix broken clip counter, UPnP teardown on exit, auto-update-restart foreground grant, and a malformed-Opus-format packet orphaning a playout session forever. - Post-install relaunch now respects start-minimised; uninstall is path-aware so it won't clear a different copy's run-at-startup. - Perf/hygiene: cache AppConfig off UI hot paths, fold per-peer EQ+gain into one pass, deterministic disposal (tray menu, timers, COM shortcut, Process handles, process meter), ring-buffer overflow guard, receiver session-lock fix, remote-control allow-list moved onto the UI thread. - Remove dead code (two IsAsioBackend, SessionPlayout.Reset, IsSameEndpoint, RemSoundUpdater IDisposable); several stale-doc fixes. Deferred (not in this release): drift-estimator tweak, peer-discovery pruning, uninstall retry-loop, encryption nonce. Wire format unchanged (interops v3.3-v5.1). Version -> 5.2. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
7038fef67c
commit
2fb9274a95
@@ -16,6 +16,11 @@ internal static class CheckSoundService
|
||||
{
|
||||
private static CuePlayer? checkSound;
|
||||
private static CuePlayer? uncheckSound;
|
||||
// Cached at Reload() so Play() (which fires on the UI thread for every genuine checkbox toggle)
|
||||
// doesn't re-read + re-deserialize the whole config file from disk just to fetch one bool. Reload()
|
||||
// is already the hook that runs whenever cue settings change, so these stay current.
|
||||
private static bool enableCheckboxOn;
|
||||
private static bool enableCheckboxOff;
|
||||
|
||||
/// <summary>When true, <see cref="Play"/> is a no-op. MainForm sets this around bulk programmatic
|
||||
/// control updates (profile load, "uncheck all", device-list refresh). The per-call Focused gate
|
||||
@@ -29,6 +34,8 @@ internal static class CheckSoundService
|
||||
public static void Reload()
|
||||
{
|
||||
var cfg = AppConfig.Load();
|
||||
enableCheckboxOn = cfg.EnableCheckboxOnCue;
|
||||
enableCheckboxOff = cfg.EnableCheckboxOffCue;
|
||||
checkSound = LoadCue(MainForm.CueId.CheckboxOn, "check.wav", cfg);
|
||||
uncheckSound = LoadCue(MainForm.CueId.CheckboxOff, "uncheck.wav", cfg);
|
||||
}
|
||||
@@ -36,9 +43,8 @@ internal static class CheckSoundService
|
||||
public static void Play(bool isChecked)
|
||||
{
|
||||
if (Suppressed) return;
|
||||
var cfg = AppConfig.Load();
|
||||
if (isChecked) { if (cfg.EnableCheckboxOnCue) checkSound?.Play(); }
|
||||
else { if (cfg.EnableCheckboxOffCue) uncheckSound?.Play(); }
|
||||
if (isChecked) { if (enableCheckboxOn) checkSound?.Play(); }
|
||||
else { if (enableCheckboxOff) uncheckSound?.Play(); }
|
||||
}
|
||||
|
||||
private static CuePlayer? LoadCue(string cueId, string defaultFile, AppConfig cfg)
|
||||
|
||||
Reference in New Issue
Block a user